メタゴルフチャレンジ


22

その課題については、その課題を解決する必要があります。

コンテストは終了しました!質問の終わりを確認してください

仕様:

  1. 最小のコード(任意の言語*)を作成します。
  2. 回答のスコアは次の合計です。
    • 空白なしのコード長。
    • 同じ言語を使用した回答の数の2乗。
    • コンテストで最も大きい言語の名前からあなたの言語の長さを引いた長さ。
    • マイナス投票からマイナス投票(別名マイナス投票)
  3. ユーザーの位置とスコアを書きます。
  4. 各ユーザーが回答を1つだけ書くことができます。
  5. 最も低いスコアが勝ちます。

テスト:

そのため、コンテストの終わりに、可能な入力は(STDIN)です。

列は次のとおりです。ユーザー名、言語、コード長(空白なし)、TotalVotes

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

ユーザー名に「My User Name」のようなスペースがある場合、「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

締め切り:2011年8月20日00:00 UTC

コンテストの終わりに、勝者は自分のプログラムを使用して勝者を見つけなければなりません。非受賞者がプログラムを使用して受賞者を見つけ、そのプログラムを使用して受賞者を見つけるように伝えることは許可されています。:)

勝者(上記参照)が回答を受け入れます!

* ホワイトスペース言語には、文字数のペナルティなしで無制限の複雑さを導入できるという不公平な利点があります。ホワイトスペースで書かれた回答はコンテストに参加しているかもしれませんが、勝つことはできません。

空白でプログラムのロジックを作成できる場合、勝つこともできません。これは主観的なトピックですが、プログラムがペナルティを受けずにサイズをかなり大きくできる場合、その状態になります。


最終入力

名前のアルファベット順(2011年8月20日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
それはホワイトスペースのソリューションが自動的に勝つことを意味しますか?
ジョーイアダムス

1
他の回答に関する情報はどこから来ますか?私たちのプログラムはStackExchangeに接続し、この質問に対する答えを採掘することになっていますか?
ジャスティンモーガン

1
@Justinコンテストの最後に、答えを使って実際のプログラムを入力します。私は形式を与えた
-JBernardo

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

1
出力をスコアでソートする必要がありますか?もしそうなら、ネクタイの場合はどうすればいいですか?
ブースバイ

回答:


11

Golfscript、83文字(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

セージ:48 42 41非空白(合計60246バイト)

ただ刺すために:

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

最初の行はに相当するはずですs='\t'が、SEコードブロックはタブを4つのスペースに変換します。

空白は次のように展開されます。

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]Sageはsuperpython *であるため、私の使用により、これがPythonスクリプトではないことが保証されます。残念ながら、execはPythonにフォールバックするので、事前解析する必要があります。

編集1:改行ではなくタブで分割します-私は何を考えていましたか?編集2:目に優しいコードを作成し、空白に別の「改行」を押して分割タブをリサイクルしました

*わかりました、完全ではありません:xorを壊します


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
これは何かを描いているある種のアスキーアートでしょうか?はいの場合、それはどのように見えますか?
オエノン

@oenone教えて。
-JBernardo

2
あるべきように見えますが、何も認識できません
-oenone

1
@oneoneも私は
...-JBernardo

7

PostgreSQL-225個の非スペース文字

242→225:サブクエリをウィンドウ句に置き換えました。

\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文字を保存しました。

sys.stdin ....の.readlines()を捨てることができます。妥当な長さの入力であれば、関数呼び出しは違いを生じず、いくつかの文字がかかります。別のゴルフでそれを理解し、私が共有すると思いました。
-arrdem

4

AWK、277 269非スペース文字

in8文字をカットするために使用されます。

スペース版とコメント版:

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

ルビー、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変数と添え字を使用して属性を短縮する方法が気に入っています。
ジョーイアダムス

3

Common Lisp-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)
)

重くゴルフをした、私の一般的なLispソリューションは、ボード上で最長でした。そこで、かなり短いブートローダーを作成し、それを自分の提出物として主張することで、少しcheすることにしました。(@Boothbyの提出は、この動作を支持する先例と考えています)

このブートストラップから最後のすべての文字を絞り出す手助けをしてくれたPeter Taylorに大いに感謝します。

バッシュ-35

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

使用法:cat ./test0 | bash ./btstrp.sh

ジョーイ・アダムスは、「対応するコードサイズを増やすことなくソリューションの複雑さを任意に増やすことができる」ため、これは公正なソリューションではないと指摘しました。


1
forループはuntilより短くありませんか?
ピーターテイラー

わからない...しかし、もっと短い時間を見つけた!
-arrdem

1
また、読み込む変数を指定する場合、を使用する必要はありません$REPLY。試してくださいwhile read x;do a=$x"\n"$a;done。そして|、最後の行のsの後のスペースを削除できるはずです。別の注意として、内部IPアドレスを使用することが非常に役立つかどうかはわかりません。それは他の人には機能しません。
ピーターテイラー

またはwget -q http://url/l.lsp ;cat - |clisp l.lsp
ピーターテイラー

-さて、あなたは猫に私を失った
arrdem

2

Scala 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ヒント

私の解決策:

* 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)
ガレス

1
ありがとう。今、私は179の賛成票が必要であり、挑戦に勝っていただろう-ceteris paribus。
ユーザー不明

問題ない。うーん... 179の賛成票を得るのに十分なトラフィックがあるかわからない...-
ガレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.