Код гольф для ленивых


10

Ваша цель в этом коде гольф состоит в том, чтобы взять две строки, languageи code (если код для игры в гольф, который вы написали для этого, является многострочным, то эта переменная будет многострочным.) И одно целое число bytes. Они представляют переменные для языка программирования, количество байт, которые он принимает, и сам код.

После этого вы будете форматировать его так, как это делает гольфист кода.

Выходная переменная называется многострочной строкой answer.

Вы можете использовать многострочные строки на:

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

Вот шаблон выходной уценки. codeПеременная в блоке кода, и есть заголовок второго уровня.

## {language}, {bytes} bytes

     {code}

Вот как будет выглядеть вывод при вставке в анализатор Markdown.

{язык}, {байт} байт

    {code}

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

Вот еще один пример вывода в виде кода, на этот раз с заполненными переменными:

## JavaScript, 1337 bytes

document.getElementById("foo").innerHTML = bar;

Вот версия в виде цитаты:

JavaScript, 1337 байт

    document.getElementById("foo").innerHTML = bar;

Байты могут быть извлечены из вашего кода, если вы используете способ установить текст <p>элемента в HTML с помощью идентификатора result, например, следующий код JavaScript:

document.getElementById("result").innerHTML = answer;

Не забудьте также включить <p id="result"></p>в раздел HTML JSFiddle, чтобы это работало.

счет

Как и все вопросы, код , который использует наименьшее количество байт является лучшим.


3
Будет ли {code}когда-нибудь многострочный код?
Аднан

8
«Переменные будут заполнены в соответствии с языком, на котором вы закодировали код для ввода кода, количество байтов, которое он принимает, и фактический код для него». Я единственный, кто интерпретирует это как вариацию Квина?
Примо

2
Поскольку ответы решают две совершенно разные проблемы, я считаю это неясным. Просьба уточнить , является ли language, bytesи на codeвходе , или это Куайн варианта , где эти вещи должны соответствовать самому коду Решая. (И если да, то разрешено ли прямое или косвенное чтение этого исходного кода и разрешены ли встроенные функции quine.)
Мартин Эндер,

2
Не могли бы вы также прояснить вопрос Аднана, может ли сам вход codeсодержать строки?
Мартин Эндер

2
@ Арахис Я в замешательстве. Можем ли мы предположить, codeчто не будет многострочным или нет? Пожалуйста, укажите, что в тексте задачи
Луис Мендо

Ответы:


2

05AB1E , 21 байт

Код:

“## ÿ, ÿ¡Ï
“,|v4ð×y«,

Использует кодировку CP-1252 . Попробуйте онлайн! ,


Это не обрабатывает многострочные строки
Джеймс

@DrGreenEggsandIronMan Исправлено.
Аднан

И так битва V против O5AB1E продолжается ... Отличная работа!
Джеймс

@DrGreenEggsandIronMan Я буду ждать следующего художественного вызова ASCII, чтобы отомстить :).
Аднан

8

Java, 70 байт

String A(String[]b){return"## "+b[0]+", "+b[1]+" bytes\n\n    "+b[2];}

Предполагается, что b[0]это имя языка, b[1]количество байтов и b[2]код.

Его компиляция стоит 9 байт, что приводит к созданию автономной программы размером 79 байт:

class a{String A(String[]b){return"## "+b[0]+", "+b[1]+" bytes\n\n    "+b[2];}}

Эквивалентная монолитная программа имеет длину 103 байта:

interface a{static void main(String[]A){System.out.print("## "+A[0]+", "+A[1]+" bytes\n\n    "+A[2]);}}

Монолитный работает с аргументами командной строки, предполагая, что они как автономная программа:

  • Первый аргумент - это название языка
  • Второй аргумент - количество байтов
  • Третий аргумент - это код

Java (лямбда-выражение), 56 48 байтов

(b)->"## "+b[0]+", "+b[1]+" bytes\n\n    "+b[2];

Это java.util.function.Function<String[], String>.


