Печатайте с 1 по 15, используя разные принтеры


22

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

Вызов:

Напишите код, который выводит одно целое число Nи исполняемый код. Следующий код должен выводить N+1и код, который может выводить N+2. Продолжайте этот путь, пока не достигнете N = 15. (Последний напечатанный номер должен быть 15).

Правила:

  • Нет ввода (предположим, что вход пуст).
  • Полная программа или функция или другие удобные форматы допускаются.
  • Первый код должен выводиться 1.
  • Вы не можете вывести ведущие нули. Т.е. вы не можете печатать 01для 1.
  • Вывод должен быть в формате N, Code_for_N+1. Обратите внимание, что выходные данные разделены запятой и одним пробелом. Код для N+1не имеет кавычек. N , Code_for_N+1не принимается (пробел перед запятой). Конечные переводы в порядке.
  • Первый символ (ы) вывода должен быть числом. (Без начальных пробелов или ans = N).
  • Напечатанный номер не должен быть частью следующего кода (код может содержать этот номер, но вы не можете принять выходной номер как часть кода)
    • Пример: Выход для N=2может быть: 2, printer 2. В данном случае printer 2это код для N=3. Вы не можете использовать весь вывод: 2, printer 2как код для N=3.
  • Сценарии могут быть на разных языках
  • Типы данных не имеют значения (число может быть строкой), но они не могут быть окружены ничем (кавычки, скобки и т. Д.).
  • Если есть код для N=15вывода, то он должен либо напечатать STOP!(см. Бонус), либо вообще ничего не печатать (даже пробел или перевод строки).
    • Код для N=15сбоя не может (но вывод в STDERR в порядке).
    • Вы дисквалифицированы, если выходной код для N=15распечаток 16или чего-либо еще (кроме бонусного случая).
  • Встроенные операторы Quine не допускаются.
  • Доступ к исходному файлу через файловую систему запрещен.

Бонус:

-10 байт, если код, который печатает 15, также создает код, который печатает " STOP!"

Примеры, использующие синтаксис Python: (очевидно, они будут работать только для выбранных целых чисел, а не от 1 до 15).

N = 1
print "1, print 2"
1, print 2

---
N = 15
print 15
15

