Rodzaj meta: uzyskaj najdłuższą z najkrótszych odpowiedzi

14

Twoim zadaniem - jeśli je zaakceptujesz - jest napisanie programu, który pomoże zrozumieć moją propozycję dotyczącą meta , obliczając zwycięzcę zawodów z . Oczywiście odpowiedzi na to pytanie będą traktowane jak zaproponowane, więc twój program (jeśli jest poprawny) może obliczyć, czy twoja odpowiedź stanie się odpowiedzią zaakceptowaną.

Zasady

  • Program odczytuje plik z wieloma wierszami o następującym formacie (patrz przykład poniżej): [Język] TAB [NumberOfCharacters] TAB [LinkToAnswer]
  • Nazwa pliku jest przekazywana jako argument do programu lub plik jest przekierowywany na standardowe wejście programu. To twój wybór, proszę podać metodę, podając odpowiedź
  • Oczekuje się, że format wejściowy jest prawidłowy. Nie ma potrzeby obsługi błędów.
  • Liczba znaków jest dodatnia. Twój program musi obsługiwać długości do 65535. 64k powinno wystarczyć wszystkim :-)
  • Program wypisuje te wiersze na standardowe wyjście, które spełniają ideę meta propozycji, to znaczy
    • wygrywa najkrótszy kod danego języka programowania (faza redukcji)
    • najdłuższy kod spośród wszystkich języków programowania wygrywa (faza sortowania)
    • w przypadku losowania należy wydrukować wszystkie odpowiedzi o tej samej długości
  • Kolejność danych wyjściowych nie jest ważna
  • Chociaż wygrywa najdłuższy kod, nie jest to . Twój kod musi być jak najkrótszy dla twojego języka programowania.
  • Odpowiedzi na rzadkie języki programowania, które nie próbują skrócić kodu, zasługują na negatywną opinię, ponieważ próbują ominąć intencję tego rodzaju pytań. Jeśli jest tylko jedna odpowiedź dla określonego języka programowania, zostanie uznana za kandydata na zwycięzcę, więc możesz zacząć wysadzać jego kod.

Przykładowy plik wejściowy (oddzielony pojedynczymi kartami, jeśli wystąpi problem z formatowaniem):

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

Oczekiwany wynik (kolejność nie jest ważna):

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

Aktualizacja

Niektóre programy polegają na tym, że istnieje jedno maksimum (jak program znaków C # 210). Pochodzący z rzeczywistości, ktoś może również napisać program GolfScript zawierający 210 znaków. Dane wyjściowe pozostaną takie same. Dodałem taki kod GolfScript do danych wejściowych.

Aktualizacja 2

Jak zasugerowałem, dokonałem ponownej tagacji (również wciąż golfa kodowego), a termin upływa 2014-03-06 (który wygląda jak dowolna data, ale wrócę wtedy do Niemiec z podróży).

Ostateczne rezultaty

Postanowiłem głosować w następujący sposób:

  • Odpowiedzi, w przypadku których nie można potwierdzić liczby znaków, zawierają komentarz wyjaśniający liczbę.
  • Odpowiedzi, które można łatwo zmniejszyć, otrzymują komentarz, sugestię edycji i przechodzą do wyniku o niższej wartości zliczania. (Mam nadzieję, że widziałem to wcześniej).
  • Odpowiedzi, które się nie kompilują, otrzymują opinię negatywną. (Jak się okazuje dość trudne).
  • Odpowiedzi, które nie są rozgrywane w golfa, otrzymują ocenę negatywną (jak opisano już w zasadach).
  • Odpowiedzi, które przynoszą oczekiwany wynik, otrzymują opinię pozytywną. Ze względu na niektóre odpowiedzi, które nie działają zgodnie z oczekiwaniami, używam 4 różnych plików wejściowych i sprawdzam pod kątem oczekiwanego wyniku.

Ostatecznie zwycięzca jest określany poprzez dostarczenie tabeli kwalifikujących się odpowiedzi jako danych wejściowych do mojego programu referencyjnego (oraz dwukrotne ręczne sprawdzenie wyniku). Jeśli moja własna odpowiedź byłaby zwycięska, wykluczyłbym ją z listy. W przypadku kilku zwycięzców musiałbym wybrać tylko jednego. Dlatego niektóre bonusy można zdobyć:

  • odpowiedzi, które akceptują więcej danych wejściowych niż oczekiwano (np. poza zdefiniowanymi zakresami)
  • odpowiedzi, które wykorzystują sprytny pomysł skrócenia

Zrobiłem migawkę odpowiedzi 6 marca 2014 r., 19:45 UTC + 1. Analiza jest w toku. Sprawdzanie wszystkich odpowiedzi jest trudniejsze niż oczekiwano ...

Thomas Weller
źródło
Czy nie powinno to być na razie oznaczanie kodu jako wyzwanie ? Również kiedy jest termin?
TheConstructor
2
Alternatywna nazwa to Code-Blackjack
VoronoiPotato

Odpowiedzi:

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);}}

