ชนิดของเมตา: รับคำตอบที่สั้นที่สุดที่ยาวที่สุด


14

งานของคุณ - ถ้าคุณยอมรับมัน - คือการเขียนโปรแกรมซึ่งจะช่วยให้เข้าใจข้อเสนอของฉันเกี่ยวกับเมตาโดยการคำนวณผู้ชนะของการแข่งขัน แน่นอนคำตอบสำหรับคำถามนี้จะได้รับการปฏิบัติตามที่เสนอดังนั้นโปรแกรมของคุณ (หากถูกต้อง) สามารถคำนวณได้ว่าคำตอบของคุณจะกลายเป็นคำตอบที่ยอมรับหรือไม่

กฎระเบียบ

  • โปรแกรมอ่านไฟล์ที่มีหลายบรรทัดในรูปแบบต่อไปนี้ (ดูตัวอย่างด้านล่าง): [ภาษา] TAB [NumberOfCharacters] TAB [LinkToAnswer]
  • ชื่อไฟล์ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังโปรแกรมของคุณหรือไฟล์ถูกเปลี่ยนเส้นทางไปยังอินพุตมาตรฐานของโปรแกรมของคุณ เป็นทางเลือกของคุณโปรดพูดถึงวิธีการเมื่อให้คำตอบ
  • คาดว่ารูปแบบอินพุตจะถูกต้อง ไม่จำเป็นต้องมีข้อผิดพลาดในการจัดการ
  • จำนวนตัวอักษรเป็นบวก โปรแกรมของคุณจะต้องจัดการกับความยาวได้ถึง 65535 64k ควรจะเพียงพอสำหรับทุกคน :-)
  • โปรแกรมเอาต์พุตบรรทัดเหล่านั้นบนเอาต์พุตมาตรฐานซึ่งตรงกับแนวคิดของข้อเสนอเมตานั่นคือ
    • รหัสที่สั้นที่สุดของภาษาการเขียนโปรแกรมเฉพาะชนะ (ขั้นตอนการลดขนาด)
    • รหัสที่ยาวที่สุดในบรรดาภาษาการเขียนโปรแกรมทั้งหมดชนะ (เฟสการเรียงลำดับ)
    • ในกรณีที่มีการเสมอคำตอบทั้งหมดที่มีความยาวเท่ากันจะถูกพิมพ์ออกมา
  • ลำดับของเอาต์พุตไม่สำคัญ
  • แม้ว่าที่ยาวที่สุดชนะรหัสนี้ไม่ได้เป็นรหัสโบว์ลิ่งรหัสของคุณจะต้องสั้นที่สุดสำหรับภาษาโปรแกรมของคุณ
  • คำตอบเกี่ยวกับการเขียนโปรแกรมภาษาที่ไม่ค่อยจะมีความพยายามที่จะย่อรหัสสมควร downvote เพราะพวกเขาพยายามที่จะหลีกเลี่ยงความตั้งใจของคำถามประเภทนี้ หากมีเพียงหนึ่งคำตอบสำหรับภาษาการเขียนโปรแกรมที่เฉพาะเจาะจงก็จะถือว่าเป็นผู้ชนะเลิศดังนั้นคุณสามารถเริ่มเป่ารหัส

ตัวอย่างไฟล์อินพุต (คั่นด้วยแท็บเดียวหากมีปัญหาเกี่ยวกับการจัดรูปแบบ):

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

ผลลัพธ์ที่คาดหวัง (คำสั่งไม่สำคัญ):

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

ปรับปรุง