---
N = 15   (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'

print 'STOP!'
STOP!

----

N = 15   (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!')        (disp('STOP!') outputs STOP! in MATLAB)

----
N = 15   (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16

Действуют стандартные правила игры в гольф! Наименьший код (для N = 1) в байтах побеждает!


Так, скажем, f=>f+""будет недействительным? ( f+""возвращает код конструкции функции.)
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ без этого, возможно ли даже выполнить задачу ...
nicael

@nicael Это уже было сделано, по крайней мере, в ответе JS
Конор О'Брайен

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ ... жизнеспособным способом: D
nicael

Правила сбивают с толку, могу я вывести что-то подобное 14, print(14+1)или нет?
nyuszika7h

Ответы:


39

Pyth + ///, 15 байт - 10 = 5

pPt`S15", STOP!

Это печатает 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!в Pyth, беря range(1,15+1)и снимая начальные и конечные скобки, и печатая его сразу же после «, STOP!».

Следующие четырнадцать программ находятся в ///, что напрямую выводит все программы, которые не содержат /или \. Итак, вторая программа

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

дает 2и третья программа 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15. Предпоследняя программа, 15, STOP!распечатывает 15, STOP!, поэтому последняя программа просто STOP!.


3
Чика. Мне это нравится. :)
Мартин Эндер

Считается ли catязыком?
user253751

@immibis catне выполняет тест на простоту, так что нет.
user48538

1
Программы № 2 и выше также работают на PHP. :)
Илмари Каронен

31

JavaScript, 131238 - 10 = 131228 байт

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

Идея: итеративно экранировать и добавлять N-1, ...

alert("14,alert(\"15, alert(\\\"STOP!\\\")\")")

7
Я думаю, что это самый обратный слеш в любом ответе PPCG.
lirtosiast

1
Я признаю, что использовал NP ++ и регулярные выражения для этого =)
flawr

19
Ха-ха, это -10 очень помогает: D
nicael

2
Я создал несколько менее наивное 87573-байтовое решение .
LegionMammal978

Вы можете сохранить несколько байтов без бонуса.
Rɪᴋᴇʀ

8

CJam, 26 25 24 байта

1{", "2$)@"_~"](_F<@*}_~

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

Последующие программы просто увеличивают первый номер. Это запускает программу 16 раз.


Или с бонусом за тот же счет:

1{", "\2$)_G<\@`+"_~"+"STOP!"`?}_~

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

Последующие программы просто увеличивают первый номер. Это запускает программу 16 раз.

Альтернативное решение для бонуса:

1{", "\2$)Gmd@`+"_~"+"STOP!"`\?}_~

2
@FryAmTheEggman cjam.tryitonline.net/… использует Base64 для кодирования программы, что облегчает публикацию постоянных ссылок в комментариях. </selfpromotion>
Деннис

@Dennis Спасибо, это было немного головной болью: P Похоже, Мартин написал свое собственное.
FryAmTheEggman

@FryAmTheEggman Только после того, как я увидел вашу ссылку, так что спасибо за предложение. ;)
Мартин Эндер

7

JavaScript (ES6), 62 61 байт - 10 бонусов = 51 балл

_=>"1, "+(f=n=>`_=>"`+(n<16?n+`, "+(${f(n+1)})`:`STOP!"`))(2)

объяснение

Решение, которое не читает собственный исходный код, а также не слишком долго.

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

_=>
  "1, "                // print the first number
  +(f=n=>`_=>"`+(      // f = recursive function for printing program N
    n<16?              // for programs 2 - 15:
      n+`, "+(${       // add N to the output of the nested function
        f(n+1)         // nest the code of program N + 1
      })`
    :`STOP!"`          // program 16 just outputs "STOP!" for the bonus
  ))(2)                // start from program 2

Тест


1
+1 за то, что не использовал встроенную в JavaScript функцию получения тела функции (серая область для цитирования)
Aᴄʜᴇʀᴏɴғᴀɪʟ

2
@Callodacity Как "" + (n=>m)не считается получение тела функции n=>m?
Нил

@Neil На самом деле вы правы, это действительно имеет значение - я упустил это из виду, так как я только посмотрел на программу 1 и не прошел вывод
Aᴄʜᴇʀᴏɴғᴀɪʟ

Куда делись все обратные слеши !?
Noodle9

5

Matlab, 226 212 - 10 = 202 байта

Спасибо @StewieGriffin за несколько байтов =)

'awFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)

Первая часть представляет собой строку, которая представляет вторую строку (ниже), фактический код (только смещено на 9). В Matlab строки - это матрицы, заполненные символами, поэтому вы можете легко выполнить сдвиги, просто добавив / вычтя скаляр. Таким образом, программа просто снова печатает ту же строку *, плюс ту же строку, но смещенную, что приводит к коду.

* Не совсем: первый байт - это счетчик, который нужно увеличивать в каждой итерации.

Хитрость с веревкой была бесстыдно украдена отсюда.

'awFjw|Dro)w1:26B?G:>DwF0\}xy*0Dnu|nDwFdw~v;|}{1w1:26B?2505)05<B5w1:24:5w1;Cnwm25<B5>B5w1;Cnwm26B500fDnwmDmr|y1w2';
n=ans;if n(1)-96>15;n='Stop!';else;n=[num2str(n(1)-96),', ',39,n(1)+1,n(2:end),39,59,n(2:end)-9,''];end;disp(n)

Вот последние несколько строк последовательности, скопированной из консоли:

>> 'mwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
13, 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
14, 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
15, 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
STOP!

5

JavaScript, 50 47 44 42 44 * байт

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1)

Это функция, которая извлекает свое собственное тело (просто a) и делает в нем замены. Получение тела функции встроенной функцией JavaScript, хотя и не являющейся явно оператором quine (если оно недопустимо, удалит ответ).

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1);
alert(a());

Если он там не работает должным образом (потому что для меня это не так), вы можете увидеть пример там .


