Art von Meta: Erhalten Sie die längste der kürzesten Antworten

14

Ihre Aufgabe - wenn Sie sie akzeptieren - ist es, ein Programm zu schreiben, das hilft, meinen Vorschlag zu Meta zu verstehen, indem Sie den Gewinner eines Wettbewerbs berechnen . Natürlich werden Antworten auf diese Frage wie vorgeschlagen behandelt, sodass Ihr Programm (falls korrekt) berechnen kann, ob Ihre Antwort zur akzeptierten Antwort wird.

Regeln

  • Das Programm liest eine Datei mit mehreren Zeilen des folgenden Formats (siehe Beispiel unten): [Sprache] TAB [NumberOfCharacters] TAB [LinkToAnswer]
  • Der Dateiname wird als Argument an Ihr Programm übergeben oder die Datei wird zur Standardeingabe Ihres Programms umgeleitet. Sie haben die Wahl, bitte geben Sie die Methode an, wenn Sie die Antwort geben
  • Es wird erwartet, dass das Eingabeformat korrekt ist. Es ist keine Fehlerbehandlung erforderlich.
  • Die Anzahl der Zeichen ist positiv. Ihr Programm muss Längen bis zu 65535 verarbeiten können. 64k sollten für jeden ausreichen :-)
  • Das Programm gibt die Zeilen in der Standardausgabe aus, die der Idee des Meta-Vorschlags entsprechen
    • der kürzeste Code einer bestimmten Programmiersprache gewinnt (Reduktionsphase)
    • der längste Code unter allen Programmiersprachen gewinnt (Sortierphase)
    • Im Falle eines Unentschieden werden alle Antworten mit der gleichen Länge gedruckt
  • Die Reihenfolge der Ausgabe ist nicht wichtig
  • Obwohl der längste Code gewinnt, ist dies kein . Ihr Code muss für Ihre Programmiersprache so kurz wie möglich sein.
  • Antworten auf seltene Programmiersprachen, die nicht versuchen, den Code zu verkürzen, verdienen eine Ablehnung, weil sie versuchen, die Absicht dieser Art von Frage zu umgehen. Wenn es nur eine Antwort für eine bestimmte Programmiersprache gibt, wird diese als Gewinnerkandidat gewertet, sodass Sie den Code in die Luft jagen können.

Beispiel-Eingabedatei (durch einzelne Tabulatoren getrennt, falls Probleme mit der Formatierung auftreten sollten):

GolfScript  34  http://short.url/answer/ags
GolfScript  42  http://short.url/answer/gsq
C#  210 http://short.url/answer/cs2
Java    208 http://short.url/answer/jav
C#  208 http://short.url/answer/poi
J   23  http://short.url/answer/jsh
Ruby    67  http://short.url/answer/rub
C#  208 http://short.url/answer/yac
GolfScript  210 http://short.url/answer/210

Erwartete Leistung (Reihenfolge ist nicht wichtig):

C#  208 http://short.url/answer/poi
C#  208 http://short.url/answer/yac
Java    208 http://short.url/answer/jav

Aktualisieren

