Подолання розміру кластера


37

Задоволений надійністю флеш-пам’яті, ви вирішили зберігати всі свої програми на одній із тих старих хороших дискетів на 1440 KiB. Однак, скопіювавши навіть 3000 програм, диск був заповнений. Як це навіть можливо? Коли ви є вмілими в мистецтві кодового гольфу, більшість ваших програм не мають навіть 100 байт, тому має бути багато місця ...

Запитавши про це у Super User, ви виявите, що ви помилилися за розміром кластера файлової системи , злим сюжетом дизайнерів FAT12, який залишає значну частину вашої дискети невикористаною і змушує купувати більше, ніж вам потрібно.

Купуєте більше дискети? Ніколи! Розмір кластера буде меншим питанням, якщо ми просто збережемо кілька програм в одному файлі, що можливо, тому що різні компілятори / інтерпретатори поводяться по-різному для одного і того ж вихідного коду.

Завдання

Напишіть поліглот, який вписується в один кластер (512 байт або менше) і вирішує якомога більше таких завдань.

  1. Прочитайте всі матеріали та надрукуйте їх.

  2. Друк Привіт, світ! .

  3. Прочитайте рядок / аргумент ( ім'я ) як введення та друк З днем ​​народження, [ім'я]! .

  4. Прочитайте всі вкладки та друк я люблю вкладки! якщо він містить один або більше таблиць (0x09), і я ненавиджу пробіли! якщо цього немає.

  5. Прочитайте два рядки / аргументи та надрукуйте триєдне значення, якщо другий є підрядком першого, а помилковим - якщо ні.

  6. Прочитайте рядок / аргумент і надрукуйте триєдне значення, якщо його символи знаходяться у строго зростаючому порядку, а помилкове значення - якщо ні.

  7. Прочитайте рядок / аргумент та символ та надрукуйте покажчики всіх подій цього символу.

  8. Прочитайте рядок / аргумент і надрукуйте будь-який із символів з найбільшою кількістю подій.

  1. Прочитайте два цілих числа між 0 і 255 і надрукуйте їх суму.

  2. Прочитайте одне ціле число між 0 і 255 і надрукуйте коефіцієнт і залишок його ділення на 7 .

  3. Прочитайте одне ціле число між 1 і 255 і надрукуйте триєдине значення, якщо це складене число (ні 1, ні просте) і помилкове значення, якщо ні.

  4. Прочитайте одне ціле число між 1 і 255 і надрукуйте триєдне значення, якщо це потужність 2, а помилкове значення - якщо ні.

  5. Прочитайте два цілих числа між 0 і 255 і надрукуйте більші.

  6. Прочитайте десятичне ціле число від 0 до 255, роздрукуйте його шістнадцяткове представлення.

  7. Прочитайте одне ціле число між 0 і 255 і надрукуйте його вагу Хеммінга (кількість 1-біт).

  8. Зчитує одне ціле число п між 1 і 13 і роздрукувати F п , то п - е числа Фібоначчі .

    Наприклад, для введення 13, друку 233.

  1. Прочитайте рядок / аргумент введення та кадруйте його.

    Наприклад, для вводу Programming Puzzles & Code Golfнадрукуйте це:

    +---------------------------------+
    | Programming Puzzles & Code Golf |
    +---------------------------------+
    
  2. Прочитайте прямокутний блок символів і обертайте його на чверть обороту за годинниковою стрілкою.

    Наприклад, для введення

    tye
    xll
    epb
    tma
     id
     sa
    s e
    i r
    hsn
    Tiu
    

    надрукувати це:

    This  text
    is  simply
    unreadable
    
  3. Прочитайте ціле число від 1 до 40 і надрукуйте ромб тієї довжини сторони.

    Наприклад, для вводу 3надрукуйте це:

      /\
     /  \
    /    \
    \    /
     \  /
      \/
    
  4. Роздрукуйте це:

    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    

Оцінка балів

Виграна відповідь, що вдається об'єднати найбільшу кількість програм у одному файлі, який вміщує один кластер у 512 байт. Краватки розбиваються на кількість байтів (краще нижче).