บางโปรแกรมใช้ความจริงที่ว่ามีค่าสูงสุดเพียงครั้งเดียว (เช่นโปรแกรมตัวอักษร C # 210) จากความเป็นจริงบางคนสามารถเขียนโปรแกรม GolfScript ที่มีความยาว 210 อักขระ ผลลัพธ์จะยังคงเหมือนเดิม ฉันได้เพิ่ม GolfScript เข้าไปในอินพุท

อัปเดต 2

ตามที่แนะนำฉันได้ retagged (ยังคงรหัสกอล์ฟด้วย) และกำหนดเวลาคือ2014-03-06 (ซึ่งดูเหมือนว่าจะเป็นวันที่โดยพลการ แต่ฉันจะกลับไปที่เยอรมนีจากการเดินทางแล้ว)

ผลสุดท้าย

ฉันตัดสินใจลงคะแนนดังนี้:

  • คำตอบที่ไม่สามารถยืนยันจำนวนอักขระได้รับความคิดเห็นเพื่ออธิบายการนับ
  • คำตอบที่สามารถลดได้อย่างง่ายดายจะได้รับความคิดเห็นข้อเสนอแนะการแก้ไขและไปสู่ผลลัพธ์ที่มีค่านับต่ำกว่า (หวังว่าฉันจะได้เห็นล่วงหน้า)
  • คำตอบที่ไม่ได้รับการรวบรวมรวบรวม downvote (ค่อนข้างเป็นงานที่ยากพอสมควร)
  • คำตอบที่ไม่ได้เล่นกอล์ฟจะได้รับการลงคะแนน (ตามที่อธิบายไว้ในกฎแล้ว)
  • คำตอบที่สร้างผลลัพธ์ที่คาดหวังได้รับ upvote เนื่องจากคำตอบบางข้อที่ใช้งานไม่ได้ตามที่คาดไว้ฉันจึงใช้ไฟล์อินพุตที่แตกต่างกัน 4 ไฟล์และตรวจสอบกับผลลัพธ์ที่ต้องการ

สุดท้ายผู้ชนะจะถูกกำหนดโดยการให้ตารางคำตอบที่มีคุณสมบัติเหมาะสมเป็นข้อมูลป้อนเข้าสู่โปรแกรมอ้างอิงของฉัน (รวมทั้งตรวจสอบผลลัพธ์ด้วยตนเองอีกครั้ง) หากคำตอบของฉันจะเป็นคำตอบที่ชนะฉันจะแยกมันออกจากรายการ ในกรณีที่มีผู้ชนะหลายคนฉันจะต้องเลือกเพียงคนเดียว ดังนั้นสามารถรับโบนัสบางส่วนได้:

  • คำตอบที่ยอมรับอินพุตมากกว่าที่คาดไว้ (เช่นอยู่นอกช่วงที่กำหนด)
  • คำตอบที่ใช้ความคิดที่ฉลาดทำให้สั้น

ฉันได้รวบรวมคำตอบในวันที่ 6 มีนาคม 2014, 19:45 UTC + 1 การวิเคราะห์อย่างต่อเนื่อง การตรวจสอบคำตอบทั้งหมดนั้นยากกว่าที่คาดไว้ ...


ตอนนี้ไม่ควรติดแท็กรหัสท้าทายหรือไม่ นอกจากนี้เมื่อใดจะถึงกำหนด
TheConstructor

2
รหัส Alt สำหรับชื่อนี้คือ Code-Blackjack
VoronoiPotato

คำตอบ:


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

โปรแกรมจะอ่านจาก 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. โปรแกรมจะอ่านทีละบรรทัดจนกว่าจะมีข้อยกเว้นเกิดขึ้น ( ArrayIndexOutOfBoundsExceptionเมื่อพบบรรทัดว่างหรือNoSuchElementExceptionถ้าอินพุตสิ้นสุดโดยไม่มีการขึ้นบรรทัดใหม่) แต่ละบรรทัดที่อ่านจะถูกเพิ่มไปยังTreeMap mซึ่งอาจถูกกำหนดเป็นTreeMap<String, TreeMap<Long, TreeMap<String,String[]>>>(จากซ้ายไปขวา: ภาษา, ขนาดโค้ด, URL, อินพุต)
  2. จากนั้นผลลัพธ์ - TreeSet<Long, TreeSet<String, String[]>> n(จากซ้ายไปขวา: รหัสขนาด, URL, อินพุต) จะถูกสร้างขึ้นโดยfirstEntry()มีการรวบรวมเนื้อหาของทุกภาษา
  3. lastEntry()จากผลรวมที่TreeMapเราได้รับ - เราเพียงต้องการพิมพ์

ลองใช้ideone.com (สลับอินพุตสองบรรทัดสุดท้ายเพื่อแสดงว่าอ่านทุกบรรทัดแล้ว)


ต้องเพิ่มตัวแปรเพื่อเก็บ BufferedReader -.-
TheConstructor

1
บางที Java ชนะเวลานี้เพราะมันไม่ได้มีคำหลัก var a ...
โทมัสเวลเลอร์

@ThomasW เพิ่งรู้ว่าฉันทิ้ง {} ที่ไม่จำเป็นไว้ในรุ่น
golfed

นอกจากนี้ยังเพิ่ง relaized ฉันใช้ Integer ในขณะที่ int สั้นกว่ายาว Integer ควรรีบตีกอล์ฟที่ Long -.-
TheConstructor

2

Perl, 195 ไบต์

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

อินพุตคาดว่าเป็น STDIN ผลลัพธ์ถูกเขียนลงใน STDOUT:

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

เวอร์ชันที่ไม่ดี

#!/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 ตามที่ @grovesNL ชี้ให้เห็นว่าบางโปรแกรมอาจขึ้นอยู่กับความจริงที่ว่ามีค่าสูงสุดเพียงครั้งเดียว บางทีคุณสามารถตรวจสอบว่าโปรแกรมของคุณได้รับผลกระทบหรือไม่ เพียงเพิ่มGolfScript 210 http://short.url/answer/210บรรทัดในอินพุตและดูว่าเอาต์พุตยังคงเหมือนเดิมหรือไม่ ที่จริงฉันคิดว่าคุณไม่ได้รับผลกระทบเพราะคุณใช้ [0] ถึงจำนวนสูงสุด แต่ฉันยังไม่สามารถใช้ Perl ได้ในขณะนี้เพื่อลองดู
Thomas Weller

@ThomasW: ไม่ได้รับผลกระทบ ฉันได้เพิ่มบรรทัดและผลลัพธ์ยังคงเหมือนเดิม หลังจากส่วนแรกที่อ่านไฟล์โครงสร้างข้อมูล%l/ %languageมีภาษาและค่าน้อยที่สุด โครงสร้างข้อมูล%a/ %arrayมีคู่ภาษา / URL เหล่านั้นเท่านั้นซึ่งมีค่าน้อยที่สุดสำหรับภาษานี้ แล้วค่าต่ำสุดที่จะถูกจัดเรียงในลำดับถัดลงมาและเป็นครั้งแรกที่หนึ่งที่ใช้เป็นสูงสุดทั่วโลกและเป็นเงื่อนไขกรองสำหรับ/%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())

