Meta Golf Challenge

22

На этом вызове вы должны решить этот вызов.

Конкурс окончен! Проверьте конец вопроса

Технические характеристики:

  1. Напишите наименьший код (любой язык *).
  2. Оценка ответа является суммой:
    • Длина кода без пробелов .
    • Количество ответов, использующих один и тот же язык в квадрате.
    • Длина названия самого большого языка в конкурсе минус длина вашего языка.
    • Downvotes минус Upvotes (иначе минус общее количество голосов)
  3. Напишите позицию пользователей и оценки.
  4. Каждый пользователь может написать только один ответ.
  5. Самый низкий балл побеждает.

Тестирование:

Итак, в конце конкурса возможный вклад может быть (STDIN):

Столбцы: Имя пользователя, Язык, Длина кода (без пробелов) и Всего голосов.

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

Срок подачи заявок: 20 августа 2011 г. 00:00 UTC

В конце конкурса победитель должен использовать свою программу, чтобы найти победителя. Не победителям разрешается использовать свои программы, чтобы найти победителя, и сказать ему / ей использовать его / ее программу, чтобы найти победителя. :)

Победитель (см. Выше) получает ответ!

* Язык Whitespace имеет несправедливое преимущество, заключающееся в том, что он может вводить неограниченную сложность без штрафа за количество символов. Ответы, написанные в пробеле, могут быть на конкурсе, но не могут победить.

Если вы можете сделать логику своей программы в пробелах , вы также не сможете победить. Это субъективная тема, но если ваша программа может значительно увеличиться в размерах без наказания, она попадает в такое состояние.


Финальный ввод

Алфавитный порядок названий (по состоянию на 20 августа 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

Так как ответы, как мои, так и Бутби, не могут быть выиграны, победитель должен объявить себя победителем, отредактировав этот вопрос и опубликовав окончательный результат ниже.

Окончательный вывод

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
источник
8
Означает ли это, что решение в Whitespace автоматически победит?
Джои Адамс
1
Откуда поступает информация о других ответах? Должны ли наши программы подключаться к StackExchange и искать мои ответы на этот вопрос?
Джастин Морган
1
@Justin В конце конкурса я сделаю реальный ввод программы с ответами. Я дал формат
JBernardo
1
@Harpyon <> <ti dexif I! SknahT
Дж.Бернардо
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, добавил сильно прокомментированную версию
Питер Тейлор
вау, очень круто! спасибо :-)
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]гарантирует, что это не скрипт Python, так как Sage является суперпифоном *. К сожалению, 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

Это гораздо более читабельно!

JBernardo
источник
3
это что-то вроде искусства ascii, изображающего что-то? если да, как это должно выглядеть?
Энон
@oenone, ты мне скажи.
Дж. Бернардо
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.2 уровне

Использование и вывод:

$ 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 символов.
Вы можете отказаться от .readlines () в sys.stdin .... для любой разумной длины ввода вызов функции не будет иметь значения и будет стоить несколько символов. Просто понял это в другом гольфе и подумал, что поделюсь.
arrdem
4

AWK, 277 269 ​​непробельных символов

Используется, 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
jpjacobs
источник
используется 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]*' '}
Lowjacker
источник
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"
shesek
источник
Мне нравится, как вы сокращаете 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 было и остается самым длинным на доске. Поэтому я решил немного обмануть, написав значительно более короткий загрузчик и заявив, что это мое представление.(Я считаю, что представление @ Boothby является прецедентом в пользу такого поведения)

Большое спасибо Питеру Тейлору за его помощь в выдавливании каждого последнего символа из этого загрузчика.

БАШ - 35

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

использование : cat ./test0 | bash ./btstrp.sh

Джои Адамс отметил, что это не справедливое решение, потому что я могу «произвольно увеличить сложность вашего решения без соответствующего увеличения размера кода», что явно не указано в спецификации.

arrdem
источник
1
Разве цикл не будет короче, чем до?
Питер Тейлор
не уверен ... но нашел короче пока!
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)
  • вызов
  • Гаретс намек на 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 голосов, и я бы выиграл вызов - при прочих равных условиях.
пользователь неизвестен
Нет проблем. Хм ... не уверен, что достаточно трафика, чтобы получить 179 голосов ...
Гарет