Додаткові правила

  • Для кожного завдання, яке ви претендуєте на свій рахунок, той самий файл (байт на байт) повинен складати повну програму - мовою, яку ви обрали - яка вирішує цю конкретну задачу.

  • Кожне завдання має бути вирішено іншою мовою.

    Мови вважаються різними, якщо вони не є різними версіями однієї мови. Наприклад, є лише один JavaScript, один Python і один TI-BASIC, але C, C ++, Octave і MATLAB - це чотири різні мови.

  • Вибрана мова для кожного завдання повинна відповідати нашому звичайному визначенню мови програмування .

    Крім того, мова повинна бути опублікована та впроваджена до 9 вересня 2015 року.

  • Ваш компілятор / перекладач може не вимагати будь-яких нестандартних прапорів для отримання очікуваної поведінки.

    Винятки з цього правила включають прапори, необхідні для вказівки певної мови, для читання програми з (одного) файлу або придушення банера.

  • Вхід для кожного завдання буде складатися з друкованих символів ASCII (0x20 до 0x7E) та лінійних каналів (0x0A), і не перевищуватиме 255 байт у довжину.

  • Усі цілі числа можна читати в десяткових або одинарних формах, якщо в задачі не вказано інше.

  • Поведінка неправильного введення не визначена.

  • Ви можете читати дані зі STDIN (або найближчої альтернативи) або як аргументи командного рядка.

    Якщо завдання вимагає зчитування двох фрагментів вводу, ви можете їх прочитати - у будь-якому порядку - розділити однобайтовим роздільником, який ви обрали, як окремі аргументи командного рядка або один від STDIN, а інший як аргумент командного рядка.

    Якщо однією з вхідних частин є лінія, єдиний можливий роздільник - це передача ліній.

  • Роздрукуйте висновок до STDOUT (або найближчої альтернативи). Весь вихід на STDERR буде ігнорований.

  • Для кожного завдання застосовуються стандартні правила .

    Зокрема, це включає пропуски, заборонені за замовчуванням , за винятком жорсткого кодування виводу , що явно дозволено для цього виклику.


1
Чи досить JavaScript і CoffeeScript досить різні, щоб їх можна вважати різними мовами?
Пуховик

Так, вони вважаються різними.
Денніс

