Tantangan Golf Meta

22

Pada tantangan itu Anda harus menyelesaikan tantangan itu.

Kontes telah usai! Periksa bagian akhir pertanyaan

Spesifikasi:

  1. Tulis kode terkecil (Bahasa apa saja *).
  2. Skor jawaban adalah jumlah dari:
    • Panjang kode tanpa spasi .
    • Jumlah jawaban yang menggunakan bahasa yang sama dengan kuadrat.
    • Panjang nama bahasa terbesar pada kontes dikurangi panjang bahasa Anda.
    • Downvotes minus Upvotes (alias minus Total Suara)
  3. Tulis posisi pengguna dan skornya.
  4. Setiap pengguna hanya dapat menulis satu jawaban.
  5. Skor terendah menang.

Pengujian:

Jadi, di akhir kontes, masukan yang mungkin bisa terjadi (STDIN):

Kolomnya adalah: Nama pengguna, Bahasa, Panjang kode (tanpa spasi) dan TotalVote

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

Jika nama pengguna Anda memiliki spasi seperti "Nama Pengguna Saya" itu akan menjadi "MyUserName" sehingga input akan selalu memiliki tepat 4 kolom .

Outputnya adalah (STDOUT):

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

Penjelasan:

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 adalah nama terbesar dengan 9 karakter ( 9 - 9 = 0).

Perl dan Java memiliki 4 karakter ( 9 - 4 = 5).

Python memiliki 6 karakter ( 9 - 6 = 3).

Perl memiliki 2 entri sehingga masing-masing mendapatkan 4 poin tambahan.


Tentang bahasa:

Nama bahasa hanya boleh mengandung huruf bahasa Inggris (yaitu [A-Za-z]) dan yang tidak sesuai yang harus "diterjemahkan" ke sesuatu yang lain.

Pada akhir kontes, setiap bahasa harus memiliki perwakilannya (Anda dapat mengusulkan representasi yang lebih baik)

Contoh:

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

Tenggat: 20 Agustus 2011 00:00 UTC

Di akhir kontes, pemenang harus menggunakan programnya untuk menemukan pemenang. Diijinkan bukan pemenang untuk menggunakan program mereka untuk menemukan pemenang dan memberitahunya untuk menggunakan programnya untuk menemukan pemenang. :)

Pemenang (lihat di atas) mendapat jawaban yang diterima!

* Bahasa Whitespace memiliki keuntungan yang tidak adil karena dapat memperkenalkan kompleksitas tanpa batas tanpa penalti pada jumlah karakter. Jawaban yang ditulis di Whitespace mungkin ada di kontes tetapi tidak bisa menang.

Jika Anda dapat membuat logika program Anda di ruang putih , Anda juga tidak bisa menang. Itu topik yang subjektif, tetapi jika program Anda dapat meningkat dalam ukuran tanpa dihukum, itu jatuh dalam kondisi itu.


Input akhir

Urutan nama menurut abjad (per 20 Agustus 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

Karena jawaban saya dan stan tidak diizinkan untuk menang, pemenang harus menyatakan dirinya pemenang dengan mengedit pertanyaan ini dan memposting hasil akhir di bawah ini.

Hasil akhir

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
JBernardo
sumber
8
Apakah itu berarti solusi di Whitespace secara otomatis akan menang?
Joey Adams
1
Dari mana informasi tentang jawaban lain itu berasal? Apakah program kami seharusnya terhubung ke StackExchange dan menambang jawaban untuk pertanyaan ini?
Justin Morgan
1
@Justin Di akhir kontes, saya akan membuat input program nyata dengan jawabannya. Saya memberi format
JBernardo
1
@Harpyon <> <ti dexif I! SknahT
JBernardo
1
Haruskah kita mengurutkan output berdasarkan skor? Jika demikian, apa yang harus kita lakukan jika dasi?
stan

Jawaban:

11

Golfscript, 83 karakter (82 tidak termasuk spasi)

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

Penjelasan:

# 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
Peter Taylor
sumber
Itu cukup rapi, saya harus melihat GolfScript ... Saya tidak tahu bagaimana itu diurai menjadi sesuatu yang bermakna
shesek
3
@shesek, menambahkan versi yang banyak dikomentari
Peter Taylor
wow, sangat keren! terima kasih :-)
shesek
15

Sage: 48 42 41 non-spasi putih (total 60246 byte)

Hanya untuk menjadi tusukan:

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

Perhatikan bahwa baris pertama harus sama dengan s='\t', tetapi blok kode SE menerjemahkan tab menjadi 4 spasi.

Ruang putih membongkar untuk:

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

Perhatikan bahwa penggunaan saya [0..len(inputs)-1]memastikan bahwa ini bukan skrip Python, karena Sage adalah superpython *. Sayangnya, exec kembali menggunakan Python ... jadi saya harus mempersiapkannya.

