Meta Golf Challenge


22

ในการท้าทายนั้นคุณจะต้องแก้ปัญหานั้น

การประกวดจบแล้ว! ตรวจสอบจุดสิ้นสุดของคำถาม

รายละเอียด:

  1. เขียนรหัสที่เล็กที่สุด (ทุกภาษา *)
  2. คะแนนของคำตอบคือผลรวมของ:
    • ความยาวของรหัสโดยไม่ต้องเว้นวรรค
    • จำนวนคำตอบโดยใช้ภาษาเดียวกันนั้นกำลังสอง
    • ความยาวของชื่อภาษาที่ยิ่งใหญ่ที่สุดในการแข่งขันลบความยาวของภาษาของคุณ
    • Downvotes ลบ Upvotes (ลบด้วยจำนวนโหวตทั้งหมด)
  3. เขียนตำแหน่งของผู้ใช้และคะแนน
  4. ผู้ใช้แต่ละคนสามารถเขียนได้คำตอบเดียวเท่านั้น
  5. คะแนนต่ำสุดชนะ

การทดสอบ:

ดังนั้นเมื่อสิ้นสุดการแข่งขันข้อมูลที่เป็นไปได้อาจเป็น (STDIN):

คอลัมน์คือ: ชื่อผู้ใช้ภาษาความยาวโค้ด (โดยไม่มีช่องว่าง) และ TotalVotes

UserA Python 100 1
UserB Perl 30 2
UserC Java 500 3
UserD Brainfuck 499 4
UserE Perl 29 5

หากชื่อผู้ใช้ของคุณมีช่องว่างเช่น "ชื่อผู้ใช้ของฉัน" มันจะกลายเป็น "MyUserName" ดังนั้นการป้อนข้อมูลจะมี4 คอลัมน์เสมอ

ผลลัพธ์จะเป็น (STDOUT):

1 UserE 33
2 UserB 37
3 UserA 103
4 UserD 496
5 UserC 503

คำอธิบาย:

User  P  N^2  L   V
 A   100  1   3  -1
 B    30  4   5  -2
 C   500  1   5  -3
 D   499  1   0  -4
 E    29  4   5  -5

Brainfuck เป็นชื่อที่ใหญ่ที่สุดมี 9 ตัวอักษร ( 9 - 9 = 0)

Perl และ Java มี 4 ตัวอักษร ( 9 - 4 = 5)

Python มี 6 ตัวอักษร ( 9 - 6 = 3)

Perl มี 2 รายการเพื่อให้ได้รับ 4 คะแนนพิเศษ


เกี่ยวกับภาษา:

ชื่อของภาษานั้นจะต้องประกอบด้วยตัวอักษรภาษาอังกฤษเท่านั้น (เช่น [A-Za-z]) และชื่อที่ไม่เหมาะสมที่จะต้อง "แปล" เป็นอย่างอื่น

ในตอนท้ายของการแข่งขันทุกภาษาจะต้องมีการเป็นตัวแทนของมัน (คุณอาจเสนอการเป็นตัวแทนที่ดีกว่า)

ตัวอย่าง:

Python3      -> Python
Ruby1.9      -> Ruby
Shell Script -> Shell
C++          -> Cpp
C#           -> CSharp
><>          -> Fish

กำหนดเวลา: 20 สิงหาคม 2554 00:00 UTC

ในตอนท้ายของการแข่งขันผู้ชนะต้องใช้โปรแกรมของเขา / เธอเพื่อค้นหาผู้ชนะ อนุญาตให้ผู้ที่ไม่ใช่ผู้ชนะใช้โปรแกรมเพื่อค้นหาผู้ชนะและบอกให้เขา / เธอใช้โปรแกรมของเขา / เธอเพื่อค้นหาผู้ชนะ :)

ผู้ชนะ (ดูด้านบน) ได้รับคำตอบรับแล้ว!

* ภาษา Whitespaceมีข้อได้เปรียบที่ไม่เป็นธรรมในการแนะนำความซับซ้อนไม่ จำกัด โดยไม่ต้องคำนึงถึงจำนวนตัวอักษร คำตอบที่เขียนใน Whitespace อาจอยู่ในการแข่งขัน แต่ไม่สามารถชนะได้

หากคุณสามารถสร้างตรรกะของโปรแกรมของคุณในช่องว่างคุณไม่สามารถชนะ นั่นเป็นหัวข้อที่เป็นอัตนัย แต่ถ้าโปรแกรมของคุณสามารถเพิ่มขนาดได้อย่างมากโดยไม่ถูกลงโทษมันจะอยู่ในสภาพนั้น