อินพุตบน 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

และนี่คือสิ่งที่ฉันมีก่อนที่จะเริ่มอัดลงที่ 551 chars:

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

1

C # - 628

นี่เป็นอีกทางเลือกหนึ่งของคุณที่ใช้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]));}}}}

ฉันคิดว่าเดิมฉันอาจได้รับการลดรหัสเล็กน้อยจากการใช้สูงสุด / นาทีด้วยDataTableแต่ประเภทที่จำเป็นในการสร้างDataTable(แถว / คอลัมน์ / มุมมอง) เพิ่มความยาวได้ไม่มากนัก ฉันใหม่กับการตีกอล์ฟดังนั้นอาจมีบางคนที่สามารถลดมันได้อีก ยังคงเป็นความท้าทายที่สนุก


1

dg - 286 281 260 251 218 ไบต์

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

ตัวอย่าง:

$ 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

เวอร์ชันที่ไม่ถูกปรับแต่ง :

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

ถาม: อะไรคือ heck dg
ตอบ:ภาษาการเขียนโปรแกรมที่คอมไพล์ไปยัง CPython bytecode เหมือนกับที่ Scala รวบรวมให้กับ JVM นั่นหมายความว่า dg เป็นไวยากรณ์ทางเลือกสำหรับ Python 3 ซึ่งอนุญาตให้คุณใช้ไลบรารีที่มีอยู่ทั้งหมดได้เช่นกัน

ข้อมูลเพิ่มเติมที่นี่ (แม้กระทั่งการกวดวิชา!): https://pyos.github.io/dg


ถ้าฉันใส่ลงไปในไฟล์มันมีเพียง 217 ไบต์ (สิ้นสุดบรรทัด Linux)
Thomas Weller

@ThomasW แปลก! ใช้cat langs.dg | wc -cฉันได้ 218!
rubik

บางทีการขึ้นบรรทัดใหม่กับการขึ้นบรรทัดใหม่หรือไม่
TheConstructor

@TheConstructor มันอาจจะถึงแม้ว่ามันไม่ควรประหยัดด้วย oO ขึ้นบรรทัดใหม่
รูบิค

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

ยกเลิกแข็งแรงเล่นกอล์ฟ

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

ตัวอย่างการใช้งาน:

$ 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

0

C # - 515

คาดว่าชื่อไฟล์เป็นอาร์กิวเมนต์

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

ก่อนอื่นฉันออกแบบโปรแกรม C # ของฉันให้ตรงไปข้างหน้าเพราะฉันต้องการมีโปรแกรมอ้างอิงชนิดหนึ่ง แต่แล้วฉันก็ตัดสินใจที่จะกระโดดเข้าประกวดด้วยตัวเองและเล่นกอล์ฟ นี่เป็นหนึ่งในรหัสรุ่นก่อนหน้า + ความคิดเห็นบางส่วน:

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

