Сколько раз вам придется играть в гольф?


12

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

правила

  • Это codegolf, цель состоит в том, чтобы в вашей программе было как можно меньше байтов

  • Если вы отправляете функцию, функция должна принимать xв качестве параметра и либо возвращать, либо печатать весь код xмного раз в STDOUT. Тело функции также не должно быть пустым

  • Если вы отправляете лямбду, вам не нужно присваивать ее переменной

  • Стандартные ограничения лазейки применяются.

  • Пустые программы запрещены

  • Ваша программа должна работать только тогда, когда xцелое число больше или равно 0

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


Хороший первый вопрос
лысая

Может xбыть 0, или мы можем ограничить это положительными целыми числами?
mbomb007

Разрешено ли чтение источника нашей функции?
Лохматый

@ mbomb007, я внес правку, чтобы уточнить правила, xможет быть, любое целое число больше или равно 0
Dignissimus - Spammy

@ Шэгги, я думал, что это стандартная лазейка, кажется, что это не так. Я внес изменения в вопрос, чтобы четко указать, что программа не может прочитать какую-либо часть своего исходного кода
Dignissimus - Spammy

Ответы:


8

Python 2 , 50 байт

Обратите внимание на запятую и новую строку.

s='s=%r;print s%%s*input(),\n';print s%s*input(),

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


@ mbomb007 Предположим, что в конце кода есть новая строка. Проблема решена.
MD XF

ОП сказал, что х может быть нулем, и в этом случае ничего не должно быть напечатано, поэтому этот ответ неверен.
mbomb007

@NickA Нет, он печатает новую строку, что неправильно.
mbomb007

0, кажется, не печатает мне новую строку, как проверено с помощью sys.stdout.write("2")после него.
Орджан Йохансен


4

RProgN 2 , 8 байтов