ป้อนข้อมูลสุดท้าย

ลำดับตัวอักษรของชื่อ (ณ วันที่ 20 ส.ค. 2011 UTC 00:00)

boothby Sage 41 9
Harpyon Python 203 4
JBernardo Python 184 7
JoeyAdams PostgreSQL 225 6
jpjacobs AWK 269 4
Lowjacker Ruby 146 2
PeterTaylor Golfscript 82 4
rmackenzie CommonLisp 542 2
shesek Javascript 243 3
userunknown Scala 252 1

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

ผลลัพธ์สุดท้าย

1 boothby 39
2 PeterTaylor 79
3 Lowjacker 151
4 JBernardo 185
5 Harpyon 207
6 JoeyAdams 220
7 shesek 241
8 userunknown 257
9 jpjacobs 273
10 rmackenzie 541

8
นั่นหมายความว่าทางออกในWhitespaceจะชนะโดยอัตโนมัติหรือไม่
Joey Adams

1
ข้อมูลเกี่ยวกับคำตอบอื่น ๆ มาจากที่ใด โปรแกรมของเราควรเชื่อมต่อกับ StackExchange หรือไม่และตอบคำถามนี้ได้หรือไม่?
จัสตินมอร์แกน

1
@ จัสตินในตอนท้ายของการแข่งขันฉันจะป้อนข้อมูลโปรแกรมจริงด้วยคำตอบ ฉันให้รูปแบบ
JBernardo

1
@Harpyon <> <ti dexif I! sknahT
JBernardo

1
เราต้องเรียงลำดับผลลัพธ์ด้วยคะแนนหรือไม่ ถ้าเป็นเช่นนั้นเราควรทำอย่างไรในกรณีที่เสมอกัน?
บูธตาม

คำตอบ:


11

Golfscript, 83 chars (82 ไม่นับพื้นที่ว่าง)

n/{},{' ':s/}%.{1=}%\{~~\~\-\.`{=}+4$\,,.*\,-+2${,}%$)\;+[\]}%$\;.,,]zip{~)s@~s@n}%

คำอธิบาย:

# Split the string containing all the input on newlines
n/
# Remove empty lines
{},
# Split each line on spaces (storing the space character in variable s)
{' ':s/}%
# We now have an array of arrays of words. Duplicate it, filter the copy to contain
# only the second word of each array, and reorder with the array of second words first
.{1=}%\
# Map each line
{
    # Unpack the array ["user" "lang" "length" "votes"] and evaluate the integers
    ~~\~\
    # Subtract votes from length and bring "lang" to the top
    -\
    # Create a function to match the string "lang"
    .`{=}+
    # Stack is currently [array of langs] "user" (length-votes) "lang" {"lang"=}
    # Duplicate the array of langs and apply the match function as a filter
    4$\,
    # Get the length of the array of matches and square it
    ,.*
    # Stack is [array of langs] "user" (length-votes) "lang" (num with lang)^2
    # Bring the "lang" to the top, get its length, subtract and add
    \,-+
    # Stack is [array of langs] "user" (score-length of longest lang)
    # Get an array of length of language names and sort it
    2${,}%$
    # Drop it apart from the largest value, and add that to the score
    )\;+
    # Package the "user" score from the top of the stack as [score "user"]
    [\]
}%
# Sort. Since each element is a [score "user"] value, this will sort by score.
$
# Discard the [array of langs].
\;
# Stack is an array of [score "user"] arrays. Get its length and create an array of the
# same length which counts from 0.
.,,
# Group and zip, so we go from [[score0 "user0"] ... [scoren "usern"]] [0 ... n] to
# [[[score0 "user0"] 0] ... [[scoren "usern"] n]]
]zip
# Map each [[scorei "useri"] i]
{
    # Expand, increment i (so we count from 1 rather than 0), add a space
    ~)s
    # Bring the [scorei "useri"] to the top, unpack, add a space
    @~s
    # Bring the scorei to the top, add a newline
    @n
}%
# We now have an array [[1 " " "userA" " " scoreA "\n"] ... [n " " "userZ" " " scoreZ "\n"]
# so Golfscript's standard output formatting does the rest

นั่นเป็นระเบียบสวยผมควรจะดูที่ GolfScript ... ฉันไม่มีความคิดวิธีที่แยกวิเคราะห์เป็นสิ่งที่มีความหมาย
shesek

3
@shesek เพิ่มเวอร์ชันที่มีความเห็นอย่างมาก
Peter Taylor

ว้าวเจ๋งมาก! ขอบคุณ :-)
shesek

