Meta Golf Mücadelesi


22

Bu zorlukla ilgili bu zorluğu çözmelisin.

Yarışma bitti! Sorunun sonunu kontrol et

Özellikleri:

  1. En küçük kodu yaz (Herhangi bir dil *).
  2. Bir cevabın puanı aşağıdakilerin toplamıdır:
    • Boşluksuz kod uzunluğu .
    • Aynı dili kullanan kare sayısı.
    • Yarışmadaki en büyük dilin isminin uzunluğu eksi dilinizin uzunluğu.
    • Olumsuz eksi Olumlu oy (aka eksi Toplam Oy)
  3. Kullanıcıların pozisyonunu ve puanını yazın.
  4. Her kullanıcı sadece bir cevap yazabilir.
  5. En düşük puan kazanır.

Test yapmak:

Bu nedenle, yarışmanın sonunda olası bir girdi olabilir (STDIN):

Sütunlar: Kullanıcı adı, Dil, Kod uzunluğu (boşluksuz) ve TotalVotes

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

Kullanıcı adınız "Kullanıcı Adım" gibi boşluklar içeriyorsa, "Kullanıcı Adım" olur, böylece giriş her zaman tam olarak 4 sütuna sahip olur .

Çıkış (STDOUT) olacaktır:

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

Açıklama:

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 karakter ( 9 - 9 = 0) ile en büyük isimdir .

Perl ve Java'nın 4 karakteri var ( 9 - 4 = 5).

Python 6 karaktere sahiptir ( 9 - 6 = 3).

Perl'de 2 giriş var, böylece her biri 4 ekstra puan alıyor.


Diller hakkında:

Dilin adı yalnızca İngilizce harfler (yani [A-Za-z]) içermeli ve uymayanlar başka bir şeye "çevrilmelidir".

Yarışma sonunda, her dilin bir temsili olmalı (Daha iyi temsiller önerebilirsin)

Örnekler:

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

Son başvuru tarihi: 20 Ağustos 2011 00:00 UTC

Yarışma sonunda kazanan, programını bulmak için programını kullanmalıdır. Kazananların, kazananı bulmak için programlarını kullanmalarına ve kazananı bulmak için programlarını kullanmalarını isteme izin verilir. :)

Kazanan (yukarıya bakın) kabul edilen cevabı alır!

* Boşluk dili , karakter sayısına bir ceza vermeden sınırsız karmaşıklık getirememe konusunda haksız bir avantaja sahiptir. Boşlukta yazılmış cevaplar yarışmada olabilir, ancak kazanamaz.

Programınızın mantığını beyaz boşluklarda yapabilirseniz, kazanamazsınız. Bu öznel bir konudur, ancak programınız cezalandırılmadan büyük ölçüde artabilirse, bu duruma düşüyor.


Son giriş

İsimlerin alfabetik sıralaması (20 Ağu 2011, UTC 00:00 itibariyle)

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

Hem benim hem de boothby'nin cevaplarının kazanmasına izin verilmediğinden, kazanan bu soruyu düzenleyerek ve aşağıdaki son çıktıyı vererek kazananı ilan etmelidir.

Nihai Çıktı

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
Bu, boşluktaki bir çözümün otomatik olarak kazanacağı anlamına mı geliyor ?
Joey Adams

1
Diğer cevaplarla ilgili bilgiler nereden geliyor? Programlarımızın StackExchange'e bağlanması ve bu sorunun cevabını incelemesi mi gerekiyor?
Justin Morgan

1
@Justin Yarışma sonunda, cevapları ile gerçek program girişi yapacağım. Formatını verdim
JBernardo 18:11

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

1
Çıktıyı skorlara göre sıralamalı mıyız? Eğer öyleyse, beraberlik durumunda ne yapmalıyız?
boothby

Yanıtlar:


11

Golfscript, 83 karakter (82 boşluk bırakmıyor)

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

Açıklama:

# 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

Bu oldukça zarif, GolfScript'e bakmalıyım ... Bunun anlamlı bir şeyle nasıl ayrıştırıldığı hakkında hiçbir fikrim yok
shesek

3
@shesek, yoğun bir şekilde yorumlanmış bir versiyonunu ekledi
Peter Taylor

vay, çok havalı! thanks :-)
shesek

15

Adaçayı: 48 42 41 boşluksuz (toplam 60246 bayt)

Sadece bir hıyar olmak için:

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

İlk satırın aynı olması gerektiğine dikkat edin s='\t', ancak SE kod bloğu sekmeyi 4 alana çevirir.

Boşluk şunları açar:

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

Benim kullanmamın [0..len(inputs)-1], bunun bir Python betiği olmadığından emin olduğumu unutmayın , çünkü Sage bir superpythondur *. Ne yazık ki, yürütme Python'a geri döndü ... ben de hazırladım.