Program odczyta ze 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. Programm będzie czytał wiersz po wierszu, dopóki nie wystąpi wyjątek (albo ArrayIndexOutOfBoundsException przypadku napotkania pustej linii, albo NoSuchElementExceptiongdy wejście zakończy się bez kończenia nowej linii). Każdy odczytany wiersz jest dodawany do TreeMap m, który mógł być zdefiniowany jako TreeMap<String, TreeMap<Long, TreeMap<String,String[]>>>(od lewej do prawej: język, rozmiar kodu, adres URL, dane wejściowe).
  2. Następnie tworzony jest wynik TreeSet<Long, TreeSet<String, String[]>> n(od lewej do prawej: rozmiar kodu, adres URL, dane wejściowe), w którym zawartość wszystkich języków firstEntry()jest agregowana.
  3. lastEntry() zagregowanych TreeMap zawiera nasz wynik - wystarczy go wydrukować.

Spróbuj na ideone.com (przełączone dwa ostatnie wiersze wprowadzania, aby pokazać, że wszystkie wiersze zostały odczytane)

TheConstructor
źródło
Musiałem dodać zmienną do przechowywania BufferedReader -.-
TheConstructor
1
Może tym razem Java wygrywa, ponieważ nie ma słowa kluczowego var ...
Thomas Weller
@ThomasW. właśnie zdałem sobie sprawę, że zostawiłem trochę niepotrzebnych {} w wersji
golfowej
Właśnie poinformowałem, że korzystam z Integer. Podczas gdy int jest krótszy niż długi, Integer z pewnością powinien zagrać w golfa w Long -.-
TheConstructor
2

Perl, 195 bajtów

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

Dane wejściowe są oczekiwane w STDIN, wynik zapisywany jest do STDOUT:

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

Wersja bez golfa

#!/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
źródło
Heiko, jak zauważył @grovesNL, niektóre programy mogą polegać na tym, że istnieje jedno maksimum. Być może możesz sprawdzić, czy dotyczy to twojego programu. Wystarczy dodać GolfScript 210 http://short.url/answer/210linię do wejścia i sprawdzić, czy dane wyjściowe pozostają takie same. Właściwie myślę, że nie dotyczy to twojego, ponieważ używasz [0] maksymalnie, ale nie mam w tej chwili Perla dostępnego, aby spróbować.
Thomas Weller
@ThomasW .: Nie ma to wpływu. Dodałem linię i wynik pozostaje taki sam. Po pierwszej części, która czyta plik, struktura danych %l/ %languagezawiera języki i ich minimalne wartości. Struktura danych %a/ %arrayzawiera tylko te pary język / adres URL, których wartość jest minimalna dla tego języka. Następnie wartości minimalne są sortowane w kolejności malejącej, a pierwsza z nich jest używana jako globalne maksimum i jako warunek filtru dla %a/ %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())

Wejście na standardowe wejście:

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

I to właśnie miałem przed skompresowaniem, przy 551 znakach:

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
źródło
1

C # - 628

Oto twoja dłuższa alternatywa, która wykorzystuje 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]));}}}}

Początkowo myślałem, że mogłem uzyskać nieznaczną redukcję kodu przy użyciu max / min z DataTable, ale typy wymagane do zbudowania DataTable(wierszy / kolumn / widoku) dodają dużo długości, niestety. Jestem nowy w golfie, więc może ktoś mógłby to jeszcze bardziej zmniejszyć. Wciąż fajne wyzwanie.

gajeNL
źródło
1

dg - 286 281 260 251 218 bajtów

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

Przykład:

$ 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

Wersja bez golfa :

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