sunting 1: pemisahan pada tab, bukan baris baru - apa yang saya pikirkan? sunting 2: membuat kode lebih mudah di mata, dan mendaur ulang tab pemisahan dengan mendorong 'baris baru' lain ke spasi

* Ok, tidak cukup: kita pecahkan xor

stan
sumber
10

Python, 184

Itu sebabnya saya suka ruang.

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

Itu jauh lebih mudah dibaca!

JBernardo
sumber
3
Apakah ini seharusnya semacam seni ascii yang menggambarkan sesuatu? jika ya, seperti apa bentuknya?
oenone
@Oneone kau katakan padaku.
JBernardo
2
sepertinya memang seharusnya, tetapi saya tidak bisa mengenali apa pun
oenone
1
@satu orang juga tidak ...
JBernardo
7

PostgreSQL - 225 karakter tanpa spasi

242 → 225: Subquery yang diganti dengan klausa 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

diuji pada 9.2devel

Penggunaan dan output:

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

Python 2 - 210 203 karakter tanpa spasi

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

Penggunaan dan output:

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

sumber
Anda hanya bisa menggunakan x.split()(itu juga akan menghapus \n)
JBernardo
@JBernardo Cheers! 7 karakter disimpan.
Anda dapat membuang .readlines () di sys.stdin .... untuk setiap input yang masuk akal panggilan fungsi tidak akan membuat perbedaan dan biaya beberapa karakter. Baru tahu itu di golf lain dan berpikir aku akan berbagi.
arrdem
4

AWK, 277 269 ​​karakter tanpa spasi

Digunakan inuntuk memotong 8 karakter.

Versi spasi dan versi komentar:

{
        # 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]
        }
}

pemakaian:

awk -f meta.awk data.txt
jpjacobs
sumber
digunakan sed '/#/ d' meta.awk|sed ':a;$!N;s/\n//;ta;s/\s//g;'|wc -cuntuk menghitung karakter.
jpjacobs
3

Ruby, 146 karakter + 4 spasi

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]*' '}
Lowjacker
sumber
3

JavaScript, 243 karakter

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

Lebih lama dari sebagian besar solusi lain ... tapi yang terbaik yang bisa saya dapatkan dalam JavaScript.

Pemakaian

Input harus dalam variabel J. Misalnya, buka konsol dan tulis:

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 karakter

Tentang logika yang sama, di 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"
shesek
sumber
Saya suka bagaimana Anda menyingkat lengthatribut dengan menggunakan variabel dan subskrip.
Joey Adams
3

Gangguan Umum - 546

(Ketika anak golf menggabungkan kurung, tidak termasuk spasi)

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

Golf berat, solusi lumpuh saya adalah dan terpanjang di papan. Jadi saya memutuskan untuk sedikit curang dengan menulis bootloader yang jauh lebih pendek dan mengklaim itu sebagai kiriman saya.(Saya menganggap pengajuan @ Boothby sebagai preseden yang mendukung perilaku ini)

Terima kasih besar kepada Peter Taylor untuk bantuannya memeras setiap karakter terakhir dari bootstrapper ini.

BASH - 35

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

Penggunaan : cat ./test0 | bash ./btstrp.sh

Joey Adams menunjukkan bahwa ini bukan solusi yang adil karena saya dapat "secara sewenang-wenang meningkatkan kompleksitas solusi Anda tanpa peningkatan ukuran kode yang sesuai", suatu hal yang tidak secara jelas dinyatakan dalam spesifikasi.

arrdem
sumber
1
Bukankah for-loop lebih pendek dari pada sampai?
Peter Taylor
tidak yakin ... tetapi menemukan waktu yang lebih singkat!
arrdem
1
Juga, jika Anda menentukan variabel untuk dibaca Anda tidak perlu menggunakan $REPLY. Coba while read x;do a=$x"\n"$a;done. Dan Anda harus dapat menghapus spasi setelah |s pada baris terakhir. Pada catatan lain, saya tidak yakin menggunakan alamat IP internal sangat berguna: tidak akan bekerja untuk orang lain.
Peter Taylor
Atau bahkanwget -q http://url/l.lsp ;cat - |clisp l.lsp
Peter Taylor
Oke, Anda kehilangan saya pada kucing -
arrdem
2

Scala 269 ​​266 252 tanpa kosong dan baris baru.

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

Doa:

cat user.lst | scala -i metagolf.scala

pembaruan:

  • disederhanakan (l => l.foo) -> (_.foo)
  • doa
  • Gareth mengisyaratkan stdin

solusi saya:

* 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

*) keluar dari kontes

Pengguna tidak diketahui
sumber
Anda bisa menggunakan stdinbukan fromFile(System.in).
Gareth
1
Terima kasih. Sekarang saya perlu 179 upvotes, dan akan memenangkan tantangan - ceteris paribus.
pengguna tidak diketahui
Tidak masalah. Hmm ... tidak yakin ada lalu lintas yang cukup untuk membuat Anda mendapatkan upvotes ...
Gareth