Einige Programme basieren auf der Tatsache, dass es nur ein einziges Maximum gibt (wie das C # 210-Zeichenprogramm). Aus der Realität abgeleitet kann jemand auch ein GolfScript-Programm mit 210 Zeichen schreiben. Die Ausgabe würde gleich bleiben. Ich habe so ein GolfScript zur Eingabe hinzugefügt.

Update 2

Wie vorgeschlagen, habe ich umgetaggt (auch noch Code-Golf) und die Frist ist der 06.03.2014 (was wie ein willkürliches Datum aussieht, aber ich komme dann von meiner Reise zurück nach Deutschland).

Endgültige Ergebnisse

Ich habe beschlossen, wie folgt abzustimmen:

  • Antworten, bei denen die Anzahl der Zeichen nicht bestätigt werden kann, erhalten einen Kommentar zur Erläuterung der Anzahl.
  • Antworten, die leicht reduziert werden können, erhalten einen Kommentar, einen Bearbeitungsvorschlag und gehen mit dem niedrigeren Zählwert in das Ergebnis ein. (Hoffentlich habe ich das schon mal gesehen).
  • Antworten, die nicht kompiliert werden, erhalten eine negative Bewertung. (Eine ziemlich schwere Aufgabe, wie sich herausstellt).
  • Antworten, die nicht golfen, erhalten eine negative Bewertung (wie bereits in den Regeln beschrieben).
  • Antworten, die zu erwartenden Ergebnissen führen, erhalten eine positive Bewertung. Aufgrund einiger Antworten, die nicht wie erwartet funktionieren, verwende ich 4 verschiedene Eingabedateien und vergleiche sie mit dem erwarteten Ergebnis.

Zum Schluss wird der Gewinner ermittelt, indem die Tabelle mit den qualifizierten Antworten als Eingabe für mein Referenzprogramm bereitgestellt wird (plus manuelle Überprüfung des Ergebnisses). Wenn meine eigene Antwort die beste wäre, würde ich sie von der Liste ausschließen. Bei mehreren Gewinnern müsste ich nur einen auswählen. Daher können einige Boni verdient werden:

  • Antworten, die mehr Eingaben als erwartet akzeptieren (zB außerhalb der definierten Bereiche)
  • Antworten, die eine clevere Idee haben, es kurz zu machen

Ich habe eine Momentaufnahme der Antworten am 6. März 2014, 19:45 UTC + 1, gemacht. Die Analyse ist noch nicht abgeschlossen. Alle Antworten zu überprüfen ist schwieriger als erwartet ...

Thomas Weller
quelle
Sollte dies nicht vorerst als Code-Challenge markiert werden ? Auch wann ist Frist?
TheConstructor
2
Alt-Name dafür ist Code-Blackjack
VoronoiPotato

Antworten:

2

Java - 556

import java.util.*;class G{public static void main(String[]x){TreeMap<?,TreeMap>m=new TreeMap();try{Scanner s=new Scanner(System.in);for(;;){String[]a=s.nextLine().split("\t");a(new Long(a[1]),a(a[0],m)).put(a[2],a);}}catch(Exception e){}TreeMap<?,Map<?,String[]>>n=new TreeMap();for(TreeMap o:m.values())a(o.firstEntry().getKey(),n).putAll((Map)o.firstEntry().getValue());for(String[]o:n.lastEntry().getValue().values())System.out.println(o[0]+"\t"+o[1]+"\t"+o[2]);}static<T>Map a(T t,Map m){if(m.get(t)==null)m.put(t,new TreeMap());return(Map)m.get(t);}}

Das Programm liest aus STDIN.

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

class G {
    public static void main(String[] x) {
        TreeMap<?, TreeMap> m = new TreeMap();
        try {
            Scanner s = new Scanner(System.in);
            for (; ; ) {
                String[] a = s.nextLine().split("\t");
                a(new Long(a[1]), a(a[0], m)).put(a[2], a);
            }
        } catch (Exception e) {
        }
        TreeMap<?, Map<?, String[]>> n = new TreeMap();
        for (TreeMap o : m.values())
            a(o.firstEntry().getKey(), n).putAll((Map) o.firstEntry().getValue());
        for (String[] o : n.lastEntry().getValue().values())
            System.out.println(o[0] + "\t" + o[1] + "\t" + o[2]);
    }

    static <T> Map a(T t, Map m) {
        if (m.get(t) == null)
            m.put(t, new TreeMap());
        return (Map) m.get(t);
    }
}
  1. Das Programm liest Zeile für Zeile, bis eine Ausnahme auftritt (entweder ArrayIndexOutOfBoundsExceptionwenn eine leere Zeile auftritt oder NoSuchElementExceptionwenn die Eingabe endet, ohne dass eine neue Zeile nachgestellt wird). Jede gelesene Zeile wird der Zeile hinzugefügt, die wie folgt TreeMap mdefiniert sein könnte TreeMap<String, TreeMap<Long, TreeMap<String,String[]>>>(von links nach rechts: Sprache, Codegröße, URL, Eingabe).
  2. Anschließend wird ein Ergebnis TreeSet<Long, TreeSet<String, String[]>> n(von links nach rechts: Codegröße, URL, Eingabe) erstellt, in dem der Inhalt aller Sprachen firstEntry()zusammengefasst wird.
  3. lastEntry()der aggregierte TreeMapenthält unser ergebnis - wir müssen es nur drucken.

Versuchen Sie es auf ideone.com (die letzten beiden Eingabezeilen wurden umgeschaltet, um zu zeigen, dass alle Zeilen gelesen wurden)

DerKonstruktor
quelle
Musste eine Variable hinzufügen, um
BufferedReader -.-
1
Vielleicht gewinnt Java dieses Mal, weil es kein var-Schlüsselwort hat ...
Thomas Weller
@ThomasW. habe gerade gemerkt, dass ich in der Golfversion ein paar unnötige {} zurückgelassen habe -.-
TheConstructor
Auch gerade relaized verwendete ich Integer. Während int kürzer als long ist, sollte Integer Shurely um 14:52 auf Long -.-
TheConstructor
2

Perl, 195 Bytes

while(<>){/(\S+)\t(\d+)\t(.+)/;push@{$a{$1}},$3if$2==$l{$1};$l{$1}=$2,$a{$1}=[$3]if $2<($l{$1}//65536)}$m=(sort{$b<=>$a}values%l)[0];map{$l=$_;map{print"$l\t$m\t$_\n"if$l{$l}==$m}@{$a{$l}}}keys%l

Eingabe wird in STDIN erwartet, Ergebnis wird in STDOUT geschrieben:

C#      208     http://short.url/answer/poi
C#      208     http://short.url/answer/yac
Java    208     http://short.url/answer/jav

Ungolfed-Version

#!/usr/bin/env perl
use strict;
$^W=1;

# hash %language remembers the minimum count for a language
# %language: <language> => <minimum count>
my %language;
# hash %array remembers the URLs for the minimum count of the language
# %array: <language> => [<url>, <url>, ....]
my %array;

while(<>){
    # parse input line (no error checking)
    /(\S+)\t(\d+)\t(.+)/;
    my ($lang, $count, $url) = ($1, $2, $3);
    # add URL, if the count is the current minimum for the language
    if ($count == ($language{$lang}//0)) {
    # better, but longer version:
    # if (defined $language{$lang} and $count == $language{$lang}) {
        push @{$array{$lang}}, $url;
    }
    # create a new entry for the language, if there is a new minimum
    if ($count < ($language{$lang}//65536)) {
    # better, but longer version:
    # if (not defined $language{$lang} or $count < $language{$lang}) {
        $language{$lang} = $count;
        $array{$lang} = [$url];   
    }
}

# Sort the minimal values in numerical descending order and
# get the first entry as maximum.
my $maximum = (sort { $b <=> $a } values %language)[0];

# Loop over all URLs of minimal answers for the language,
# but print only the entries for the languages with the largest
# minima.
foreach my $lang (keys %language) {
    foreach my $url (@{$array{$lang}}) {
        if ($language{$lang} == $maximum) {
            print "$lang\t$maximum\t$url\n";
        }
    }
}
__END__
Heiko Oberdiek
quelle
Heiko, wie @grovesNL hervorhob, könnten einige Programme auf der Tatsache beruhen, dass es ein einziges Maximum gibt. Vielleicht können Sie überprüfen, ob Ihr Programm betroffen ist. Fügen Sie einfach eine GolfScript 210 http://short.url/answer/210Zeile zur Eingabe hinzu und prüfen Sie, ob die Ausgabe dieselbe bleibt. Eigentlich glaube ich, dass Ihre nicht betroffen sind, weil Sie maximal [0] verwenden, aber ich habe momentan kein Perl, um es zu versuchen.
Thomas Weller
@ThomasW .: Es ist nicht betroffen. Ich habe die Zeile hinzugefügt und die Ausgabe bleibt gleich. Nach dem ersten Teil, der die Datei liest, enthält die Datenstruktur %l/ %languagedie Sprachen und ihre Minimalwerte. Die Datenstruktur %a/ %arrayenthält nur die Sprach- / URL-Paare, deren Wert das Minimum für diese Sprache ist. Dann werden die Minimalwerte in absteigender Reihenfolge sortiert und der erste wird als globales Maximum und als Filterbedingung für %a/ verwendet %array.
Heiko Oberdiek
2

Python 378 377 372

import sys
d=__import__("collections").defaultdict(list)
o={}
x=int
n="\n"
for i,l,u in[a.split()for a in sys.stdin.read().strip().split(n)]:d[i]+=[(l,u)]
for e,b in d.items():o[e]=[i for i in b if i[0]==str(min([x(i[0])for i in b]))]
print("".join(n.join("\t".join([u,s[0],s[1]])for s in y if x(s[0])==max(x(i[0][0])for i in o.values()))+n for u,y in o.items()).strip())

Eingabe am stdin:

C:\Users\gcq\Documents\python>type m.txt | python test.py
C#      208     http://short.url/answer/poi
C#      208     http://short.url/answer/yac
Java    208     http://short.url/answer/jav

Und das ist, was ich hatte, bevor ich anfing, es mit 551 Zeichen zu komprimieren:

from collections import defaultdict
import sys
d = defaultdict(list)

for language, length, url in [a.split() for a in sys.stdin.read().strip().split("\n")]:
    d[language].append((length, url))

o = {}
for language, data in d.items():
    winval = data[0][0]
    for i in data:
        if int(i[0]) < int(winval):
            winval = i[0]
    o[language] = [i for i in data if i[0] == winval]

maxlen = max(int(i[0][0]) for i in o.values())

for language, dataa in o.items():
    for data in dataa:
        if int(data[0]) == maxlen:
            print("\t".join([language, data[0], data[1]]))
gcq
quelle
1

C # - 628

Hier ist eine längere Alternative von Ihnen, die Folgendes verwendet DataTable:

using Microsoft.VisualBasic.FileIO;namespace System{using T=Data.DataTable;using R=Data.DataRow;using V=Data.DataView;using C=Data.DataColumn;class p{static void Main(string[] a){var I=typeof(Int32);T t=new T();t.Columns.AddRange(new[]{new C("a"),new C("b",I),new C("c"),new C("d",I)});var f=new TextFieldParser(a[0]);f.SetDelimiters("\t");while(!f.EndOfData){var r=t.NewRow();r.ItemArray=f.ReadFields();t.Rows.Add(r);}foreach(R r in t.Rows){r[3]=t.Compute("min(b)","a='"+r[0]+"'");}V v=new V(t);T s=v.ToTable();foreach(R r in s.Select("b='"+t.Compute("max(d)","")+"'")){Console.WriteLine(String.Join("\t",r[0],r[1],r[2]));}}}}

Ursprünglich dachte ich, ich hätte durch die Verwendung von max / min etwas weniger Code erhalten DataTable, aber die zum Erstellen der DataTable(Zeilen / Spalten / Ansicht) erforderlichen Typen sind leider sehr lang. Ich bin neu im Code-Golfen, also könnte es vielleicht jemand weiter reduzieren. Immer noch eine lustige Herausforderung.

HainenNL
quelle
1

dg - 286 281 260 251 218 Bytes

import '/sys'
d=dict!
for(a,b,c)in(map str.split$(sys.stdin.read!).splitlines!)=>d!!a=(d.get a list!)+(list'(int b,c))
for(i,l)in(d.items!)=>for(s,u)in l=>s==(max$map(i->fst$min i)d.values!)=>print$i+' '+(str s)+' '+u

Beispiel:

$ cat langs.txt | dg langs.dg 
C# 208 http://short.url/answer/poi
C# 208 http://short.url/answer/yac
Java 208 http://short.url/answer/jav

Ungolfed- Version:

import '/sys'

s = sys.stdin.read!
d = dict!
# convert the string into a list of tuples (name, score, url)
u = map str.split $ s.splitlines!
# add all the values to the dict (converting the score to an integer)
for (a, b, c) in u =>
  d!!a = (d.get a list!) + (list' (int b, c))
# computes the maximum value amongst the mins
m = max $ map (i -> fst $ min i) d.values!
for (i, l) in (d.items!) =>
  for (s, u) in l =>
    # if the score equals the maximum then print all the line
    s == m => print $ i + ' ' + (str s) + ' ' + u  # actually here .format()
                                                   # would be better

F: Was zum Teufel ist dg?
A: Eine Programmiersprache, die sich zu CPython-Bytecode kompilieren lässt, ähnlich wie Scala zu JVMs. Dies bedeutet im Wesentlichen, dass dg eine alternative Syntax für Python 3 ist. Damit können Sie auch alle vorhandenen Bibliotheken verwenden.

Mehr Infos hier (sogar ein Tutorial!): Https://pyos.github.io/dg

rubik
quelle
Wenn ich das in eine Datei lege, hat sie nur 217 Bytes (Linux-Zeilenenden)
Thomas Weller
@ThomasW. Seltsam! Mit cat langs.dg | wc -cbekomme ich 218!
Rubik
Vielleicht nachgestellte Newline oder keine nachgestellte Newline?
TheConstructor
@TheConstructor könnte es sein, obwohl es nicht mit einer Newline oO speichern sollte
rubik
1

Rebol - 314

d: map[]foreach r read/lines to-file system/script/args[r: split r tab p: take r r/1: to-integer r/1 r/2: reduce[r/2]either none? d/:p[repend d[p r]][case[d/:p/1 > r/1[d/:p: r]d/:p/1 = r/1[append d/:p/2 r/2]]]]l: 0 foreach[k v]d[l: max l v/1]foreach[k v]d[if l = v/1[foreach n v/2[print rejoin[k tab v/1 tab n]]]]

ungegolft

d: map []

foreach r read/lines to-file system/script/args [
    r: split r tab
    p: take r
    r/1: to-integer r/1
    r/2: reduce [r/2]
    either none? d/:p [repend d [p r]] [
        case [
            d/:p/1 > r/1 [d/:p: r]
            d/:p/1 = r/1 [append d/:p/2 r/2]
        ]
    ]
]

l: 0 foreach [k v] d [l: max l v/1]
foreach [k v] d [
    if l = v/1 [
        foreach n v/2 [print rejoin [k tab v/1 tab n]]
    ]
]

Anwendungsbeispiel:

$ rebol script.reb data.txt
C#    208   http://short.url/answer/poi
C#    208   http://short.url/answer/yac
Java  208   http://short.url/answer/jav
draegtun
quelle
0

C # - 515

Erwartet einen Dateinamen als Argument

using System.Collections.Generic;namespace N{using S=SortedList<int,T>;class T:List<string>{static void Main(string[]a){var d=new Dictionary<string,S>();int n,m=0;T w=new T();foreach(var l in System.IO.File.ReadAllLines(a[0])){var p=(a=l.Split('\t'))[0];n=int.Parse(a[1]);if(!d.ContainsKey(p))d.Add(p,new S());if(!d[p].ContainsKey(n))d[p].Add(n,new T());d[p][n].Add(l);}foreach(var e in d){n=e.Value.Keys[0];if(n==m)w.AddRange(e.Value[n]);if(n>m)w=e.Value[m=n];}foreach(var e in w)System.Console.WriteLine(e);}}}

Zuerst habe ich mein C # -Programm so entworfen, dass es einfach ist, weil ich eine Art Referenzprogramm haben wollte. Aber dann habe ich mich entschlossen, auch selbst an Wettbewerben teilzunehmen und Golf zu spielen. Dies ist eine der früheren Versionen des Codes + einige Kommentare:

// N: namespace
// P: Program
// S: type definition: sorted dictionary
// a: arguments
// d: data container
// r: lines read from text file
// l: single line from r
// t: tabbed part of l after splitting
// p: programming language name
// n: character count
// m: maximum character count
// w: list of winners
// e: entry in data container
// c: winner candidate
using System.Collections.Generic;
namespace N
{
    using S = SortedList<int, P>;
    public class P : List<string>
    {
        public static void Main(string[] a)
        {
            var r = System.IO.File.ReadAllLines(a[0]);
            // Make it a data structure
            var d = new Dictionary<string, S>();
            foreach (var l in r)
            {
                var t = l.Split('\t');
                var p = t[0];
                var n = int.Parse(t[1]);
                if (!d.ContainsKey(p)) d.Add(p, new S());
                if (!d[p].ContainsKey(n)) d[p].Add(n, new P());
                d[p][n].Add(l);
            }
            // Get the maximum values
            var m = 0;
            P w = null;
            foreach (var e in d)
            {
                foreach (var s in e.Value.Keys)
                {
                    if (s > m)
                    {
                        w = e.Value[s];
                        m = s;
                    }
                    else if (s == m)
                    {
                        w.AddRange(e.Value[s]);
                    }
                    break; // Break here to get the shortest solution per language
                }
            }
            // Print everything on console
            foreach (var e in w)
            {
                System.Console.WriteLine(e);
            }
        }
    }
}
Thomas Weller
quelle
Es scheint, dass die Dateigröße von 515 auf meiner Festplatte eine Bytereihenfolge enthält. Kopieren / Einfügen von hier ist nur 512 Bytes.
Thomas Weller
0

C # - 460 359

Nachdem DataTableich festgestellt hatte , wie umfangreich meine Lösung war, erstellte ich das folgende Beispiel mit Linq. Es verwendet die gleiche Methode wie meine vorherige Lösung.

Golf gespielt

namespace System{using Linq;using IO;class p{static void Main(string[]i){var l=(from f in File.ReadAllLines(i[0])let s=f.Split('\t')select new Tuple<string,int,string>(s[0],Convert.ToInt16(s[1]),f)).ToList();foreach(var f in l.Where(a=>a.Item2==l.Where(b=>b.Item1==l.Single(c=>c.Item2==l.Max(d=>d.Item2)).Item1).Min(e=>e.Item2)))Console.WriteLine(f.Item3);}}}

Ungolfed

namespace System
{
    using Linq;
    using IO;
    class p
    {
        static void Main(string[]i)
        {
            var l=(from f in File.ReadAllLines(i[0])
                   let s=f.Split('\t')
                   select new Tuple<string, int, string>(s[0],Convert.ToInt16(s[1]),f)).ToList();
            foreach(var f in l.
                Where(a=>a.Item2==l.
                    Where(b=>b.Item1==l.
                        Single(c=>c.Item2==l.
                            Max(d=>d.Item2)).Item1).
                                Min(e=>e.Item2)))
            Console.WriteLine(f.Item3);
        }
    }
}

Ich bin noch ziemlich neu in Linq, daher bin ich mir fast sicher, dass diese Ausdrücke weiter reduziert werden können.

Aus Ihrer Frage geht nicht hervor, ob es eine einzige Lösung mit maximaler Länge gibt. Für meine Antworten habe ich die Annahme verwendet, dass es einen einzelnen Maximalpunkt gibt (dh, wenn es auch ein GolfScript-Maximum von 210 gab, kann es aufgrund des zurückgegebenen einzelnen Maximalwerts fehlschlagen). Heikos Lösung hätte das gleiche Problem. Um dies zu beheben, müssten wir einen weiteren Schritt hinzufügen, der eine Liste gebundener Maxima enthält, um die Minima für jede Sprache zu überprüfen.

HainenNL
quelle
1
Mir scheint, Sie könnten f als Item3 (anstelle von s [2]) speichern und dann f.Item3 in die Konsole schreiben, ohne Item1 und Item2 neu kombinieren zu müssen.
Thomas Weller
Vielen Dank für die Klärung der Anforderungen. Abgeleitet von der Realität würde ich sagen, dass es passieren kann, dass jemand (unerfahren, offensichtlich) ein GolfScript mit 210 Zeichen schreibt.
Thomas Weller
1
Wenn Sie die erste foreach-Schleife in LINQ konvertieren, wird sie noch kürzer:namespace System{using Linq;using IO;class p{static void Main(string[]i){var l=(from f in File.ReadAllLines(i[0])let s=f.Split('\t') select new Tuple<string, int, string>(s[0],Convert.ToInt16(s[1]),f)).ToList();foreach(var f in l.Where(a=>a.Item2==l.Where(b=>b.Item1==l.Single(c=>c.Item2==l.Max(d=>d.Item2)).Item1).Min(e=>e.Item2)))Console.WriteLine(f.Item3);}}}
Thomas Weller,
@ThomasW .: Gute Idee für den Split. Vielen Dank für die foreach-Schleifenumwandlung, ich hatte darüber nachgedacht, diese ursprünglich hinzuzufügen, aber ich wusste nicht, dass ich sie so verwenden könnte.
HainenNL
Ich denke , ich beginne zu verstehen , was Ihre Abfrage nicht :) und es wird auch für eine einfachere Eingabe wie folgt ausfallen: Golfscript 100 ..., C# 1 ..., C# 200 .... Dies muss wahrscheinlich überarbeitet werden
Thomas Weller
0

C ++ - 535

Gibt nur die Antworten für die längste Position aus, nachdem nur die kürzesten Antworten jeder Sprache als potenzielle Gewinner ausgewählt wurden.

#include<fstream>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){

    string s;
    vector<string>l;
    vector<int>v;
    vector<string>u;
    cin>>s;

    ifstream i(s.c_str());

    do{
        int n;
        i>>s;
        if(i.eof())break;
        l.push_back(s);
        i>>n;
        v.push_back(n);
        i>>s;
        u.push_back(s);
    }while(1);

    for(int i=0;i<l.size();i++){
        for(int j=0;j<l.size();j++){
            if(l[j]==l[i]){
                if(v[i]>v[j])l[i]="";
                else if(v[i]<v[j])l[j]="";
            }
        }
    }
    int n=0;
    for(int i=0;i<v.size();i++)
        if(n<v[i]&l[i]!="")n=v[i];

    for(int i=0;i<v.size();i++)
        if(v[i]==n)cout<<l[i]<<'\t'<<v[i]<<'\t'<<u[i]<<endl;
}

Golf (nicht so unleserlich wie manche Sprachen):

#include<fstream>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){string s;vector<string>l;vector<int>v;vector<string>u;cin>>s;ifstream i(s.c_str());do{int n;i>>s;if(i.eof())break;l.push_back(s);i>>n;v.push_back(n);i>>s;u.push_back(s);}while(1);for(int i=0;i<l.size();i++)for(int j=0;j<l.size();j++)if(l[j]==l[i]){if(v[i]>v[j])l[i]="";else if(v[i]<v[j])l[j]="";}int n=0;for(int i=0;i<v.size();i++)if(n<v[i]&l[i]!="")n=v[i];for(int i=0;i<v.size();i++)if(v[i]==n)cout<<l[i]<<'\t'<<v[i]<<'\t'<<u[i]<<endl;}
Hosch250
quelle
Haben Sie Ihre Ausgabe mit der erwarteten Ausgabe verglichen? Bei 8 Eingabezeilen werden nur 3 Zeilen als Ausgabe ausgegeben. Ihr Programm scheint alles auszugeben.
Thomas Weller
@ThomasW. Oh, ich habe diesen Teil falsch verstanden. Ich werde es vorerst entfernen.
Hosch250
@ThomasW. Sieht das richtig aus?
Hosch250
Wenn ich das in eine Datei lege, erhalte ich 540 Bytes, nicht 535. Könnten Sie bitte die Länge überprüfen?
Thomas Weller
Es sind 535 Zeichen. Wir haben beide recht. Ich kann es ändern, wenn du willst.
Hosch250