düzenleme 1: sekmelerde bölme, yeni satırlara değil - ne düşünüyordum? düzenleme 2: kodu gözlerin üzerinde kolaylaştırdı ve bölme sekmesini boşluklara başka bir 'yeni satır' iterek geri dönüştürdü

* tamam, tam değil: xoru kırıyoruz


10

Python, 184

Bu yüzden mekanları severim.

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

Çok daha okunaklı!


3
Bunun bir şeyi hayal eden bir tür sanat sanatı mı olması gerekiyor? eğer evet ise, neye benzemeli?
oenone

@ söyle bana.
JBernardo

2
olması gerektiği gibi görünüyor, ama hiçbir şey
tanıyamıyorum

1
@birisi ben de yapmam ...
JBernardo

7

PostgreSQL - 225 boşluksuz karakter

242 → 225: Pencerecilik cümlecikleri ile değiştirilmiş alt sorgular .

\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 üzerinde test edildi

Kullanım ve çıkış:

$ 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 boşluksuz karakterler

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

Kullanım ve çıkış:

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

sadece kullanabilirsiniz x.split()(aynı zamanda kaldıracak \n)
JBernardo

@JBernardo Şerefe! 7 karakter kaydedildi.

Fonksiyon satırının herhangi bir makul uzunluğu için sys.stdin. Sadece başka bir golf oynadım ve paylaşacağımı düşündüm.
arrdem

4

AWK, 277 269 boşluksuz karakterler

in8 karakter kesmek için kullanılır .

Aralıklı sürüm ve yorumlanan sürüm:

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

kullanımı:

awk -f meta.awk data.txt

sed '/#/ d' meta.awk|sed ':a;$!N;s/\n//;ta;s/\s//g;'|wc -ckarakter saymak için kullanılır .
jpjacobs

3

Ruby, 146 karakter + 4 boşluk

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

Diğer çözümlerin çoğundan daha uzun ... ama JavaScript'te bulabildiğim en iyisi.

kullanım

Giriş bir J değişkeninde olmalıdır. Örneğin, bir konsolu açın ve şunu yazın:

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

Aynı mantık hakkında, CoffeScript'te:

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"

lengthBir değişkeni ve aboneleri kullanarak özniteliği kısaltmayı seviyorum .
Joey Adams

3

Yaygın Lisp - 546

(golf oynamakta olan çocuk parantez pekiştirirken boşluk saymaz)

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

Ağır golf oynadı, benim ortak lisp çözümüm gemideki en uzun ve en uzun süredir. Bu yüzden önemli ölçüde daha kısa bir bootloader yazarak ve benim gönderim olarak iddia ederek biraz hile karar verdi.(@ Boothby'nin gönderiminin bu davranışın lehine emsal teşkil ettiğini düşünüyorum)

Peter Taylor'a , bu önyükleyiciden çıkan her son karakteri sıkma yardımı için teşekkürler .

YAKA - 35

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

Kullanım : kedi. bash ./btstrp.sh

Joey Adams , bunun adil bir çözüm olmadığını belirtti, çünkü şartnamede açıkça ifade edilmeyen bir nokta olan "çözümün karmaşıklığını rasgele olarak kod boyutunda bir artış olmadan artırabilirim" dedi.


1
Bir for-loop 'dan daha kısa olmaz mıydı?
Peter Taylor

emin değilim ... ama daha kısa sürede buldu!
arrdem

1
Ayrıca, içine okunacak değişkeni belirtirseniz kullanmak zorunda kalmazsınız $REPLY. Dene while read x;do a=$x"\n"$a;done. Ve |son satırda s'den sonra boşlukları kaldırabilmelisiniz . Başka bir notta, dahili bir IP adresi kullanmanın çok faydalı olduğundan emin değilim: başkaları için işe yaramaz.
Peter Taylor

Veya hattawget -q http://url/l.lsp ;cat - |clisp l.lsp
Peter Taylor

Tamam, beni kedide kaybettin -
arrdem

2

Scala 269 ​​266 252 boşluksuz ve yeni satırsız.

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

çağırma:

cat user.lst | scala -i metagolf.scala

güncellemeleri:

  • basitleştirilmiş (l => l.foo) -> (_.foo)
  • yakarma
  • Gareths stdin ipucu

çözümüm:

* 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

*) yarışma dışı


Sen kullanabilirsiniz stdinyerine fromFile(System.in).
Gareth,

1
Teşekkürler. Şimdi 179 yükselişe ihtiyacım var ve bu mücadeleyi kazanacaktı - ceteris paribus.
kullanıcı bilinmeyen

Sorun değil. Hmm ... size 179 puan kazandırmak için yeterli trafik olduğundan emin değilim ...
Gareth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.