Meta Golf Challenge


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

Дедлайн: 20 серпня 2011 р. 00:00 UTC

Після закінчення конкурсу переможець повинен знайти свою програму, щоб знайти переможця. Не переможцям дозволяється використовувати свої програми, щоб знайти переможця, і сказати йому / їй використовувати його / її програму, щоб знайти переможця. :)

Переможець (див. Вище) отримує відповідь прийняту!

* Мова Whitespace має несправедливу перевагу в тому, що можна вводити необмежену складність без штрафу за кількість символів. Відповіді, написані в 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

8
Чи означає це, що рішення в Whitespace автоматично виграє?
Joey Adams

1
Звідки береться інформація про інші відповіді? Чи повинні наші програми підключатися до StackExchange і отримувати відповіді на це питання?
Джастін Морган

1
@Justin Наприкінці конкурсу я зроблю реальний вклад програми з відповідями. Я надав формат
JBernardo

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

1
Повинні ми сортувати результати за балами? Якщо так, то що нам робити у випадку зв'язання?
кабінка

Відповіді:


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, додав сильно коментовану версію
Пітер Тейлор

вау, дуже круто! дякую :-)
шесек

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

Це набагато читабельніше!


3
це має бути якесь мистецтво ascii, що щось зображує? якщо так, як це має виглядати?
Ононе

@oenone ти мені скажи.
JBernardo

2
це виглядає як слід, але я нічого не можу розпізнати
онон

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 символів.

Ви можете скинути .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

використовується 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атрибут за допомогою змінної та підписки.
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)
)

Моє загальне рішення, що лежить у гольфі, було і є найдовшим на борту. Тому я вирішив трохи обдурити, написавши значно коротший завантажувач і заявив, що це моє подання.(Я вважаю подання @ Бутбі прецедентом на користь такої поведінки)

Велика подяка Пітеру Тейлору за допомогу, яка видалила кожен останній шар із цього завантажувача.

БАШ - 35

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

Використання : кат. / Тест0 | баш ./btstrp.sh

Джої Адамс зазначив, що це не є справедливим рішенням, оскільки я можу "довільно збільшити складність вашого рішення без відповідного збільшення розміру коду", точка, чітко не виражена в специфікації.


1
Чи не буде цикл for-циклу коротшим, ніж до?
Пітер Тейлор

не впевнений ... але знайшов коротший час!
arrdem

1
Крім того, якщо ви вказали змінну для читання, вам не доведеться користуватися $REPLY. Спробуйте while read x;do a=$x"\n"$a;done. І ви повинні мати можливість видалити пробіли після |s в останньому рядку. З іншого боку, я не впевнений, що використання внутрішньої IP-адреси дуже корисне: воно не працюватиме для інших.
Пітер Тейлор

Або навітьwget -q http://url/l.lsp ;cat - |clisp l.lsp
Пітер Тейлор

Гаразд, ти загубив мене на
коті

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)
  • виклик
  • Гарети натяк на стдин

моє рішення:

* 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 оновлень ...
Гарет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.