Добавочный Quine

23

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

Например, если ваша программа была fooна языке barв файле baz.bar, вы должны получить вывод, подобный следующему:

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

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

Это код-гольф, поэтому выигрывает самая короткая программа в байтах.

Конор О'Брайен
источник
1
Если мы можем изменить исходный код файла, значит ли это, что мы тоже можем его прочитать?
FlipTack
1
@ Flp.Tkc Хороший вопрос. Я, честно говоря, понятия не имею. Я не хочу, чтобы вы строили квин, читая источник, но я в порядке, если вы читаете источник только для модификации файла.
Конор О'Брайен

Ответы:

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 раз и т. Д.

Деннис
источник
Я не знаю желе, так что точно делает нижний колонтитул? Почему ^ 17?
Конор О'Брайен
Вызовите ссылку выше ( ¢), функцию идентификации ( ¹не очень нужна после первого вызова), установите возвращаемое значение в перевод строки ( неявно печатает предыдущее возвращаемое значение), повторите. ¹и оба верхних индекса, но они не связаны. Я заменил их на менее запутанные ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(вызов, объединение, повтор).
Деннис
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

Maltysen
источник
Если я не ошибаюсь, вы должны включить вызов функции как часть кода.
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!

объяснение

Начните с этого стандартного пункта Пип:

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 имеет циклическую индексацию, поэтому, как только функция напечатает свой последний символ, она начнется сначала.

DLosc
источник
1

Python, 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

Это функция генератора Python , означающая, что вы выполняете итерацию по ней, и каждая итерация предоставляет следующий символ в исходном коде. Когда все символы были возвращены, происходит сбой 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)

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

FlipTack
источник
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
redstarcoder
источник
хаха, я понятия не имел, что ты можешь назвать файл "\ n". Хотя это технически читает исходный код по gинструкции.
Конор О'Брайен
@ ConorO'Brien, ну честно. хм ...
redstarcoder
Есть ли у *> <> какая-то индексация стека? Или команда повторения? Затем вы можете использовать стандартную структуру quine "your code goes here;для> <>, а затем получить доступ к n-му члену в стеке
Conor O'Brien
@ ConorO'Brien да, Teal Pelican показал мне этот вариант с квин-кодом на моем другом ответе-обманщице :).
Redstarcoder
1
@redstarcoder Я больше работал над quines (YAY!), и я нашел хороший трюк, если вы замените r на #, вы можете: 1- # like; #; или [+ 1F1: + 1iF1a-1: "Я не могу проверить это в данный момент, но я верю, что это вырезает 1 байт из вашего кода.> <> Кавычки могут быть выполнены как #o <-1:" и т. д.: D
Тил пеликан
1

Mathematica, 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

Microscript II, 40 33 байта

Литерал блока кода, ближайший эквивалент языка функции:

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

После запуска он возвращается в xисходное состояние, чтобы его было легче вызывать снова.

SuperJedi224
источник
0

Bash (и zsh, ksh), 39 байтов

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

Он ничего не печатает после того, как программа распечатана.

Убедитесь, 0что не существует в текущем каталоге и выполните:

bash iquine.bash
Кайто Удагава
источник
Добро пожаловать в PPCG! У вас есть умная идея для увеличения индекса. К сожалению, похоже, что этот ответ работает, читая собственный исходный код, что означает, что он не является действительным квин по нашим стандартам . Если вы измените его, чтобы использовать методы квин, отличные от чтения его собственного источника, это будет хорошим ответом.
DLosc