Друкуйте від 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+""повертає будівельний код функції.)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ без нього, чи можна навіть досягти завдання ...
nicael

@nicael Це вже зроблено, принаймні у відповіді js
Conor O'Brien

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вважається мовою?
користувач253751

@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 для отримання тіла функції (сіра зона для квітації)
квітня 1616

2
@Callodacity Як це "" + (n=>m)не вважається отриманням функції функції n=>m?
Ніл

@Neil Насправді ти маєш рацію, це враховує - я не помітив, що оскільки я переглянув лише програму 1 і не пройшов вихід
квітня 1616

Куди пішли всі зворотні риси !?
Noodle9

5

Матлаб, 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? Я не кажу, що це недійсно, мені просто цікаво, в чому різниця?
Стюі Гріффін

Я тільки працював над одним. o_o Ви не можете .replace(x++,x)?
Conor O'Brien

3
@StewieGriffin Ones, створений для відведення, інша є законною особливістю.
Conor O'Brien

@Stewie Але "оператор quine" повинен повернути всю програму, а в моєму прикладі він отримує функцію, без мети робити quine (немає вбудованого, щоб повернути весь код програми). Як ви дозволили функції, це може бути схожим, тому мені було цікаво.
nicael

Чи a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)працює?
Conor O'Brien

5

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

Whee !!! Це було весело. Набагато коротше зараз. : P

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 Набагато коротше, хоча я все ще не маю шансів. : P


Ого. Чи можете ви додати пояснення, оскільки це круто, але я поняття не маю, що відбувається: D
Sherlock9

@ Шерлок9 зроблено. Дякуємо за вашу вдячність
Rɪᴋᴇʀ

Якщо я вирізаю та вставлю це в інтерактивний сеанс python 2.7.6, він скаржиться, що перед elses немає пробілів .
eric

@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рівного великій оле-довгій рядку майже коліна вихідного коду. Він виводить , 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. Таким чином, коли $cбуде 15, вийде 15і більше нічого. Не може претендувати на бонус, оскільки "15, {0}STOP!{0}"5 символів занадто довгі, щоб значення -10 було вартим.

Потрібен термінал PowerShell шириною> ~ 150. Або для того, щоб ви вручну видалити додатковий рядок (який термінал корисно вставляє у вихідну обгортку) під час копіювання коду. Або для того, щоб ви захопили вихід у змінну, а потім повторно виконали цю змінну. І т.д.

Редагувати 1 - збережено кілька байтів, видаливши "STOP!" формулювання.
Edit 2 - Durr, не використовуйте .length кожен раз, просто зателефонуйте йому один раз
Edit 3 - Не потрібно бути quine, тому початковий запуск може бути набагато коротшим
Edit 4 - Змінено від використання рядків на масиви для обчислення $c, які зберегли два байти. Я впевнений, що це майже оптимально для цього підходу.
Edit 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

Befunge, 57 - 10 = 47 байт

1:'!`'#*j:.',,1+:9`''*'0++,1#;:0g:48*`j@,1+;"!POTS",,,,,@

Цей дивовижний. Спробуйте тут .


Правий кожух для стоп-повідомленняSTOP!
user48538

@ zyabin101 виправлено.
MegaTom

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і "СТОП!" інакше. Спочатку unset aдорівнює set0, оскільки це виявляється в арифметичному розширенні.


1

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

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

Try it here (Firefox only).

Нарешті знайшов добрий ol 'справжній quine для 𝔼𝕊𝕄𝕚𝕟.

Пояснення

Ось справжній квин, який я використав: ⟮ⒸⅩ222+ᶈ0

Ви це бачите у моїй відповіді? Сподіваємось, ви зможете розширитись звідти.


1

Keg + PHP, 19-10 = 10 байт

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

Налічує від 1 до 15, а потім зупиняється. ТІО

Кег, 13 байт

ï_(. \,,,).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.