Преодоление размера кластера


37

Надоев надежностью флэш-памяти, вы решили хранить все свои программы на одной из этих старых добрых 1440-килобайтных дискет. Однако после копирования даже 3000 программ диск был заполнен. Как это вообще возможно? Будучи опытным в искусстве игры в гольф кода, большинство ваших программ имеют длину не более 100 байт, поэтому должно быть достаточно места ...

Спросив об этом в Super User, вы обнаружите, что вас обидел размер кластера файловой системы - злой заговор разработчиков FAT12, который оставляет значительную часть вашей дискеты неиспользованной и вынуждает вас покупать больше, чем вам действительно нужно.

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

задача

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

  1. Прочитайте все входные данные и распечатайте их.

  2. Распечатать Привет, мир! ,

  3. Считайте строку / аргумент ( имя ) в качестве ввода и напечатайте Happy Birthday, [name]! ,

  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. Считайте одно целое число n от 1 до 13 и выведите F n , n- е число Фибоначчи .

    Например, для ввода 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 достаточно разными, чтобы считаться разными языками?
Downgoat

Да, они считаются разными.
Деннис

17
твоя задача № 4 - ерунда> :(
дверная ручка

Цитата: Весь вывод в 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 / Кошка)

( 
      )?(!?)

?(!?)это просто прямой перевод ,[.,]в БФ. ()Циклы Prelude действуют как []циклы BF , поэтому все, начиная (с крайнего левого столбца и заканчивая тем, что )не была выполнена основная программа.

Синтаксические правила Prelude означают, что скобки должны совпадать (чтение слева направо по столбцам), и в каждом столбце может быть только одна скобка. Кроме этого, это довольно простой язык для встраивания.

Убедитесь, что NUMERIC_OUTPUTустановлено значение, Falseесли вы используете интерпретатор Python.

ТРАНСКРИПТ (Задание 2 / Привет, мир)

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

TRANSCRIPT - это тематический esolang, основанный на интерактивной художественной литературе. Линии, не распознаваемые TRANSCRIPT, игнорируются, что облегчает их установку.

Tr is here.объявляет Trстроковую переменную, а вторая строка устанавливает содержимое переменной в Hello, World!. X Tr( Xдля проверки) затем выводит строку.

Хотя в TRANSCRIPT очень легко вписаться, это довольно многословный язык, поэтому я заставил его принять самый простой вызов.

Деление (Задание 3 / День рождения)

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

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

Rail (Задача 4 / Вкладки)

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

Как и Fission, Rail - это двумерный язык, который имеет преимущество в том, что его можно перемещать куда угодно. Выполнение начинается с $от mainфункции, направляясь на юго - восток.

Сначала мы направляемся вниз по \s, поворачиваем налево на -, нажимая, [<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 / Дивмод на 7)

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

Удобно, 'и "есть NOPs в Лабиринте, которые действуют как пройденный путь в лабиринте. Я пропущу беспорядочную навигацию, но в основном происходит много поворотов и блужданий, прежде чем мы начнем с того ?, что является началом основной программы.

Программа не совсем скрыта, чтобы учесть Prelude (например ?, чтение ввода в Prelude).

Python 2 (задание 14 / шестнадцатеричное)

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

В xxxs представляет несоответствующие части закомментированных от многострочных строк или комментариев. В промежутке print hex(input()), основной прогам. Это выводит с опережением 0x, но я предполагаю, что все в порядке (если нет, то это легко исправить в любом случае).

Первая строка - это строка, "1\"# &&+.@\""за которой следуют два " "с. Эти три строки объединяются парсером и остаются неиспользованными (эта первая строка работает аналогично для Руби и Джулии позже).

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

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

Рубин (Задание 17 / кадр ASCII)

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

Эта программа предполагает, что ввод не заканчивается завершающим переводом строки.

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

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

'("'