15

Sage: 48 42 41 ไม่ใช่ whitespace (ทั้งหมด 60246 ไบต์)

เพียงเพื่อเป็นทิ่ม:

s = '   '
for c in '<lots of whitespace>'.split(s):
    s+=chr(len(c))
exec s

โปรดทราบว่าบรรทัดแรกควรเทียบเท่าs='\t'แต่บล็อกโค้ด SE แปลแท็บเป็นช่องว่าง 4 ช่อง

ช่องว่าง unpacks ไปที่:

exec preparse("""
import sys
instances = {}
maxlen = 0
inputs = [line.split() for line in sys.stdin.readlines()]
for i in [0..len(inputs)-1]:
    user, language, length, votes = inputs[i]
    if language in instances:
        instances[language]+=1
    else:
        instances[language]=1
    if len(language) > maxlen:
        maxlen = len(language)

scoresheet = []
for i in [0..len(inputs)-1]:
    user, language, length, votes = inputs[i]
    length = int(length)
    votes = int(votes)
    score = length + (maxlen - len(language)) + instances[language]*instances[language] - votes
    scoresheet.append((score,user))

scoresheet.sort(reverse=False)
for user, score in scoresheet:
    print user, score""")

โปรดทราบว่าฉันใช้ [0..len(inputs)-1]เพื่อให้แน่ใจว่านี่ไม่ใช่สคริปต์ Python เนื่องจาก Sage เป็น superpython * น่าเสียดายที่ผู้บริหารกลับมาที่ Python ... ดังนั้นฉันต้องเตรียมมันไว้ก่อน

แก้ไข 1: แยกแท็บไม่ใช่ขึ้นบรรทัดใหม่ - ฉันคิดอะไรอยู่ แก้ไข 2: ทำให้โค้ดง่ายขึ้นในสายตาและรีไซเคิลแท็บแยกโดยการกด 'newline' ใหม่ไปยังพื้นที่ว่าง

* ตกลงไม่มาก: เราแบ่งแฮคเกอร์


10

Python, 184

นั่นเป็นเหตุผลที่ฉันรักช่องว่าง

import          sys
x = sys.stdin.read(
    ).split()
z = x [  1 : : 4  ]
for i , ( j , k
) in enumerate (
      sorted (
       zip (
        [
      int(i)
    - int(j) +
  z.count(k) ** 2
+ max(map(len, z)) -
      len(k)
  for i, j, k in
       zip (
    x[2 : : 4],
    x[3 : : 4],
         z
         )
         ],
     x[ : : 4]
         )
         ),
         1
         ):
   print i, k, j

มันอ่านได้มากขึ้น!


3
นี่ควรจะเป็นภาพ ASCII บางอย่างหรือเปล่า? ถ้าใช่มันควรมีลักษณะอย่างไร?
oenone

@ ไม่มีใครบอกคุณ
JBernardo

2
ดูเหมือนว่าควร แต่ฉันจำอะไรไม่ได้เลย
oenone

1
@oneone ไม่ทำ ...
JBernardo

7

PostgreSQL - อักขระที่ไม่ใช่ช่องว่าง 225 ตัว

242 → 225: subqueries แทนที่ด้วยคำสั่ง windowing

\set QUIET 1
\t
\a
\f ' '
CREATE TEMPORARY TABLE t (u TEXT, l TEXT, c INT, v INT);
\copy t FROM PSTDIN WITH DELIMITER ' ';
SELECT row_number() OVER (ORDER BY score), *
    FROM (SELECT u,
                 c
                 + count(*) OVER (PARTITION BY l)^2
                 + max(length(l)) OVER ()
                 - length(l)
                 - v AS score
                 FROM t) AS q

ผ่านการทดสอบบน 9.2devel

การใช้งานและเอาท์พุท:

$ psql -f meta.sql < meta.in
1 UserE 33
2 UserB 37
3 UserA 103
4 UserD 496
5 UserC 503

4

Python 2 - 210 203 อักขระที่ไม่ใช่ช่องว่าง

import sys
e=enumerate
n=len
l=[x.split()for x in sys.stdin.readlines()]
for i,(x,y)in e(sorted((int(x[2])-int(x[3])+n(list(y for y in l if y[1]==x[1]))**2+max(n(x[1])for x in l)-n(x[1]),i)for i, x in e(l))):print i+1,l[y][0],x

การใช้งานและเอาท์พุท:

$ cat meta.txt | python meta.py
1 UserE 33
2 UserB 37
3 UserA 103
4 UserD 496
5 UserC 503

