元高尔夫挑战赛


22

对于这一挑战,您必须解决这一挑战。

比赛结束了!检查问题的结尾

眼镜:

  1. 编写最小的代码(任何语言*)。
  2. 答案的分数是以下各项的总和:
    • 代码长度,不带空格
    • 使用相同语言的答案数的平方。
    • 比赛中最大语言名称的长度减去您语言的长度。
    • 减票减去减票(又名减投票总数)
  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

截止日期:2011年8月20日00:00 UTC

比赛结束时,获胜者必须使用其程序来寻找获胜者。允许非优胜者使用其程序来查找优胜者,并告诉他/她使用其程序来查找优胜者。:)

获胜者(见上文)得到了答案!

* Whitespace语言有不公平的优势,它可以引入无限的复杂性而不会增加字符数。用空白写的答案可能正在比赛中,但没有获胜。

如果您可以使程序的逻辑在空格中,那么您也不会赢。那是一个主观的话题,但是如果您的程序的大小可以大幅增加而不会受到惩罚,那么它就属于这种情况。


最终输入

名称的字母顺序(截至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
这是否意味着Whitespace中的解决方案将自动获胜?
乔伊·亚当斯

1
其他答案的信息从何而来?我们的程序是否应该连接到StackExchange并挖掘该问题的答案?
贾斯汀·摩根

1
@Justin在比赛结束时,我将使用答案输入实际的程序。我给出了格式
JBernardo

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

1
我们必须按分数对输出进行排序吗?如果是这样,如果出现平局该怎么办?
展位,2011年

Answers:


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 2011年

3
@shesek,添加了一个受到强烈评论的版本
Peter Taylor

哇,太酷了!谢谢:-)
shesek 2011年

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脚本。不幸的是,高管退回到了Python上,所以我必须做准备。

编辑1:在选项卡上拆分,而不是换行符–我在想什么?编辑2:使代码更容易被看到,并通过将另一个“换行符”推到空白处来回收拆分选项卡

*好的,还不完全:我们打破异或


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

@oenone,你告诉我。
JBernardo

2
看起来应该,但是我什么
都听不见

1
@oneone我也不...
JBernardo

7

PostgreSQL-225个非空格字符

242→225: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

蟒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 2011年

@JBernardo干杯!保存了7个字符。

您可以在sys.stdin ....上删除.readlines()。对于任何合理的输入长度,该函数调用都不会有所作为,并且会花费一些字符。刚刚在另一场高尔夫比赛中发现了这一点,并认为我会分享。
2011年

4

AWK,277269个非空格字符

用于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通过使用变量和下标来缩写属性的方式。
乔伊·亚当斯

3

普通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解决方案过去是而且也是板上最长的。因此,我决定通过编写一个明显更短的bootloader并声称是我的提交来作弊。(我认为@Boothby的陈述是支持这种行为的先例)

非常感谢彼得·泰勒Peter Taylor)的帮助,他从这个引导程序中挤出了最后一个字符。

重击-35

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

用法:猫./test0 | bash ./btstrp.sh

Joey Adams指出,这不是一个公平的解决方案,因为我可以“在不相应增加代码大小的情况下任意增加解决方案的复杂性”,这一点在规范中并未明确表达。


1
for循环会不会比for循环短?
彼得·泰勒

不确定...但是发现了较短的时间!
2011年

1
另外,如果您指定要读取的变量,则不必使用$REPLY。尝试while read x;do a=$x"\n"$a;done。并且您应该能够删除|最后一行中s 之后的空格。另一方面,我不确定使用内部IP地址是否非常有用:它不适用于其他任何人。
彼得·泰勒

甚至wget -q http://url/l.lsp ;cat - |clisp l.lsp
彼得·泰勒

好吧,你让我迷失了猫
arrdem'Aug 18'11

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 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)
加雷斯

1
谢谢。现在我需要179票赞成票,并且会赢得挑战-ceteris paribus。
用户未知,

没问题。嗯...不确定是否有足够的流量让您获得179票赞成票...
Gareth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.