pushes a (затем начинает строку с "(первый символ которого равен '), тогда как приведенное выше является простой единственной строкой в ​​GolfScript.

Попробуйте онлайн . 1>используется вместо того, (чтобы учитывать Prelude.


Здесь 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 перешел на задачу tabs.
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переводами строки.

С89, задание 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

Brainfuck, задача 1

Я просто должен был убедиться, что нет бесконечных петель или бродяг ., не найдены. Многострочные комментарии Lua также удваиваются как комментарии BF. Все, кроме первых 2 символов, представляет собой большой цикл NOP.

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

Python, задание 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

Работает аналогично> <>. К счастью, #это зеркало в> <> и пропуск в Befunge, поэтому мы можем реализовать другое поведение. Также 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, мне просто нужно найти переменную или алфавитный оператор, который был добавлен в более новую из двух. В старшем это будет ноль вместо этого. Код v:uIN[...]собирает большой список, содержащий одну из этих проверок для каждой версии, которую я хочу протестировать, выясняет, сколько nils содержится в этом списке ( uпеременная явно инициализируется как nil), и сохраняет число в v(для «версии») ,

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

Версии и задачи

0.15.09.04

Диагностика: (oTM0,0i)(исправлена ​​ошибка с оператором Tri, Mкогда обрезка 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}(настройка: если vравен 3, построить верхнюю половину алмаза d) с последующимd.n.RVd (повернуть вспять для нижней половины и присоединиться к новой строке)

0.15.06.19

Диагностика: RCk(добавленоRC оператор andom hoice)

Задача 17: m:'+.'-X#a+2.'+.n."| "(настройка: сборка +----+\n| строки m) с последующим m.a.RVm(завершение ввода в mи обратноеm )

0.15.06.12

Диагностика: k(предварительно инициализированаk", " предварительно переменная to ; ранее она была неопределенной и, следовательно, ноль)

Задача 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(настройка: копии Локальные переменная a, bк глобальному Варсу 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если input больше 1, а меньшее число делит его точно, в 0противном случае; если vчто-то еще, используйте vв качестве индекса списка, чтобы решить, что выводить)

0.15.05.02

Диагностика: ({a}V7)(добавлен Vоператор; когда Vон не был определен, это отправляло аргументы nil и 7 в функцию{a} которая возвращает свой первый аргумент)

Задача 10: a//7.s.a%7(входные данные делятся на 7 и мод 7, через пробел)

0.15.04.26

Диагностика: BN8(добавлено BitwiseN оператор )

Задача 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; pre-bugfix, 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. Brainfuck

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

Протестировано на 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. Perl

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$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()сразу же в коде выводим screen 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, но я не смог заставить его работать, поэтому я пошел по пути bash. То, как я это делаю, находится внутри комментария 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 сводится к

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, количество одинаковых строк

    [<++++

устанавливает C2в 4 число « ....@@@@» в строке (в начале)

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

печатает полную строку, уменьшающуюся C2в процессе,
когда C2ноль, она печатает новую строку и декременты C1.

если C1ноль, магия случается

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

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

>>-]

тогда глобальный счетчик уменьшается
если он равен нулю, программа выходит

С, задача 2

Я исчерпал каждую последнюю маленькую способность C здесь, печатая «Hello, World!». Ну, кто-то должен был сделать работу ...

gcc --version дает gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

Фактический код C

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

#define func сделать awk хорошо с этим. Он думает, что это функция awk. Аббревиатура от func - это особенность gawk.

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оценивается как ложное. Функция в порядке. Программа выполняется, если сопоставляется пустой шаблон, что и для любого ввода.

Это делает это

вход

elaic
pärli
ucfit
srigs

Выход

Супе
Rcal
IFRA
Гили
ЦНТИ

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

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 вправо, вверх, вниз и влево. Таким образом, он начинает работать правильно, читает символ из стандартного ввода в память и добавляет его. Косая черта пропускает следующую команду, если память имеет значение 0. Это конец. Если символ со значением -1 читается, ввод закончился. Так что, если -1 читается, он пропускает D и завершается. Если что-то еще прочитано, оно идет вниз влево, добавляет это 1 обратно в память и печатает символ в стандартный вывод. Затем он идет влево и вверх и начинается снова.

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

Отказ от ответственности: я не буду нести никакой ответственности за любой ущерб, нанесенный вашей системе с этим.

Предполагается, что у вас есть bash & co, gawk (по крайней мере версия 4, потому что здесь используются многомерные массивы), gcc, python, bf в качестве интерпретатора brainfuck и установленный 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.