คุณสามารถใช้งานได้เท่านั้นx.split()(ซึ่งจะลบ\n)
JBernardo

@JBernardo ไชโย! บันทึก 7 ตัวอักษร

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

4

AWK, 277 269 ​​อักขระที่ไม่ใช่ช่องว่าง

ใช้inเพื่อตัด 8 ตัวอักษร

รุ่นที่เว้นวรรคและเวอร์ชันที่มีความคิดเห็น:

{
        # read in user strings
        u[NR]=$0
        # count number of times language has been used
        l[$2]+=1
}

END{
        # get maximum language length
        M=0
        X=NR
        for (g in l){
                f=length(g)
                if(f>M)
                        M=f
        }
        # get score for user i
        for(i in u){
                split(u[i],c)
                s[i]=c[3]+l[c[2]]^2+M-length(c[2])-c[4]
        }
        # sort scores and users
        for(i=2;i<=X;++i){
                for(j=i;s[j-1]>s[j];--j){
                        t=s[j]
                        x=u[j]
                        s[j]=s[j-1]
                        u[j]=u[j-1]
                        s[j-1]=t
                        u[j-1]=x
                }
        }
        # output
        for(i=1;i<=X;++i){
                split(u[i],c)
                print i,c[1],s[i]
        }
}

การใช้งาน:

awk -f meta.awk data.txt

ใช้sed '/#/ d' meta.awk|sed ':a;$!N;s/\n//;ta;s/\s//g;'|wc -cสำหรับการนับตัวอักษร
jpjacobs

3

Ruby, 146 ตัวอักษร + 4 ช่องว่าง

b=$<.map &:split
puts b.map{|u,l,c,v|[b.map{|_,n|n.size}.max-l.size+b.count{|_,n|n==l}**2+eval(c+?-+v),u]}.sort.map.with_index{|(s,u),i|[i+1,u,s]*' '}

3

JavaScript, 243 ตัวอักษร

for(g=0,H="length",i=J.split("\n"),p=[],l={};i[H]&&p.push(a=i.pop().split(" "));)
    X=a[1],X[H]>g&&(g=X[H]),l[X]=l[X]+1||1
for(i=-1;m=p[++i];)p[i]=[m[0],+m[2]+Math.pow(l[m[1]],2)+(g-m[1][H])-m[3]]
p.sort(function(a,b){return a[1]<b[1]?-1:1}).join("\n")

นานกว่าโซลูชันอื่น ๆ ส่วนใหญ่ ... แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ใน JavaScript

การใช้

อินพุตควรอยู่ในตัวแปร J ตัวอย่างเช่นเปิดคอนโซลและเขียน:

J="UserA Python 100 1\nUserB Perl 30 2\nUserC Java 500 3\nUserD Brainfuck 499 4\nUserE Perl 29 5";
for(g=0,H="length",i=J.split("\n"),p=[],l={};i[H]&&p.push(a=i.pop().split(" "));)
    X=a[1],X[H]>g&&(g=X[H]),l[X]=l[X]+1||1
for(i=-1;m=p[++i];)p[i]=[m[0],+m[2]+Math.pow(l[m[1]],2)+(g-m[1][H])-m[3]]
p.sort(function(a,b){return a[1]<b[1]?-1:1}).join("\n")

CoffeScript, 177 ตัวอักษร

เกี่ยวกับตรรกะเดียวกันใน CoffeScript:

g=0;H="length";l={};([A,+C+Math.pow(l[B],2)+(g-B[H])-D] for [A,B,C,D] in for a in J.split "\n" then [_,X]=a=a.split " ";X[H]>g&&g=X[H];l[X]=l[X]+1||1;a).sort((a,b)->`a[1]<b[1]?-1:1`).join "\n"

ฉันชอบวิธีที่คุณย่อlengthคุณลักษณะโดยใช้ตัวแปรและตัวห้อย
Joey Adams

3

เสียงกระเพื่อมสามัญ - 546

(เมื่อเด็กชายกอล์ฟรวมวงเล็บไม่นับช่องว่าง)

;;;; This is an answer to Code-Golf question
;;;; 3203/meta-golf-challenge
;;;; By using Common Lisp I plan to have the longest
;;;; Language-name while I cannot hope to have the
;;;; lowest character count due to Lisp's
;;;; linguistic tradition I can avoid the 16 or 25-pt
;;;; penalty atached to being the 4th or 5th PY
;;;; based answer.

(defun f (i)
 (loop for e in y do
  (if (eq i (nth 0 e))
   (return (nth 1 e))
  )
 )
)