* - похоже, что фрагмент дает результат без a=, делая дальнейшие вызовы невозможными


1
Как «встроенная функция для получения тела функции» не совпадает с оператором quine? Я не говорю, что это недействительно, мне просто интересно, в чем разница?
Стьюи Гриффин

Я просто работал над одним. о_о Ты не можешь сделать .replace(x++,x)?
Конор О'Брайен

3
@StewieGriffin Одни созданы для того, чтобы разыгрывать, другая - законная особенность.
Конор О'Брайен

@Stewie Но «оператор quine» должен возвращать всю программу, в то время как в моем примере он извлекает функцию без цели создания quine (нет встроенной функции для возврата всего кода программы). Поскольку вы допустили функции, они могут быть похожими, поэтому мне было интересно.
Никель

Работает ли a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)?
Конор О'Брайен

5

Python 2.7.10, 196 92 - 10 = 82 байта

Whee !!! Это было весело Теперь намного короче. :П

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

Объяснение:

Я начал с этого:

a='a=%r;print a%%a';print a%a

Это всего лишь простой вопрос. Это с добавленным счетчиком:

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)';print n,a%(n+1,a)

nпеременная счетчика, которая печатается в начале. Затем , когда его печатает n=часть, она заменяет n+1для %d. Так что отсюда это будет считаться бесконечно.

И вот окончательный вариант. Он добавляет условие if для остановки на 15 и выводит «STOP!» также.

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

Старый код:

a= ['if num==15:print"STOP!!!";exit()','print num','print"a=",a','print"num=",num+1', 'for s in a:print s']
num= 1
print num
if num==15:print"STOP!!!";exit()
print"a=",a
print"num=",num+1
for s in a:print s

Никогда не собираюсь побеждать, но весело. : P Теперь намного короче, хотя у меня все еще нет шансов. :П


Вау. Можете ли вы добавить объяснение, потому что это круто, но я понятия не имею, что происходит: D
Sherlock9

@ Шерлок9 готово. Спасибо за вашу оценку.
Rɪᴋᴇʀ

Если я вырезал и вставил это в интерактивную сессию Python 2.7.6, он пожаловался, что перед elses нет пробелов .
Эрик

@eric Я использую Python 2.7.10, и он работает для меня ...
Rɪᴋᴇʀ

3

PowerShell, (215-10) = 205 197 167 106 104 103 байт

$d='$c=(,1*{2}).count;$d={0}{1}{0};(("$c, $d"-f[char]39,$d,($c+1)),$c)[$c-eq15]';"1, $d"-f[char]39,$d,2

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

По сути, мы начнем с настройки $d равной длинной в большую длину строки почти quine исходного кода. Он выводит , 1а затем $dс оператором формата , -fчтобы правильно заселить {0}, {1}, {2}дублер, увеличивая {2}число в ,1*{2}секции на единицу каждый раз.

,x*yОперация в PowerShell создает новый массив yэлементов, каждый из которых равен x. Например, ,2*3эквивалентно @(2,2,2).

Это означает, что первый вывод будет 1, $c=(,1*2).length;$d=(etc...), поэтому, когда будет выполнен второй код, он $cбудет равен количеству массива @(1,1)или 2и т. Д. Обратите внимание, что $cон не используется в качестве переменной в исходном коде, только в последующих запусках.

Останавливается, когда он печатает 15, просто вычисляя, $c равно15 и затем индексируя в массив, 0-й элемент такой же, $c, $dкак описано выше, другой - просто 15. Таким образом, когда $c15, он будет выводить 15и ничего больше. Не претендует на бонус, потому что "15, {0}STOP!{0}"5 символов слишком длинны, чтобы стоить -10.

Требуется терминал PowerShell шириной> ~ 150. Или для того, чтобы вы вручную удалили дополнительный разрыв строки (который терминал старательно вставляет в выходной перенос) при копировании кода. Или для вас, чтобы записать вывод в переменную, а затем повторно выполнить эту переменную. И т.п.