{`{.*¶}{

RPGN2 Loop Quine работает особенно хорошо для этого!

{     } # A function literal
       {# Without a matching }, this loops back to the second instruction, which essentially runs the function. This is a bug, but it works to make the "Looping Quine".
 `{.    # Append the literal {, stringifying the function.
    *   # Multiply the stringified function by the input.
     ¶  # Terminate the program.

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


4

Mathematica, 40 33 байта

Спасибо lanlock4 за сохранение 7 байтов!

StringRepeat[ToString[#0], #1] & 

Чистая функция, принимающая неотрицательный целочисленный аргумент. ToString[#0]стандартный метод Mathematica для доступа к определению текущей чистой функции; StringRepeat[..., #1]объединяет (вводит) копии этой строки вместе. Например,

StringRepeat[ToString[#0], #1] & [2]

выходы:

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 

Не могли бы вы опубликовать пример использования? Запуск, например , StringJoin @@ Table[ToString[#0], #1] & [2]дает мне ошибку.
Джулиан Вольф

В самом деле? Этот точный звонок работает для меня. Я использую Mathematica 11 ....
Грег Мартин

Хм, я все еще использую 10 (v10.0.1.0) - это может быть. Для справки вот ошибка, которую я получаю:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Джулиан Вольф

Ага - я обнаружил, что Table[x,5]вернусь {x,x,x,x,x}в Mathematica 10.2 и далее, но в Mathematica 10.1 это дает такую ​​ошибку (она ожидает Table[x,{5}]).
Грег Мартин

Я думаю, что вы можете заменить StringJoin @@ Tableна StringRepeat.
Не дерево



3

Python 2, 70 байт

Это решение работает, если x=0. Есть один завершающий перевод строки.

s='s=%r;exec"print%%r;"%%(s%%s)*input()';exec"print%r;"%(s%s)*input()

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


Python 2, 60 байт (неверно)

Это предполагает это x>=1, но ОП уточнил, что xможет быть ноль. Есть один завершающий перевод строки.

s='s=%r;print(s%%s*input())[:-1]\n';print(s%s*input())[:-1]

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


2

Недогрузка , 12 байт

(a(:^)*~^):^

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

Передача функции, потому что у Underload нет другого способа получить ввод. (Ссылка TIO показывает число 4, указанное в качестве ввода, и добавляет код для печати полученного результата).

Это просто универсальный конструктор quine (a(:^)*):^, плюс ~^(«сделайте количество копий равным аргументу»).



1

Желе , 10 байт

“;⁾vṾẋɠ”vṾ

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

Как это устроено

“;⁾vṾẋɠ”vṾ  Main link. No arguments.

“;⁾vṾẋɠ”    Set the argument and the return value to the string ';⁾vṾẋɠ'.
         Ṿ  Uneval; yield '“;⁾vṾẋɠ”'.
        v   Eval ';⁾vṾẋɠ' with argument '“;⁾vṾẋɠ”'.
  ⁾vṾ           Yield 'vṾ'.
 ;              Concatenate '“;⁾vṾẋɠ”' and 'vṾ', yielding the source code.
      ɠ         Read an integer from STDIN.
     ẋ          Repeat the source code that many times.

4
Это выглядит восхитительно, но моя мама всегда говорила мне не класть странные вещи в мой рот.
Матин Улхак

1

GNU Make , 49 байтов

$(foreach ,$(shell seq $1),$(strip $(value $0))) 

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


Похоже, что он читает исходный код, который по умолчанию и явно запрещен.
Орджан Йохансен

@ ØrjanJohansen Нет, он не читает источник, он читает значение переменной. Это тот же принцип, что и в других ответах, например, JS или Python.
eush77

@ ØrjanJohansen О, понятно. $0в Make функции это не то же самое, что в оболочках. Это имя переменной, которая называется функцией. См gnu.org/savannah-checkouts/gnu/make/manual/html_node/...
eush77

Вздох такой серой области. Кстати, Python те не делают этого.
Орджан Йохансен

@ ØrjanJohansen Я бы сказал, что этот ответ гораздо ближе к Python, чем к JS. Все callэто делает, подставляя $0и $1фактические параметры - это просто строка интерполяция, так же , как в Python %.
eush77


1

Betaload , 203 байта

Новые строки добавлены для ясности:

(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^

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

Объяснение:

Я обертываю программу в обёртку от quine: (a(:^)*и ):^. Это означает, что весь код внутри оболочки quine будет иметь исходный код программы в нижней части стека.

Чтобы преобразовать цифры в обычную церковную цифру, я использую технику замены каждой цифры на код для умножения на 10 и добавления этой цифры:

0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*

Здесь много повторений, поэтому давайте скомпилируем его в подпрограмму, которая возьмет церковную цифру с вершины стека и использует ее для построения «строки цифр:»

:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*

Я поместил это в новую среду, чтобы к ней можно было быстро получить доступ:

#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>

Теперь я могу создать код замены для R. Rиспользует верхние элементы стека для формирования таблицы поиска, чтобы заменить строку из STDIN на код Betaload. Это работает так:

()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R

Однако мы можем использовать только что созданную подпрограмму для генерации сегментов кода:

(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...

Когда Rон запускается, он преобразует входные данные в серию подпрограмм, которые образуют церковную цифру. Когда эта подпрограмма выполняется, она создает эту церковную цифру на следующем элементе в стеке (0, который был размещен ранее). Это означает, что после R^этого верхним значением в стеке будет церковная цифра. Затем ^мы еще раз применим числительную церковь к последнему элементу в стеке (исходный код программы), чтобы получить ответ.

Забавный факт: у меня был доктор медицины для этого представления в течение нескольких месяцев. Я сохранил его после недопонимания вопроса (который я больше не могу найти). Я должен был выкопать это из моей Корзины, чтобы отправить это здесь.



1

Python 2 , 41 байт

_="input('_=%r;exec _'%_*input())";exec _

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

Делает любопытный Hacky вывода , используя inputвместо того , чтобы print, так как printимеет странную ошибку , связанные с печатью новой строки , когда он не должен ... . Выход с ошибкой EOF.

Объяснение:

_="input('_=%r;exec _'%_*input())"; # Set _ to a string
exec _                              # Execute that string
input(                        )     # "print"
      '_=%r;exec _'%_               # The source code with _ formatted in
                     *input()       # Actual input many times



0

Perl, 48 байт

print"$_\47"x(2*pop)for'print"$_\47"x(2*pop)for'

\47восьмеричный выход для одинарной кавычки ( '). Он интерпретируется внутри двойных кавычек ( "), но не внутри одинарных.


0

Javascript ES6, 27 37 байт

_=>alert(`${f.name}=${f}`.repeat(_))

редактировать

+10 байт, если f=должны отображаться


f=

_=>alert(`${f.name}=${f}`.repeat(_))

f(2);


@ Downvoter почему?
Weedoze

@ Кайидо, я не знаю .. Должен ли я сохранить f=?
Weedoze

Ваш код читает сам себя, неявно вызывая toStringфункцию.
aebabis

@acbabis Вызов f.toString()или fтот же, но не отображает имя функции
Weedoze

Я полагаю, что @acbabis имел в виду, что он нарушает последний пункт задачи «Ваша программа также не может напрямую читать какую-либо часть своего исходного кода» - использование fэтого способа означает обращение к своему собственному источнику.
skyline3000

0

CJam , 20 12 байтов

8 байтов сэкономлено благодаря Мартину Эндеру

{"_~"+ri*}_~

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

Exaplanation

{       e# Begin a block literal:
 "_~"+  e#  Add whatever's on the stack to the beginning of the array ['_', '~'].
 ri*    e#  Repeat the resulting array a number of times equal to the input.
}       e# Close the block. Push it on the stack.
_~      e# Copy it and run it.

0

PHP, 194 байта

<?php $a="PD9waHAgJGE9IiMiOyRpPSRhcmd2WzFdO3doaWxlKCRpLS0pZWNobyBzdHJfcmVwbGFjZShjaHIoMzUpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=";$i=$argv[1];while($i--)echo str_replace(chr(35),$a,base64_decode($a));

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

Совсем не гольф, как обычно бывает на b64.


0

Go , 257 254 байта

Это причиняет мне боль.

package main;import(."fmt";."strings";."strconv";."os");func main(){s:="package main;import(.\"fmt\";.\"strings\";.\"strconv\";.\"os\");func main(){s:=%q;n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}";n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}

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


0

Microscript II, 22 байта:

"v{lqp}sN*h"v{lqp}sN*h

Microscript II, 20 байт (но технически недопустимый, поскольку он обращается к исходному коду блока кода):

{s""+`"~sN*"s`+}~sN*

0

C 144 116 байтов

i;main(a){for(i=getchar()-48;i--;)printf(a="i;main(a){for(i=getchar()-48;i--;)printf(a=%c%s%c,34,a,34);}",34,a,34);}

0

Python 3, 69 байт

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)


0

05AB1E , 17 байт

0"D34çý×?"D34çý×?

Модификация по умолчанию 0"D34çý"D34çý , добавив ×?.

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

Объяснение:

0                   # Push 0 to the stack
                    #  STACK: [0]
 "D34çý×?"          # Push the string 'D34çý×?' to the stack
                    #  STACK: [0, 'D34çý×?']
          D         # Duplicate this string
                    #  STACK: [0, 'D34çý×?', 'D34çý×?']
           34ç      # Push '"' to the stack
                    #  STACK: [0, 'D34çý×?', 'D34çý×?', '"']
              ý     # Join the stack by this '"' delimiter
                    #  STACK: ['0"D34çý×?"D34çý×?']
               ×    # Repeat the string the (implicit) input amount of times
                    #  input = 2 → STACK: ['0"D34çý×?"D34çý×?0"D34çý×?"D34çý×?']
                ?   # Output to STDOUT without trailing newline
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.