(setf x
 (loop for l = (read-line () () () ())
  while l collect (loop for i = 0 then (1+ j)
                   as j = (position #\Space l :start i)
                   collect (subseq l i j) while j)
 )
)

(setf y
 (loop for a in x collect
  (list
   (+
    (read-from-string (nth 2 a))
    (expt (reduce #'+ (loop for b in x collect (if (string= (nth 1 a) (nth 1 b)) 1 0) ) ) 2 )
    (+ 5 (- (reduce #'min (loop for b in x collect (length (nth 1 b)))) (length (nth 1 a))))
    (* -1 (read-from-string (nth 3 a)))
   )
   (car a)
  )
 )
)

(setf g
 (sort (loop for c in y collect (nth 0 c)) #'<)
)

(loop for i = 0 then (1+ i) while (< i (length g)) do
 (setf a (nth i g))
 (format t "~A ~A ~A~%" (1+ i) (f a) a)
)

การตีกอล์ฟอย่างหนักโซลูชั่นเสียงกระเพื่อมที่พบบ่อยของฉันคือและยาวที่สุดบนกระดาน ดังนั้นฉันจึงตัดสินใจโกงนิดหน่อยโดยเขียน bootloader ที่สั้นลงอย่างมากและอ้างว่าเป็นการส่งของฉัน(ฉันถือว่าการยื่น @ @ Boothby เป็นแบบอย่างในความโปรดปรานของพฤติกรรมนี้)

ขอขอบคุณเป็นอย่างยิ่งกับPeter Taylorสำหรับความช่วยเหลือของเขาในการบีบถ่านทุกอันออกจาก bootstrapper นี้

BASH - 35

wget -q goo.gl/R4R54
cat -|clisp l.lsp

การใช้งาน : cat ./test0 | bash ./btstrp.sh

Joey Adamsชี้ให้เห็นว่านี่ไม่ใช่วิธีการแก้ปัญหาที่ยุติธรรมเพราะฉันสามารถ "เพิ่มความซับซ้อนของโซลูชันของคุณโดยไม่เพิ่มขนาดรหัสที่สอดคล้องกัน" ซึ่งเป็นจุดที่ไม่ได้แสดงอย่างชัดเจนในข้อมูลจำเพาะ


1
จะ for-loop จะสั้นกว่าหรือไม่?
Peter Taylor

ไม่แน่ใจ ... แต่พบว่าสั้นลง!
arrdem

1
$REPLYนอกจากนี้ถ้าคุณระบุตัวแปรในการอ่านเป็นคุณไม่จำเป็นต้องใช้ ลองwhile read x;do a=$x"\n"$a;doneดู และคุณควรจะสามารถลบช่องว่างหลังจาก|s ในบรรทัดสุดท้าย ในบันทึกอื่นฉันไม่แน่ใจว่าการใช้ที่อยู่ IP ภายในนั้นมีประโยชน์มาก: จะไม่ทำงานกับคนอื่น
Peter Taylor

หรือแม้กระทั่งwget -q http://url/l.lsp ;cat - |clisp l.lsp
ปีเตอร์เทย์เลอร์

โอเคคุณทำให้ฉันติดแมว
arrdem

2

สกาล่า269 ​​266 252 โดยไม่มีช่องว่างและขึ้นบรรทัดใหม่

val b = io.Source.stdin.getLines.toList.map (_.split (" "))
b.map (a => {
  val l = b.filter (_(1) .equals ( a(1))).size
  a(0) -> (a (2).toInt + l * l + (b.map (x => x(1).length).max - a(1).length) - a(3).toInt)
}).sortBy (_._2).zipWithIndex .map (m => m._2 + " " + m._1._1 + " "+ m._1._2).mkString ("\n")

ภาวนา:

cat user.lst | scala -i metagolf.scala

การปรับปรุง:

  • ตัวย่อ (l => l.foo) -> (_.foo)
  • การภาวนา
  • Gareths hint ของ stdin

ทางออกของฉัน:

* 0 boothby 39
1 PeterTaylor 79
2 Lowjacker 151
* 3 JBernardo 185
4 Harpyon 207
5 JoeyAdams 220
6 shesek 241
7 userunknown 257
8 jpjacobs 273
9 rmackenzie 541

*) จากการแข่งขัน


คุณสามารถใช้แทนstdin fromFile(System.in)
Gareth

1
ขอบคุณ ตอนนี้ฉันต้องการผู้โหวตขึ้น 179 คนและชนะการท้าทาย - ceteris paribus
ผู้ใช้ที่ไม่รู้จัก

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