P: Co to do cholery jest dg?
Odp .: Język programowania, który kompiluje się do kodu bajtowego CPython, podobnie jak Scala kompiluje się do JVM. Zasadniczo oznacza to, że dg jest alternatywną składnią dla Pythona 3. Pozwala także na użycie wszystkich istniejących bibliotek.

Więcej informacji tutaj (nawet samouczek!): Https://pyos.github.io/dg

rubik
źródło
Jeśli wstawię to do pliku, ma on tylko 217 bajtów (zakończenia linii Linuksa)
Thomas Weller
@ThomasW. Dziwne! Za pomocą cat langs.dg | wc -cdostaję 218!
rubik
Może trailing newline vs. brak trailing newline?
TheConstructor
@TheConstructor może być, chociaż nie powinien zapisywać go w nowej linii oO
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]]]]

bez golfa

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]]
    ]
]

Przykład użycia:

$ 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
źródło
0

C # - 515

Oczekuje nazwy pliku jako argumentu

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);}}}

Najpierw zaprojektowałem program C #, aby był prosty, ponieważ chciałem mieć coś w rodzaju programu referencyjnego. Ale potem postanowiłem także wziąć udział w zawodach i zagrać w golfa. To jedna z wcześniejszych wersji kodu + kilka komentarzy:

// 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
źródło
Wydaje się, że rozmiar pliku 515 na moim dysku zawiera znak kolejności bajtów. Skopiuj / wklej z tego miejsca ma tylko 512 bajtów.
Thomas Weller,
0

C # - 460 359

Po uświadomieniu sobie, jak nieporęczne było moje DataTablerozwiązanie, stworzyłem następujący przykład za pomocą Linq. Używa tej samej metodologii, co moje poprzednie rozwiązanie.

Grał w golfa

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);}}}

Nie golfił

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);
        }
    }
}

Nadal jestem dość nowy w Linq, więc jestem prawie pewien, że te wyrażenia można jeszcze bardziej zmniejszyć.

Z twojego pytania nie wynika, czy istnieje jedno rozwiązanie maksymalnej długości. W moich odpowiedziach wykorzystałem założenie, że istnieje jeden maksymalny punkt (tj. Jeśli byłby również GolfScript maksymalnie 210, może się nie powieść na podstawie zwróconego rekordu Single maximum). Rozwiązanie Heiko miałoby ten sam problem. Aby to naprawić, musielibyśmy dodać kolejny krok, który zawierał listę powiązanych maksimów w celu sprawdzenia minimów dla każdego języka.

gajeNL
źródło
1
Wydaje mi się, że można zapisać f jako Item3 (zamiast s [2]), a następnie napisać F. Console 3 do konsoli bez konieczności ponownego łączenia Item1 i Item2.
Thomas Weller
Dzięki za wyjaśnienie wymagań. Pochodząc z rzeczywistości powiedziałbym, że może się zdarzyć, że ktoś (niedoświadczony, oczywiście) napisze GolfScript zawierający 210 znaków.
Thomas Weller
1
Jeśli przekonwertujesz pierwszą pętlę foreach na LINQ, stanie się ona jeszcze krótsza: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 .: Dobry pomysł na podział. Dzięki za konwersję pętli foreach, myślałem o tym, dodając to pierwotnie, ale nie wiedziałem, że mogę użyć tej metody.
gajeNL
Chyba zaczynam rozumieć co zapytanie ma :) i będzie to również nie do prostszej wejście tak: Golfscript 100 ..., C# 1 ..., C# 200 .... To prawdopodobnie wymaga przeróbek
Thomas Weller,
0

C ++ - 535

Wyśle tylko odpowiedzi związane z najdłuższą pozycją po wybraniu tylko najkrótszych odpowiedzi każdego języka jako potencjalnych zwycięzców.

#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;
}

Gra w golfa (nie tak nieczytelny jak niektóre języki):

#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;}

źródło
Czy sprawdziłeś wydajność w stosunku do oczekiwanej? Przy 8 liniach danych wyjściowych powinien dawać tylko 3 linie danych wyjściowych. Twój program wydaje wszystko.
Thomas Weller
@ThomasW. Och, źle zrozumiałem tę część. Na razie go usunę.
@ThomasW. Czy to wygląda dobrze?
Jeśli wstawię to do pliku, otrzymam 540 bajtów, a nie 535. Czy mógłbyś dwukrotnie sprawdzić długość?
Thomas Weller,
Ma 535 znaków. Oboje mamy rację. Mogę to zmienić, jeśli chcesz.