메타 골프 챌린지


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

사용자 이름에 "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)가 있습니다.

파이썬에는 6 개의 문자 ( 9 - 6 = 3)가 있습니다.

펄에는 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 의 솔루션 이 자동으로 승리 한다는 것을 의미합니까 ?
Joey Adams

1
다른 답변에 대한 정보는 어디에서 제공됩니까? 우리의 프로그램은 StackExchange에 연결되어 있고이 질문에 대한 답변을 제공합니까?
저스틴 모건

1
@Justin 공모전이 끝나면 실제 프로그램을 답변으로 입력하겠습니다. 나는 형식을 주었다
JBernardo

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

1
점수로 결과를 정렬해야합니까? 그렇다면 넥타이의 경우 어떻게해야합니까?
boothby

답변:


11

골프 스크립트, 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

와우, 정말 멋져요! thanks :-)
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]세이지가 superpython 때문에이, 파이썬 스크립트되지 않도록 *. 불행히도 exec는 Python으로 돌아갑니다 ... 그래서 준비해야합니다.

편집 1 : 줄 바꿈이 아닌 탭으로 나누기-어떻게 생각 했습니까? 편집 2 : 눈에 코드를 더 쉽게 만들고 공백에 다른 '줄 바꾸기'를 밀어서 분할 탭을 재활용했습니다.

* 좋아요, 우리는 xor를 깨뜨립니다.


10

파이썬, 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

@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

파이썬 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 자 + 공백

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

자바 스크립트, 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")

커피 스크립트, 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)
)

심하게 골프를 쳤을 때, 나의 일반적인 lisp 솔루션은 보드에서 가장 길었고 가장 길었습니다. 그래서 나는 훨씬 짧은 부트 로더를 작성하고 그것을 제출물로 주장함으로써 약간의 부정 행위를하기로 결정했습니다.(@Boothby의 제출은이 동작을 선호하는 선례라고 생각합니다)

이 부트 스트 래퍼에서 모든 마지막 문자를 짜내는 데 도움을 준 Peter Taylor 에게 큰 감사를 전합니다 .

배쉬-35

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

사용법 : cat ./test0 | bash ./btstrp.sh

Joey Adams 는 "해당 코드 크기를 늘리지 않고도 솔루션의 복잡성을 임의로 증가시킬 수 있기 때문에"이 방법은 공정한 해결책이 아니라고 지적했다.


1
for-loop가 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
Peter Taylor

좋아, 당신은 고양이에 나를 잃었다
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)
  • 기도
  • Gardins의 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 upvotes을 얻을 충분한 트래픽이 있는지 확실하지 않습니다 ...
Gareth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.