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


12

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

Правила

  • Це кодогольф, мета полягає в тому, щоб у вашій програмі було найменше байтів

  • Якщо ви подаєте функцію, функція повинна братись xза параметр і xбагато разів повертати або друкувати весь код у STDOUT. Орган функції також не повинен бути порожнім

  • Якщо ви подаєте лямбда, вам не потрібно призначати її змінній

  • Застосовуються стандартні обмеження лазівки .

  • Порожні програми заборонені

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

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


Перше
приємне

Може xбути 0, чи можемо ми обмежити це додатними цілими числами?
mbomb007

Чи дозволено читання джерела нашої функції?
Кудлатий

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

@Shaggy, я думав, що це стандартна лазівка, здається, ніби її не було. Я
змінив

Відповіді:


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")після нього.
Ørjan Johansen


4

RProgN 2 , 8 байт

{`{.*¶}{

Особливо добре для цього працює цикл RProgN2 Loop!

{     } # 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

Математика, 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 , 49 байт

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

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


Схоже, він читає вихідний код, який як за замовчуванням, так і явно заборонений.
Ørjan Johansen

@ ØrjanJohansen Ні, воно не читає джерело, воно зчитує значення змінної. Це абсолютно той самий принцип, що і в інших відповідях, візьмемо для прикладу JS або Python.
eush77

@ ØrjanJohansen О, я бачу. $0в "Зробити функції" - це не те саме, що в оболонках. Це ім'я змінної, яку називає функція. Дивіться gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77

Зітхніть таку сіру зону. До речі, Python не роблять цього.
Ørjan Johansen

@ Ø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, а не з верхньої частини стека, як зазвичай відповідь Underload. Я також використав правильний, десятковий ввід, який складає більшу частину коду.

Пояснення:

Я загортаю програму в обгортку 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

@Kaiido Я не знаю .. Чи варто тримати f=?
Weedoze

Ваш код читає сам, неявно викликаючи toStringфункцію.
аебабіс

@acbabis Calling f.toString()або fте саме, але воно не відображатиме ім'я функції
Weedoze

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

0

CJam , 20 12 байт

8 байт збережено завдяки Мартіну Ендеру

{"_~"+ri*}_~

Спробуйте в Інтернеті!

Пояснення

{       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

Мікроскрипт II, 22 байти:

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

Мікроскрипт 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

Пітон 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.