Редактировать 1 - Сохранены некоторые байты, удалив "STOP!" формулировка.
Edit 2 - Durr, не используйте .length каждый раз, просто вызывайте его один раз.
Edit 3 - Не нужно быть квинной, поэтому начальный прогон может быть намного короче.
Edit 4 - Изменено использование строк для массивы для вычисления $c, которые сохранили два байта. Я почти уверен, что это почти оптимально для такого подхода.
Редактировать 5 - Сохранение еще одного байта путем прямого подсчета равенства, а не моддинга


Окно консоли Windows 10 больше не копирует перенос строки.
Нил

2

JavaScript, 79 - 10 = 69 байт

s='STOP!';for(i=15;i;){s=i--+',alert("'+s.replace(/[\\"]/g,"\\$&")+'")'};alert(s)

Не используя Function.prototype.toStringникак.



2

Пакетный, 73 + 5 - 10 = 68 байт

@set a=STOP!
@for /l %%a in (15,-1,1)do @set a=%%a, @echo !a!
@echo %a%

Требуется CMD /V:ONпоэтому я добавил 5 байтов для этого.


2

Python 2.7, 107 символов

Используя рекурсию и не написав квин, я думал, что смогу сэкономить, что правда, но недостаточно. Несмотря на то, что я не победитель, я думаю, что этот подход интересен.

Я начал с составления строки для N = 4, побега \и "символов.

print "1, print \"2, print \\\"3, print \\\\\\\"4, print \\\\\\\\\\\\\\\"STOP!\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

Затем я создал лямбда-функцию, которая создает эту строку на основе индекса начала и индекса остановки, используя рекурсию. Это оно:

l=lambda n,m:str(n)+", print "+"\\"*(2**(n-1)-1)+"\""+l(n+1,m)+"\\"*(2**(n-1)-1)+"\"" if n<m else "STOP!"

Используйте это так:

print l(1,15)

Вывод: [32902 символа, слишком длинный для обработки]

Так что, похоже, мой подход к колмогоровской сложности не настолько успешен ;-)


2

SMBF , 28 байт

\x10представляет буквенный байт (десятичное значение 16). Целое число выводится как целое число (байт). Итак, первый символьный вывод \x01. Затем программа печатает ",". При печати собственного источника, он печатает дополнительный +в начале.

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

Объяснение:

+.                                  Increment number and print
  <-                                Pre-decrement loop counter
    <<.>.>                          Print comma and space from own source
          [             ]           Only execute if loop counter != 0
           [<]>.                    Move to left of source, then print `+`
                [.>]                Print entire source.
                    <[-]            Zero out the loop counter so this program halts.
                         , \x10     The comma, space, and loop counter used earlier.
                                    Input is empty, so `,` doesn't do anything.

Обратите внимание, что вы не можете запустить это в стандартном интерпретаторе, потому что он требует шестнадцатеричный литерал во входных данных. Вам также нужен специальный терминал для шестнадцатеричного вывода для правильной работы.


1

Bash, 78 74 73 - 10 = 63 байта (пример, победа невозможна)

p='if(($((++a>15))));then unset a p;fi;echo ${a-STOP\!}${p+, $p}';eval $p

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

Объяснение:

Это работает, потому что aшаги от 1 до 15, а затем unsetвместе с p. Скрипт (хранится в p) печатает их обоих, если они setи "STOP!" иначе. Первоначально unset aравен set0, потому что он появляется в арифметическом расширении.


1

𝔼𝕊𝕄𝕚𝕟, 30 символов / 47 байтов (неконкурентный)

⟮a=1)+(a<ḏ?⬬+ⒸⅩ222+ᶈ0:⬯)ē(a,⧺a

Try it here (Firefox only).

Наконец-то нашел хороший старый истинный квин для 𝔼𝕊𝕄𝕚𝕟.

объяснение

Вот настоящая квинна, которую я использовал: ⟮ⒸⅩ222+ᶈ0

Вы видите это в моем ответе? Надеюсь, вы сможете расширяться оттуда.


1

Кег + PHP, 19-10 = 10 байт

ï_(. \,,,)\!POTS(,

Считает от 1 до 15 и затем останавливается. TIO

Кег, 13 байт

ï_(. \,,,).
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.