Інкрементальна квін


23

Ваше завдання - написати програму або функцію, яка виводить перший символ її вихідного коду, потім другий, потім третій ... кожного разу, коли він запускається.

Наприклад, якщо ваша програма була fooмовою barу файлі baz.bar, ви повинні отримати вихід подібний до цього:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Ваша програма може зробити що завгодно, як тільки виконала друк свого вихідного коду таким чином. Ви можете змінити вихідний код для файлу, але пам’ятайте, що вихідний код для друку - це оригінальний вихідний код.

Це кодовий гольф, тому виграє найкоротша програма в байтах.


1
Якщо ми можемо змінити вихідний код для файлу, чи це означає, що ми можемо також прочитати його?
FlipTack

1
@ Flp.Tkc Добре запитання. Я, чесно кажучи, поняття не маю. Я не хочу, щоб ви конструювали quine, читаючи джерело, але я добре, якщо ви читаєте джерело лише для модифікації файлу.
Conor O'Brien

Відповіді:


6

Желе , 12 байт

“;⁾vṾ®ȯ©Ḣ”vṾ

Це ніладичне посилання. Спробуйте в Інтернеті! (Включає код для виклику посилання дванадцять разів.)

Як це працює

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Як додатковий бонус, оскільки реєстр буде містити порожній рядок після дванадцятого дзвінка, він знову виявляється хибним і посилання готове починати спочатку. Якщо виклик посилання 24 рази, виведете вихідний код двічі, називаючи його 36 разів тричі тощо.


Я не знаю Jelly, так що саме робить колонтитул? Чому ^ 17?
Conor O'Brien

Виклик посилання вище ( ¢), функція ідентифікації ( ¹насправді не потрібна після першого дзвінка), встановлення значення повернення для виведення рядка ( , неявно друкує попереднє значення повернення), повторити. ¹і обидва надриски, але вони не пов'язані між собою. Я замінив їх на менш заплутані ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(дзвоніть, об'єднуйте, повторюйте).
Денніс

12

Javascript - 26 байт

Визначає, f()що повертає символ вихідного коду за символом.

n=0;f=x=>("n=0;f="+f)[n++]

Повертається невизначено після закінчення символів.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


Якщо я не помиляюся, ви повинні включити виклик функції як частину коду.
Mama Fun Roll

@MamaFunRoll посилання на відповідну мета-пошту?
Пуховик

Я не знаю жодного: P Однак я завжди вважав, що сам виклик функції є частиною quine; може, чогось мені не вистачає?
Mama Fun Roll

@MamaFunRoll Специфікація спеціально дозволяє функції, тому дзвінок не потрібен. Це не було б особливого сенсу для цього виклику парциларів.
Денніс

Добре, просто переконуюсь.
Mama Fun Roll

2

складений , неконкурентоспроможний, 34 байт

[tostr ':!' + execCounter # out]:!

Варіація на стандартну квінку. Це повна програма. Це використовується, execCounterщоб отримати скільки разів спеціально запускалася ця програма. Помилки після виведення всього.

Спробуйте тут!


2

Піп , 31 байт

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Анонімна функція. Перевірте його на TIO!

Пояснення

Почніть з цієї стандартної Pip quine:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Загорніть це у фігурні дужки, щоб зробити його функцією. Тепер, замість повернення всього джерела, нам потрібно проіндексувати його. Використання глобальної змінної для індексу та збільшення його кожного разу буде виконувати вимогу "наступний символ кожного разу, коли він називається". vє найкращим кандидатом, оскільки він попередньо ініціалізований -1. Підвищення його вперше дає індекс 0, наступного разу 1тощо.

Pip має циклічну індексацію, тож як тільки функція надрукує свій останній символ, вона почне запускатися на початку.


1

Пітон, 90 байт

Розширення на стандартну Python quine (поради щодо гольфу):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Це функція генератора пітона , це означає, що ви повторюєте її, і кожна ітерація забезпечує наступний символ у вихідному коді. Коли всі символи повернуті, це припиняється IndexError.

Для тестування просто додайте цей скрипт до кінця програми:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

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


1

*> <> , 13 21 байт

" r:2+a1Fi1+:1F1+[ro;

Створює файл, названий \nдля відстеження індексу.

Це може бути в гольфі більше, але нічого одразу не вискакує на мене ...

Вихід

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

Пояснення

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Обман Інкрементального Квіне

a1Fi1+:0go1F;

Пояснення

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

ха-ха, я не мав уявлення, що ти можеш назвати файл "\ n". Хоча це технічно читає вихідний код, gінструкцією.
Conor O'Brien

@ ConorO'Brien, ах досить справедливо. хм ...
redstarcoder

Чи має *> <> якусь індексацію стека? Або повторення команди? Потім ви можете використовувати стандартну рамку quine "your code goes here;для> <>, а потім отримати доступ до n-го члена на стеку
Conor O'Brien

@ ConorO'Brien, так, Тіл Пелікан показав мені цей варіант у цій іншій моїй відповіді.
redstarcoder

1
@redstarcoder Я працював більше над quines (ТАК!), і я придумав хороший трюк, якщо ви заміните r на #, ви можете: 1- the # like; #, Або [+ 1F1 + 1iF1a-1: «Я не можу перевірити це на даний момент , але я вважаю , що це скорочує 1 байт з коду> <> quines може бути зроблено як #O <-1 :.» і т.д .: D
Пелікан

1

Математика, 91 байт

Коментарі дуже вітаються; Я досі вивчаю мотузки про те, які лайки - це належні лайки.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Визначає функцію, яка викликається повторно, без аргументів. Після 91-го виклику він видає велику помилку і повертається неоціненою.

Долажно було подолати два питання: по-перше, я хотів просто використати StringTake[ToString[#0]<>"[]"], але, ToString[]здається, стерти лапки; тому мені довелося замінити "[]"на FromCharacterCode[{91, 93}]. По-друге, змінні Mathematica починаються неініціалізованими, тому я не можу викликати ++qраніше, ніж qвизначено; ось чому If[!NumberQ[q], q = 0]потрібен початковий .

Нерелевантний код: дивлячись вгору NumberQ, я дізнався, що Mathematica має функцію під назвою TrueQ... яка, так, повертається, Trueякщо аргумент є Trueі Falseякщо аргумент є False! (Утиліта полягає в тому, що вона повертається і Falseдо всіх інших аргументів.)


1

Мікроскрипт II, 40 33 байт

Блок коду буквально, найближчий еквівалент функції функції:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Після запуску він повертається до себе, xщоб зробити його простіше знову.


0

Bash (і zsh, ksh), 39-байт

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

Він нічого не друкує після того, як програма буде роздрукована.

Переконайтесь, 0що в поточному каталозі не існує та запустіть:

bash iquine.bash

Ласкаво просимо до PPCG! У вас розумна ідея збільшення індексу. На жаль, схоже, що ця відповідь спрацьовує, читаючи власний вихідний код, а це означає, що вона не є дійсною квітами за нашими стандартами . Якщо ви модифікуєте його для використання методів quine, окрім читання власного джерела, це буде гарною відповіддю.
DLosc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.