17
ваш виклик №4 - це нісенітниця> :(
Doorknob

Цитата: Весь вихід на STDERR буде ігнорований. Чи означає це, що коли ми викликаємо скрипт / програму 2>/dev/nullі отримуємо правильний вихід до stdout, це нормально? Просто для впевненості.
Cabbie407

2
@ Cabbie407 Точно. За консенсусом щодо мета це правило фактично застосовується за замовчуванням до всіх викликів. Я просто хотів переконатися, що всі про це знають.
Денніс

Відповіді:


17

12 мов, 418 байт

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
 \@-[I love tabs!]o#
  \ >qi---@
( @-[ ]e<''';print hex(
input())#-[I hate spaces!]o#"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"))?(!?)
'''=#print(([1 1;1 0]^int(readline()))[1,2])
#=
Tr is here.
>Tr, Hello, World!
>X Tr
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#=#.91<0#'''#";

Це веселе завдання. Встановити більше мов стає важко, але, маючи цю кількість байтів, я міг би зробити ще одну.

Безкоштовно використовує 2D мови. Зауважте, що графік між[ ]@-[ ]e< рядком у рядку є вкладка. Також для цього потрібні \nзакінчення рядків для роботи TRANSCRIPT.

Прелюдія (Завдання 1 / Кіт)

( 
      )?(!?)

?(!?)- це лише прямий переклад ,[.,]на BF. ()Петлі прелюдії діють як []петлі BF , тому все з( з крайнього лівого стовпця, до того, )як основна програма не буде виконана.

Правила синтаксису прелюдії означають, що круглі дужки повинні відповідати (читання стовпців зліва направо), і в одному стовпчику може бути лише одна дужка. Крім цього, це досить проста мова.

Переконайтеся, що NUMERIC_OUTPUTвстановлено значенняFalse якщо ви використовуєте інтерпретатор Python.

TRANSCRIPT (Завдання 2 / Привіт, світ)

Tr is here.
>Tr, Hello, World!
>X Tr

TRANSCRIPT - тематичний езоланг, заснований на інтерактивній художній літературі. Рядки, не розпізнані TRANSCRIPT, ігноруються, що полегшує їх вміщення.

Tr is here.оголошує Trзмінну рядка, а другий рядок встановлює вміст змінної Hello, World!. X Tr( Xдля огляду) потім виводить рядок.

Хоча TRANSCRIPT дуже легко вписується, це досить багатослівна мова, тому я змусив її прийняти найпростіший виклик.

Fission (Завдання 3 / Повідомлення про день народження)

R"Happy Birthday, "[?S"!"*
                   \!/

яка друкує першу частину, котирує вхід невеликою 2D петлею, потім видає зворотний знак оклику. Це Rозначає, що атом починається тут, рухаючись вправо, що корисно, оскільки цю програму можна переміщати де завгодно.

Rail (Завдання 4 / вкладки)

$'main'
 \@-[I love tabs!]o#
  \ >qi---@
  @-[ ]e<
         -[I hate spaces!]o#

Як і Fission, Rail - це двовимірна мова, яка має перевагу в тому, що можна пересуватися куди завгодно. Виконання починається з $зmain функції, прямуючи на південний - схід.

Спочатку ми спускаємось вниз \, повертаємо ліворуч на -, натискаючи на [<tab>]що натискає на вкладку. e<то гілки на основі EOF - якщо EOF, ми головуємо вниз і друкуємо "I hate spaces!"перед зупинкою, інакше ми головуємо вгору. Якщо ми попрямували вгору, ми читаємо наступний графік і порівнюємо його з вкладкою, ще раз розгалужуючи - якщо вкладка, голова вгору та друкуйте "I love tabs!"перед зупинкою, інакше головою вниз і продовжуйте цикл введення.

Ця програма досить дорога, але, оскільки TRANSCRIPT взяв Hello World, важко було підібрати та відповідне завдання для Rail.

> <> (Завдання 6 / Вихідний вхід)

"1\"#      \""" "" "


>0[0>i:0(?v:{)?v0n;
       ;n1< .95<


        .91<

Друкує, 1якщо суворо зростає,0 інакше.

> <> - це ще одна двовимірна мова, і виконання починається зліва вгорі. "..."- це струнний режим, що розсовує внутрішні символи одна за одною. Після першої струни ми натискаємо #, яка відображає IP зліва, натискаючи більше струн і обертаючись (> <> це тороїдальний) перед ударом \, дзеркало, яке відображає нас вгору.

Внизу програми є те .91<, що телепортує нас (9, 1), де є основна програма. Після цього 0[видаляється з мотузки весь мотлох, 0натискає нуль, щоб відобразити останню прочитану таблицю, і після цього це просто читання символів один за одним, переконуючись, що ми все ще зростаємо.

Можливо, краще перемістити основну програму вниз, а не телепортувати, але я з цим розбираюся пізніше, якщо потрібно.

Befunge (Завдання 9 / Доповнення)

"1\"# &&+.@

Випробуваний з перекладачем, знайденим тут . Це досить проста програма, із початку натискання на непотрібну струну та #стрибки через простір. Після цього це лише основна програма &&+.@.

Лабіринт (Завдання 10 / Divmod на 7)

"1
 =
 '
 <
""'("']
 ?
 :_7/!\_7%!@

Зручно 'і "є НОП у Лабіринті, які діють як прогулянкова стежка в лабіринті. Я пропускаю безладну навігацію, але в основному багато поворотів і блукань відбувається, перш ніж ми вдаримося ?, що є початком основної програми.

Програма не зовсім залита для того, щоб врахувати прелюдію (наприклад, ? , вводиться читання в Prelude).

Python 2 (Завдання 14 / Шістнадцятковий)

"1\"# &&+.@\""" "" "
#=
''''
xxx
xxx''';print hex(
input())#xxx
'''
xxx
xxx'''#";

В xxxs представляє невідповідні частини закоментувавши від багаторядкових рядків або коментарів. print hex(input())Посеред є основним прогамом. Це виводиться з провідним 0x, але я припускаю, що це нормально (якщо ні, то все одно це легко виправити).

Перший рядок - це рядок, "1\"# &&+.@\""за яким слідують два " "s. Ці три рядки об'єднані парсером і залишаються невикористаними (цей перший рядок працює аналогічно Рубі та Джулії пізніше).

GolfScript (Завдання 15 / вага Хеммінга)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}

Перший рядок висуває три рядки, а другий - коментар. ''''натискає ще два рядки, потім <<робить два порівняння ( sігнорується). Нарешті,""'("' висуває ще дві струни.

Потім все це сміття видаляється, загортаючи його в масив і отримуючи перший елемент ( ]0=), який є початковим входом у стек. Потім ми оцінюємо вхід з ~, перетворюємо на двійковий, а 2baseпотім підсумовуємо біти {+}*. Наступний }- неперевершений, і супер коментує решту програми.

Джулія (завдання 16, Фібоначчі)

"1\"# &&+.@\""" "" "
#=
xxx
xxx=#print(([1 1;1 0]^int(readline()))[1,2])
#=
xxx
xxx=#.91<0#xxx

#=починає багаторядковий коментар і =#закінчує багаторядковий коментар. Основна програма використовує матричну експоненцію для обчислення чисел Фібоначчі (взяті з Розетти ).

Ruby (кадр завдання 17 / ASCII)

"1\"# &&+.@\""" "" "
#=
''''
<<s
xxx
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#xxx

Ця програма передбачає, що введення не закінчується проривом нового рядка.

У нас є марний рядок, коментар, інша марна рядок, то гередок, який коментує більшу частину програми. Після цього йде основна програма з подальшим #коментарем у одному рядку .

CJam (Завдання 19 / Diamond)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("xxx
"
R"xxx"[?S"!"*"
xxx
xxx"ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"xxx
xxx
xxx";

Два пробіли в кінці першого рядка повинні задовольняти CJam, оскільки #=є двома двійковими операторами. Я не буду надто багато деталізувати з цим, але в основному це безлад, при цьому основна програма є простою

ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>

між.

Ключовим диференціатором GolfScript від CJam є те, що в CJam одна цитата 'не починає і не закінчує рядки, а натомість натискає наступний символ до стеку. Це означає, що в CJam

'("'

натискає a, (потім починає рядок з "(перший знак якого є' ), тоді як вище - просто пряма одиночна рядок у GolfScript.

Спробуйте в Інтернеті . 1>використовується замість (обліку прелюдії.


Ось 12 мов, 373 байти . Деякі завдання перемістилися, TRANSCRIPT було видалено (це зробило Rail занадто дорогим) і додано Схему (курка). Це лише мій майданчик для гольфу для оновлення, оскільки оновлення основної публікації займає назавжди.

"1\"09!#.&&+.@"" "" "#|"
#=
''''
<<s
11]0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
(-[Hello, World!]o#''';print(input()in input());'''"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"=#print(([1 1;1 0]^int(readline()))[1,2])#=)?(!?)
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a# =##'''#";e# |#(print(format"~x"(eval(read))))

Я міг би зберегти кілька байтів для Джулії, оскільки невиправлені багаторядкові коментарі викликають помилку в STDERR.


Чудові речі. Яке завдання для TRANSCRIPT?
Cabbie407

@ Cabbie407 Я все ще намагаюся оптимізувати, яка мова отримує яке завдання, але наразі TRANSCRIPT взяв Hello World, і Rail змінився на завдання вкладок.
Sp3000

Ах, тепер я бачу це, ;)я зволікаю змінити щось у своїй відповіді через довгий опис. lol
Cabbie407

26

7 8 9 10 мов, 398 431 447 507 байт

Це, мабуть, найбільше, що я можу вписати в поточне рішення.

#if      + 0+0/*^",v  +- '[.,][[" ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
a=0--0;b=input();print(sorted(set(b))==list(b));[[""""                 ^ <
print("Hello, World!")--[[vv? +<
#endif/*  >.!0 + +1ffr"!"~< */
#include<stdio.h>/*>:1 +?!^>i:1^*/
int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1//**/1==2
){printf("%x",/*>&:7/.7%.@*/i);}else{for(;--i-1>0;a=b,b=c)c=a +b;printf("%d",b);}}/*]]--"""]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J "` + +,*.]]]*/SSSTNSSNSNSTNTTTTTSSSTNSNSTNTTTTTTSSTNTTSNSSNNSSSNTTTTNSTNNNN

В останньому рядку міститься закодований код Whitespace, щоб SE не їв його. Щоб запустити код, замініть всі Sпробілами, Tвкладками та Nновими рядками.

C89, завдання 16

Ось що бачить компілятор:

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1/ 1==2
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Все інше знімається як коментарі або всередині #if 0.

C ++, завдання 14

Я використав трюк, вкрадений у звідси, щоб розмежувати C89 від C ++.

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Луа, завдання 2

Ось основна структура.

#comment
a=0--comment
print("Hello, World!")--[[
... multiline comment ...
]]--comment

Брейнфук, завдання 1

Я просто повинен був забезпечити, щоб не було знайдено нескінченних циклів або бродячих .,. Багатолінійні коментарі Луї також подвоюються як коментарі BF. Все, крім перших двох символів, - це великий цикл NOP.

++,+-[.,][[,+++.+<--[[<,--[[+<>.++<<.>>+>,,,,,>..--->,+,]]--]]+++-+[++,.]]]

Пітон, завдання 6

Знову ж таки, я використовую особливості мови для NOP або коментую інший код.

#comment
a=0--0;b=input();print(sorted(b)==list(b));[["""
... multiline string ...
"""]];#comment

Pyth, завдання 17

Піт приємний для цієї речі. Він приймає перший #як while True:цикл, який мовчки виходить з помилки . Отже, я просто роблю більшу частину коду рядком (щоб уникнути ;припинення циклу рано), потім просто закінчую цикл, виходжу з іншого, створеного коментарем Python, і виконую завдання. Ось це з усіма не порожніми рядками, заміненими на " string ", вони все ще функціонально еквівалентні:

#if      + 0+0/*^" string " ,yadhtrib yppaH" string """" string "Hello, World!" string "!"  string "%d"  string "%x" string "%d" string """]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J " string

> <>, завдання 3

Цей дуже цікавий. Виконання відскакує в коді, використовуючи стрибки, де необхідно, щоб обійти перешкоди. Відповідні частини:

#                  v            " ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
                   i                                                   ^ <
                   !      vv? +<
          >.!0 + +1ffr"!"~<
                   >:1 +?!^>i:1^

Зоряне , завдання 9

Тут мені довелося почати переходити на мови "відкинути всі символи, крім". Все, що викреслили, виглядає так:

      + +*,  + '., , + + +. +*                  ,  +*  . + + *.* +*  ,,,,**,*..*, +,* + + +* + ` + +,*.*

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

      + +*,  + + +,*.*

Befunge-98, завдання 10

Працює подібно до <<>. На щастя, #це дзеркало в <<> і пропуск у Бефунге, тому ми можемо реалізувати різні поведінки. Також 0/0 == 0.

#if      + 0+0/*^
                >&:7/.7%.@

Пробіл , завдання 13

Це було останнє, що мені підходить. Перші кілька рядків просто натискають нулі на стек, оскільки вони містять лише пробіли та нові рядки з "звичайного" коду. Код закодований; замініть все Sпробілом, Tвкладками та Nновими рядками.

SSSSSSSSSSSSSSSN
SSSSSSSSSSSSSSSSSSN
SSN
SSSSSN
SN
SSN
SSSSSSSSSSSTN
SSN
SN
STN
TTTTTSSSTN
SN
STN
TTTTTTSSTN
TTSN
SSN
N
SSSN
TTTTN
STN
N
N

9

17 різних версій Pip, 383 байти (недійсна)

Хоча це питання було пісочницею, я прочесав усі перегляди моєї мови Піп і придумав поліглот, використовуючи 17 з них. На жаль, версії однієї мови заборонені правилами виклику зараз, але з дозволу Денніса та відмови від відповідальності я все-таки публікую свою роботу.

Сирий код

I!ga:0m@0:0v:uIN[(oTM0,0i)EN1N1Y1RCkw(hR`1.+0``&2o`)@>3@AB0`u`rZ4AB6({a}V7)BN8AZ9@m]Iv<2W##YqlPByc:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}m:'+.'-X#a+2.'+.n."| "Iv=5La{i+:oSio}j:ak:bPv=11?a>1&0INa%(2,a)[((J_M ZRVl)|0)Jnl?lJnlcJnd.n.RVdm.a.RVmih:$+TBa({j@aEQk}FI0,#a).saTB16a>b?abh=1ua//7.s.a%7a+bbINa"Happy Birthday, ".a.'!"Hello, World!"]@v

Стратегія

У Pip малі літери є змінними. Великі літери є складнішими: вони розбиваються на прогони щонайменше двох символів, які можуть бути операторами або змінними. Якщо маркер верхнього регістру конкретно не визначається як змінна чи оператор, передбачається, що це не визначена змінна, яка оцінює нуль.

Отже, щоб розрізняти дві версії Pip, я просто повинен знайти якийсь змінний або алфавітний оператор, який був доданий у новішій із двох. У старшій буде замість нуля. Код v:uIN[...]поєднує великий список, що містить один з цих перевірок для кожної версії, яку я хочу перевірити, з'ясовує, скільки нулів у цьому списку ( uзмінна явно ініціалізована до нуля), і зберігає число в v(для "версії") .

Після деяких інших обчислень, є ще один великий список, який обчислює результати 17 завдань із завдання і використовує vдля вибору одного, виходячи з того, що це версія.

Версії та завдання

0,15.09.04

Діагностичний: (oTM0,0i)(виправлено помилку за допомогоюTM оператором ri, де обрізка 0 символів з кожного кінця рядка дасть натомість порожню рядок; індексація в порожню рядок дає нуль)

Завдання 18: Iv<2W##YqlPBy(налаштування: прочитати всі рядки з stdin, якщо vменше 2), після чого ((J_M ZRVl)|0)Jn(зворотний список рядків, переміщення та приєднання до рядка)

0,15.08.06

Діагностична: EN1(доданоEN помірний оператор)

Завдання 1: Iv<2W##YqlPBy(той же код налаштування, що і вище), після якого l?lJnl(приєднатись до нових рядків)

0,15.08.03

Діагностичний: 1N1(додається Nяк коротка версіяIN оператора)

Завдання 20: c:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0(налаштування: генерувати список, що містить верхню та нижню половинки шахової дошки та зберігати c), а далі cJn(приєднатись до нового рядка)

0,15.08.01

Діагностичний: Y1(доданий Yоператор ank)

Завдання 19: Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}(встановлення: якщо v3, зберіть верхню половину ромба в d), далі d.n.RVd(зворотний бік для нижньої половини та приєднайтеся до нового рядка)

0.15.06.19

Діагностичний: RCk(додано Random Choice operator)

Завдання 17: m:'+.'-X#a+2.'+.n."| "(налаштування: вбудувати +----+\n| рядок m), далі m.a.RVm(обернути введення mта зворотній бік m)

0,15.06.12

Діагностична: k(попередньо ініціалізована kзмінна до ", "; раніше вона була не визначена і, таким чином, нульова)

Завдання 16: Iv=5La{i+:oSio}(якщо v5, генеруйте число Фібоначчі в i), за яким слідуєi

0.15.06.08 (зверніть увагу: номер версії не змінено до наступного введення)

Діагностичний: w(попередньо ініціалізована wзмінна на `\s+`)

Завдання 15: h:$+TBa(перетворити вхід у двійкові та сумарні цифри; зберегти результат hдля завдання 12 пізніше)

0,15.05,29

Діагностична: (hR`1.+0``&2o`)@>3@AB0

Цю версію додано &як шаблон заміни для всього узгодженого рядка в заміні регулярних виразів (натхненний sed). Наведений вище код бере h( 100) і замінює його `&2o`(тобто "1002o"в новіших версіях, але просто "&2o"у старих версіях). Потім він розрізає всі символи після 3-го ( "2o"у новіших версіях, ""у старих версіях) і намагається індексувати цей рядок. Індексація у порожній рядок дає нуль.

Завдання 7: j:ak:b(налаштування: копіює локальний vars a, bу глобальний vars j, kщоб вони були доступні всередині функції), за яким слідує ({j@aEQk}FI0,#a).s(фільтр для індексів, aде відповідний символ дорівнює b, і приєднатися до місця)

0,15.05,26

Діагностична: `u`(доданий тип шаблону; у попередніх версіях зворотні посилання ігноруються як нерозпізнані символи, а вираз оцінюється на u, що дорівнює нулю)

Завдання 14: aTB16(новонавернений Tпро Bаза 16)

0,15.05,24

Діагностична: rZ4(створена rспеціальна змінна, яка повертає випадкову величину між 0 і 1 щоразу, коли вона посилається; раніше вона не була визначена і, таким чином, вираження оцінювалося на нуль)

Завдання 13: a>b?ab(потрійний вираз)

0,15.05.12

Діагностична: rZ4(доданоZ оператор ip)

Завдання 12: h=1(сума біт від завдання 15 повинна дорівнювати 1)

0,15.05.11

Діагностичний: AB6( ABоператор доданої величини)

Завдання 11: Pv=11?a>1&0INa%(2,a)[...]@v(якщо vце 11, виведіть, 1якщо вхід більший за 1, а менша кількість ділить його точно, 0інакше; якщо vнічого іншого, використовуйте vяк індекс до списку, щоб вирішити, що вивести)

0,15.05.02

Діагностичний: ({a}V7)(доданий Vоператор; коли його Vбуло визначено, це надіслало аргументи нульові та 7 функції, {a}яка повертає перший аргумент)

Завдання 10: a//7.s.a%7(вхід int-розділений на 7 і mod 7, пробіл)

0,15.04.26

Діагностичний: BN8(доданий Bтаким чином Nоператор вирівнювання )

Завдання 9: a+b

0,15.04.23

Діагностична: AZ(попередньо ініціалізована AZзмінна літера у великому алфавіті)

Завдання 5: bINa( INдає кількість подій)

0,15.04.20

Діагностична: m@0:0далі9@m

mМінлива preinitialized до 1000. У цій фіксації, то @оператор був встановлений для повернення lvalues; раніше, призначивши, m@0подав попередження і нічого не зробив. Таким чином, пост-помилка, перше твердження встановлюється mна 0000, що є юридичним індексом для 9; попередня помилка, mзалишається 1000, що не є юридичним показником. (Індекси ще не були циклічними.)

Завдання 3: "Happy Birthday, ".a.'!

0.15.04.18

Всі попередні діагностики призводять до того, що нуль додається до діагностичного списку.

Завдання 2: "Hello, World!"


Більшість інших кодів - це налаштування, які я повинен був зробити, щоб уникнути помилок у різних версіях. Ця публікація вже занадто довга, тому, якщо ви хочете дізнатися про все, що я не пояснив, давайте перейдемо до дискусії в езотеричній чаті .


4

6 мов, 226 байт (229 залежно від того, як \x1bприйнято!)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));/*
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Отже, я не думаю, що я зробив найкращий вибір мов, і я думаю, що це не особливо конкурентоспроможно, але я все-таки вважаю це цікавим викликом! Загалом, не багато викликів завершено, але я, мабуть, міг би вирішити виклик у пробілі чи щось подібне, але це те, що я маю досі:


1. Брейнфук

[+.]>>+[>,]<[<]>>[.>]>[<.[],[][,],,[],[].]

Тестовано на http://copy.sh/brainfuck/ та http://brainfuck.tk/ .

Після зняття всіх ігнорованих символів, у вищевказаній програмі все, що нам залишилося, - це лише приклад програми cat з деякими додатковими порожніми петлями для обходу використання інших символів інших мов.

2. Рубін

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Використання:

ruby cluster

Вище наведений код після видалення всіх коментарів. Перший рядок зовсім марна в Рубіні , як ми визначимо деякі регулярні вирази , щоб утримувати Befunge-93 і Brainfuck код, а потім ми створюємо масив , щоб утримувати Helloі Worldта роздрукувати його з допомогою printf(додати ,і! ).

3. Перл

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Використання:

perl cluster <name>

Дуже схожий на Ruby, за винятком того, що оскільки ми зберігаємо посилання на масив $a, коли ми намагаємося отримати доступ $a[0]до порожнього, ми можемо замінити його текстом для виклику 3 Happy Birthdayта pop(який показує останній аргумент для програми командного рядка ).

4. JavaScript

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;
$a=['Hello','World'];
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Використання: вставте в консоль браузера і запустіть.

Як і Ruby і Perl, перший рядок, по суті, створює непотрібні RegExpоб'єкти, ми зберігаємо марний масив у $aта інстанціюємо два непотрібні рядки, один, що містить код Ruby / Perl, а другий містить новий рядок та a #, тоді ми prompt()для введення та alert()очікуваного результату більшість людей для виклику 4. Ми закінчуємо ще одним марнимRegExp об'єктом, щоб закрити мозковий шлейф.

9. Befunge-93

/&&#[+.#]@

Тестовано на http://www.quirkster.com/iano/js/befunge.html .

Як я розумію, він /ділить стек і виштовхує результат, який не має ніяких побічних ефектів, окрім натискання NaNна вищевказаний сайт, &просить ввести ціле число, щоб ми прочитали обидва числа, необхідні викликом 9, на стек, #гарантуючи, що ми пропускаємо через [який є для brainfuck, +потім додає два найбільші числа в стек, .виводить їх, #]для brainfuck знову і @виходить.

13. PHP (працює на Bash)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));

Використання:

php cluster <x> <y>

У PHP все, що не входить в <?теги, виводиться дослівно, тому це виводить код Befunge-93 та brainfuck, тому ми die()негайно в коді виводимо екран clear ( \x1bc), а потім max()два перших аргументу.


Ви можете поставити буквальний символ ESCape в рядковий літерал, просто додайте примітку, що він є ( the first character in the first string literal is the byte ASCII 27); ваш рахунок 226.
кіт

@cat Так, я думаю, ти маєш рацію, я покинув, як є, але я поставив 226 в назві. Я забув, як мені сподобалось це завдання, я, мабуть, міг би зробити трохи більше зараз, і за допомогою ES6 я міг би мати .match'\x09'(де "є"), можливо, я побачу, чи зможу я додати більше в якийсь момент!
Дом Гастінгс

4

6 мов, 450 404 байт

bash, brainfuck, C, gawk4, JavaScript і Minimal-2D

/*\t/#[R,+/D
/\t/ # UL.-L<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/#*/
#define func
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#//]++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Оновлення: Гольф трохи вниз. Все ще не впевнений, що ще додати, і я не впевнений, як змагаються члени думають про мене, використовуючи свої мови для різних завдань. Спроба пояснити алгоритм мозкового обходу.

Ну це / був моїм першим поліглот-досвідом, тому мені довелося навчитися все з нуля. Починати з awk було не найрозумнішою ідеєю, на мою думку, тому що вона є відносно непростим. Оскільки кількість виконаних завдань є актуальною, я почав спочатку найпростіші завдання. Не впевнений, чи це був розумний хід. Це не дуже гольф, тому що у мене виникли проблеми, коли ці шість працювали разом, але я зробив усе, що міг, щоб не було цього.

Ось мови та те, що вони роблять в алфавітному порядку. Я покажу простий спосіб перевірити їх все далі. Оскільки частина цього може бути специфічною для версії, я дам вам номери версій використовуваних інструментів.

баш, завдання 3

Ну, очевидно, що я використовував sed. Я спробував якось поставити сценарій sed, але мені не вдалося змусити його працювати, тому я пішов на баш-маршрут. Те, як я це промовляю, це всередині коментаря C і awk оцінює його False.

sed --version дає sed (GNU sed) 4.2.2

bash --version дає GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Так що частина седу зводиться до

sed "s/^\(.*\)$/Happy Birthday, &!/;q"

Він групує вхід, вставляє його в новий рядок і друкує результат. Досить поширені речі.

мозковий ебать, завдання 20

Добре, це завжди досить легко приховати. Рядок, що починається з #//, ігнорується C та awk. Або принаймні вони можуть жити зі сміттям за цим.

bf дає bf - a Brainfuck interpreter version 20041219

Це стислий код. Перший рядок - це лише сміття з інших мов.

[,+.-<>.+.++.<>.,,,,[][][++]++<[--][]]
++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<
[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Спробую пояснити, як це працює

++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<

це впорядковує стрічку і вказівник на це

0 8 10 46 64 C2 C1
  ^

осередок, що займає 8, є глобальним лічильником для наступного циклу,
це кількість разів, надрукованих 3 однакові рядки

[>>>>>+++

встановлює C13, кількість однакових рядків

    [<++++

встановлює C24, число " ....@@@@" в рядку (на початку)

        [<<....>....>-]<<<.>>>
    >-]

друкує повний декрементування рядка C2в процесі,
коли C2дорівнює нулю, він друкує новий рядок і декременти C1.

якщо C1дорівнює нулю, магія трапляється

    <<<[>>+<<-]
    <[[>+<-]<]

46 переміщується позаду 64
10, а глобальний лічильник переміщується праворуч

>>-]

то глобальний лічильник зменшується
якщо програма дорівнює нулю

C, завдання 2

Я вичерпаю кожну останню маленьку здатність С тут, надрукувавши «Привіт, світ!». Ну, хтось повинен був виконати роботу ...

gcc --version дає gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

Фактичний код C

#define func
func main(){puts("Hello, World!");}
#

Це #define funcзробити гарненьке питання з цим. Він думає, що це функція awk. Скорочення до функцій - це особлива функція.

gawk4, завдання 18

Оскільки я багато часу використовував awk, я вирішив, що це має бути в цьому.

awk --version дає GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)

awk бачить це

/*\t/
/\t/
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#

Шаблони пошуку, включаючи \tоцінку до false. Я вибрав тут вкладку, тому що я думаю, що це не може бути вхідним. sedоцінює до false. "the string"&&0оцінює до хибного. Функція нормальна. Програма виконується, якщо порожній шаблон відповідає, який він є для будь-якого вводу.

Це робить це

Вхідні дані

еластичний
парлі
ucfit
гілочки

Вихідні дані

супе
rcal
Іфра
гілі
стик

Ви повинні переконатися, що всі лінії введення мають однакову довжину. Використовуйте пробіли, щоб заповнити їх.

JavaScript, завдання 9

Я не впевнений, чи це законно, бо це було занадто просто. Якщо ви надаєте програмному файлу закінчення html та відкриваєте його у браузері (я використовував Firefox 40.0.3 та chrome 45.0.2454.85), він запропонує ввести. Ви повинні ввести два числа, розділені пробілом, і це попередить суму цих.

<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>

Мінімальний-2D , завдання 1

Це було досить легко вписатись у рядки коментарів. Я використовував перекладач , який працює в python, щоб перевірити це. Він друкує вхід на вихід. Програма виглядає приблизно так

R,+/D
UL.-L

RUDL праворуч, вгору, вниз і вліво. Отже, він починає правильно, читає персонаж зі stdin в пам'ять і додає його. Штрих пропускає наступну команду, якщо пам'ять має значення 0. Цим потрібно закінчити це. Якщо зчитується символ зі значенням -1, введення закінчилося. Отже, якщо -1 прочитати, він пропускає D і припиняється. Якщо щось інше читається, воно йде вліво, додає, що 1 повернеться в пам'ять, і надрукує символ для stdout. Потім вона йде вліво і вгору і починається знову.

Тестування

Відмова від відповідальності: Я не несу відповідальності за будь-які збитки, завдані вашій системі вашою системою.

Це припущення, що у вас встановлено bash & co, gawk (принаймні версія 4, оскільки для цього використовуються багатовимірні масиви), gcc, python, bf в якості інтерпретатора мозгового епізоду та Firefox.

Щоб зробити це просто, скопіюйте джерело програми у файл з назвою cluster.html. Зробіть цей файл виконуваним для завдання bash. Скопіюйте та вставте інтерпретатор для Minimal-2d у файл, названий minimal2D.pyу тому самому каталозі. Потім скопіюйте та вставте наступний скрипт у файл сценарію і покладіть його в ту саму директорію, зробіть його виконуваним і запустіть ... ну, з ким я говорю. Якщо ви прочитаєте це, вам, ймовірно, не потрібно стільки пояснень, і ви все одно хочете якось його запустити.

#!/bin/bash
# Task  3: bash
echo "Dr. Hfuhruhurr" | ./cluster.html 2>/dev/null;echo
# Task 18: awk 
printf "elaic\nparli\nucfit\nsrigs\n" | awk -f cluster.html 2>/dev/null;echo
# Task  2: C
cp ./cluster.html ./cluster.c;gcc -w -o cluster cluster.c;./cluster;rm cluster cluster.c;echo
# Task  1: Minimal-2D
python minimal2D.py cluster.html <<<"This
has
to be
copied     !!!";echo
# Task 20: brainfuck
bf cluster.html;echo
# Task  9: JavaScript
firefox cluster.html 2>/dev/null
#google-chrome cluster.html 2>/dev/null

Там же ви знайдете команду для запуску тестів окремо.

Веселіться!


У головокружного є проблема; код має незбалансовані дужки і не запуститься правильно (потрібно запустити весь файл, а не лише відповідну частину). Крім того, квадрати контрольної дошки насправді є 4x3 замість 4x4, щоб виглядати тексти більш квадратними.
PurkkaKoodari

Дякую за підказку. Ну, тут добре працює. Я завжди запускаю весь файл, як ви бачите в моєму сценарії. Не впевнений, чи повинен перекладач перевірити дужки перед запуском. Моя не проти. Але я пропустив цю кількість рядків. Потрібно змінити це.
Cabbie407

Ну, я знову заглянув у це, і сподіваюся, що це виправили.
Cabbie407
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.