ดูเหมือนว่าขนาดไฟล์ 515 บนดิสก์ของฉันมีเครื่องหมายคำสั่งซื้อแบบไบต์ คัดลอก / วางจากที่นี่เพียง 512 ไบต์
โทมัสเวลเลอ

0

C # - 460 359

หลังจากทราบว่าDataTableโซลูชันของฉันใหญ่โตอย่างไรฉันได้สร้างตัวอย่างต่อไปนี้โดยใช้ Linq ใช้วิธีการเดียวกันกับโซลูชันก่อนหน้าของฉัน

แข็งแรงเล่นกอล์ฟ

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

ฉันยังค่อนข้างใหม่กับ Linq ดังนั้นฉันเกือบจะเป็นไปในทางที่ดี

จากคำถามของคุณยังไม่ชัดเจนหากมีวิธีแก้ปัญหาความยาวสูงสุดเดียว สำหรับคำตอบของฉันฉันใช้สมมติฐานว่ามีจุดสูงสุดเดียว (เช่นถ้ามี GolfScript สูงสุด 210 เช่นกันมันอาจล้มเหลวตามบันทึกสูงสุดเดี่ยวที่ส่งคืน) วิธีการแก้ปัญหาของ Heiko จะมีปัญหาเดียวกัน ในการแก้ไขปัญหานี้เราจะต้องเพิ่มอีกขั้นตอนที่มีรายการของ maxima ที่เชื่อมโยงเพื่อตรวจสอบขั้นต่ำสำหรับแต่ละภาษา


1
ฉันคิดว่าคุณสามารถบันทึก f เป็น Item3 (แทน s [2]) แล้วเขียน f.Item3 ไปยังคอนโซลโดยไม่จำเป็นต้องรวมรายการ Item1 และ Item2 อีกครั้ง
Thomas Weller

ขอบคุณสำหรับการชี้แจงข้อกำหนด มาจากความเป็นจริงฉันจะบอกว่ามันอาจเกิดขึ้นได้ว่ามีคน (ไม่มีประสบการณ์ชัดเจน) เขียน GolfScript ที่มี 210 ตัวอักษร
Thomas Weller

1
ถ้าคุณแปลง foreach-loop แรกเป็น LINQ มันจะยิ่งสั้นลง: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: ความคิดที่ดีสำหรับการแยก ขอบคุณสำหรับการแปลงลูป foreach ฉันคิดว่ามันเพิ่มเข้าไป แต่เดิม แต่ฉันไม่รู้ว่าฉันสามารถใช้วิธีนี้ได้
grovesNL

ฉันคิดว่าฉันเริ่มที่จะเข้าใจในสิ่งที่แบบสอบถามของคุณไม่ :) Golfscript 100 ...และมันจะยังล้มเหลวสำหรับการป้อนข้อมูลที่เรียบง่ายเช่นนี้C# 1 ..., C# 200 ..., อาจต้องมีการทำใหม่
โทมัสเวลเลอร์

0

C ++ - 535

จะส่งออกคำตอบที่เชื่อมโยงกับตำแหน่งที่ยาวที่สุดหลังจากเลือกเฉพาะคำตอบที่สั้นที่สุดของแต่ละภาษาในฐานะผู้ชนะ

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

เล่นกอล์ฟ (ไม่สามารถอ่านได้บางภาษา):

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

คุณตรวจสอบผลลัพธ์ของคุณกับผลลัพธ์ที่คาดหวังหรือไม่? ด้วยอินพุต 8 บรรทัดมันจะให้ผลลัพธ์เพียง 3 บรรทัด โปรแกรมของคุณดูเหมือนจะส่งออกทุกอย่าง
Thomas Weller

@ThomasW โอ้ฉันเข้าใจผิดส่วนนั้น ฉันจะลบออกตอนนี้

@ThomasW สิ่งนี้ดูถูกไหม?

ถ้าฉันใส่ลงไปในไฟล์ฉันจะได้ 540 ไบต์ไม่ใช่ 535 คุณช่วยตรวจสอบความยาวได้ไหม
โทมัสเวลเลอ

มันคือ 535 ตัวอักษร เราทั้งคู่ถูกต้อง ฉันสามารถเปลี่ยนได้ถ้าคุณต้องการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.