Ни одна из этих программ / функций не обрабатывает многострочные строки. Чтобы сделать это, просто заменить b[2]и A[2]с b[2].replace("\n","\n ")и A[2].replace("\n","\n ")- делать это добавляет 23 байта.


Сейчас я не рядом с компьютером, чтобы подтвердить это, но разве вы не можете использовать \tили что-то, чтобы заменить 4 пробела после двух новых строк?
Р. Кап

@ R.Kap Иногда использование табуляции вместо пробелов создает беспорядок на SE.
user8397947

Ах я вижу. Так учитывается ли количество байтов, \tа не 4 пробела?
Р. Kap

3
Потерять паренсы на лямбду; Вы можете сохранить два байта просто b->.
Брайан МакКатчон

2
Что произойдет, если будет более одной строки кода?
Нил

5

V , 24 байта

Обратите внимание, что в конце есть пробел.

Эта программа делает предположение, что {code}не будет нескольких строк.

Op уточнил, «код» может быть многострочной строкой. Эта 24-байтовая версия работает:

2é#á $á,JA bytes
vGî4é 

Поскольку это содержит непечатаемый символ, вот читаемая версия:

2é#á $á,JA bytes
<esc>vGî4é<space>

Где <esc>буквальный escape-символ, например 0x1B.


1
Это всегда похоже на постоянную борьбу между Джольфом и В ...: 3
Конор О'Брайен

4

Python 3.5, 40 33 байта:

( -7 байт благодаря некоторым разъяснениям от Мего )

lambda*f:'## %s, %s bytes\n\n\t%s'%f

Анонимная лямбда-функция, которая принимает входные данные в качестве позиционных аргументов в формате <function name>(String, Number, String)и выводит многострочную строку.

Попробуйте онлайн! (Ideone)


2
Вы можете сбрить несколько байтов, если создадите список параметров *fи сбросите tupleвызов.
Мего

@Mego К сожалению, это не работает, поскольку я получаю TypeError: not enough arguments for format stringвсякий раз, когда я запускаю его таким образом.
Р. Кап

Работает нормально, когда я пытаюсь это сделать - вы должны использовать позиционные аргументы вместо списка аргументов. Кроме того, вы можете оставить пространство между #и %.
Мего

@Mego Wow, это так странно, потому что, когда я пробую это в PyCharm с Python 3.5.1, я получаю ошибку. Это меня сильно смутило. Кроме того, пространство между #и лямбда необходимо, или я так думаю.
Р. Кап

@Mego Это обновлено.
Р. Кап

4

JavaScript (ES6), 56 байт

(l,b,c)=>`## ${l}, ${b} bytes

`+c.replace(/^/gm,`    `)

Кроме того, для смеха, вот ответ, который форматирует себя для меня:

JavaScript (ES6), 68 байт

f=_=>`## JavaScript (ES6), ${`${f}`.length+3} bytes\n\n    f=${f};`;

Распечатать результат f().


@PatrickRoberts Ой, я на самом деле не проверял длину, я просто скопировал и вставил ее, а затем добавил 6 байтов для (ES6). (Почему Cᴏɴᴏʀ O'Bʀɪᴇɴ только удосужился изменить длину?)
Нил

4

C #, 40 38 байт

(a,b,c)=>$"## {a}, {b} bytes\n\n\t"+c;

C # лямбда, где входные и выходные данные являются строками.


C #, 59 байт

(a,b,c)=>$"## {a}, {b} bytes\n\n\t"+c.Replace("\n","\n\t");

С обработкой многострочного ответа.


C #, 71 байт

38-байтовое решение, которое печатает само

()=>$"## C#, 38 bytes\n\n\t"+@"(a,b,c)=>$""## {a}, {b} bytes

\t""+c;";

Попробуйте их онлайн


3

Mathematica, 40 байт

Print["## ",#,", ",#2,"bytes

    ",#3]&

Анонимная функция. Принимает язык, количество байтов и программу в качестве входных данных и печатает тело в STDOUT.



1

MATL , 28 27 байт

1 байт сохранен благодаря предложению @ NinjaBearMoneky

35tOj', 'j' bytes'10t4Z"j&h

Попробуйте онлайн!

Блок кода должен быть в одной строке.

объяснение

35t           % Push 35 (ASCII for '#') twice
0             % Push 0. When converted to char, it will be displayed as a space
j             % Input string (language name)
', '          % Push this string
j             % Input string (byte count)
' bytes'      % Push this string
10t           % Push 10 (ASCII for linefeed) twice
4Z"           % Push string containing four spaces
j             % Input string (code)
&h            % Concatenate everything into a string. Implicitly display

0

Common Lisp, 57 байт

(lambda(L b c)(format()"## ~A, ~A bytes~%~%    ~A"L b c))

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

Common Lisp, 146 байт

#1=(PROGN
(SETF *PRINT-CIRCLE* T)
(LET ((S (FORMAT NIL "~S" '#1#)))
  (FORMAT NIL "## Common Lisp, ~A bytes~%~%    ~A" (LENGTH S) S)))


0

hashmap , 29 байт.

"## "i", "h" bytes.\n\n    "i

(Я написал этот пост вместе с программой, но мне пришлось скрыться \ n в \\ n)
Объяснение:

"## "                         Push string
     i", "                    Push input and string
          h" bytes.\n\n    "i Push input as number and string, then the input.

0

CJam , 26 23 байта

Спасибо @NinjaBearMonkey за удаление 3 байтов!

'#_Sl',Sl" bytes"N_S4*l

Блок кода должен быть в одной строке.

Попробуйте онлайн!

объяснение

'#_S       e# Push character "#" twice, then a space
l          e# Read line from input
',S        e# Push a comma, then a space
l          e# Read line from input
" bytes"   e# Push this string
N_S4*      e# Push newline twice, then four spaces
l          e# Read line from input. Implicitly display 

23 байта:'#_Sl',Sl" bytes"N_S4*l
NinjaBearMonkey

@NinjaBearMonkey Спасибо! Ред. Эта идея сохранила байт и для моего другого ответа
Луис Мендо

0

Пайк, 25 байт

"##"Q", "z" bytes"skd4*z+

Попробуй это здесь!

Или

Пайк, 0 байт

Попробуй это здесь! - нажмите кнопку копирования ответа;)

РЕДАКТИРОВАТЬ - это просто особенность веб-сайта, он обманывает (или, по крайней мере, я бы так считал), потому что он никогда не анализирует AST, и веб-программа, вероятно, не считается частью языка из-за того, что он не очень много взаимодействует с языком (хотя он работает с интерпретатором Pyke)


Что заставляет работать 0-байтовую версию?
Хайкам

Вы можете добавить это к ответу? Я не считаю это, но ты все еще можешь держать это там.
Хайкам

Эй, @muddyfish, ты можешь разделить их на два ответа?
Haykam

@haykam, если это делается для того, чтобы принять ответ, я бы предпочел не делать этого, поскольку я не думаю, что 0-байтовое решение считается фактически использующим Pyke и выглядит слишком наглым
Blue

Я не приму этот ответ.
haykam

0

Perl 5, 35 байт

Полная программа, которая принимает входные данные в качестве аргументов командной строки в обратном порядке. Требуется -M5.01, что бесплатно.

say pop.', '.pop.' bytes

    '.pop

0

Emacs Lisp, 97 байт

(lambda(l c)(format"## %s, %s bytes\n\n%s"l(string-bytes c)(replace-regexp-in-string"^""    "c)))

Кроме того, поскольку иногда бывает сложно избежать кавычек, а что нет, пример использования, который копирует строку в буфер обмена. (Отметьте регион и используйте M-:)

Emacs Lisp, 184 байта

(kill-new ((lambda(l c)(format"## %s, %s bytes\n\n%s"l(string-bytes c)(replace-regexp-in-string"^""    "c)))"Emacs Lisp"(buffer-substring-no-properties(region-beginning)(region-end))))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.