Quine / обратный Quine


26

Напишите полную программу, которая принимает логические или неотрицательные целочисленные значения. Это должно:

  • Вывести собственный исходный код, если введенное значение ложно
  • Вывести собственный исходный код в обратном порядке, если введенное значение верно

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

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


6
Так что ... если мой язык не имеет логических значений. Но 0 - это ложь, а натуральные числа - это правда. Могу ли я предположить, что ввод будет только 0 или 1 (в качестве замены для логических значений - язык фактически всегда будет давать один из этих двух в результате условного оператора)? Или я должен поддерживать любые целые числа, так как я не могу использовать «фактические» логические значения?
Мартин Эндер,

Ответы:


9

Gol> <> , 9 байт

'rd3*I?rH

Я чувствую себя немного неловко, когда пишу это, поскольку у нас уже есть ответы> <>, Vitsy и Minkolang. Единственными дополнениями к стандартному quine являются I(чтение целочисленного ввода), ?(выполнение далее, если верно) и r(обратный стек).

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


Присоединиться к клубу! : D Ты все равно выигрываешь. +1
Аддисон Крамп

1
8 байтов:sP#Hr?I"
Джо Кинг,

18

CJam, 17 16 байтов

{`"_~"+Wq~g#%}_~

Проверьте это здесь.

Довольно прямолинейная модификация стандартного квайна. Другие решения для 17 байтов:

{`"_~"+q~{W%}&}_~
{`"_~"+q~!2*(%}_~

Если я могу предположить, что ввод равен 0 или 1 (в качестве замены для логического значения, для которого в CJam нет выделенного типа), я получу 15, пропустив g:

{`"_~"+Wq~#%}_~

объяснение

{`"_~"+  e# Standard generalised quine framework. Leaves the source code on the stack. 
  W      e# Push a -1.
  q~     e# Read and evaluate input.
  g      e# signum, turning truthy values into 1 (leaving 0 unchanged).
  #      e# Power. -1^0 == 1, -1^1 == -1.
  %      e# Select every Nth element: a no-op for 1 and reverses the string for -1.
}_~

Поскольку 0 и 1 являются логическими значениями CJam, я не думаю, что вам нужно g.
Деннис

@ Денис Да, я не был уверен в этом.
Мартин Эндер

Удивительно, но я как-то победил это. oO Я не удивлюсь, если вы играете в гольф больше, хотя. : D
Эддисон Крамп

9

Pyth, 17 байт

_WQjN*2]"_WQjN*2]

Простая модификация стандартной Pyth Quine.


Черт, я ждал, чтобы опубликовать это через час после того, как это было в песочнице.
lirtosiast

7

> <>, 17 байт

Требуется флаг -v (+1 байт) для помещения ввода в стек (или для того, чтобы вы заранее поместили ввод в стек в онлайн-интерпретаторе).

'rd3*$?rol?!;70.

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

'rd3*ic%?rol?!;80.

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

Истина / ложь для> <> - это ничто, кроме 0 и 0 соответственно.


6

Витси , 15 байт

... Я ... Я бью CJam! (кричит) Мама! Смотри, мама, я сделал это!

«RD3 * i86 * -) ге \ O

Объяснение:

«RD3 * i86 * - (ге \ O
Стандартный Quine, но с изюминкой:

Захват исходного кода в виде строки
 rd3 * Создать символ 'в ASCII
     i86 * - получить входной символ как ASCII, затем вычесть из него 48. 
                    Если он равен нулю, оператор if пропустит следующую инструкцию.
          (r Если верхний элемент стека равен нулю, не делайте следующий элемент.
                    Следующий пункт здесь обратный.
            l \ O Распечатать стопку.

Новая версия Vitsy , 11 байт

v'rd3 *} v) RZ
v Захватить ввод как переменную.
 «Захват источника до встречи с другим»
  • Переверните стек.
   d3 * Push 'в стек.
      } Поверните стопку вправо.
       v) Переместите переменную (входную) в стек и проверьте, не равен ли он нулю.
         Если это так, переверните стек.
          Z Вывести все в стек.

2

Javascript (ES6), 42 байта

$=_=>'$='+(_?$:[...''+$].reverse().join``)

Это модификация моего Bling Quine . Это вдвое длиннее тоже.


Это действительно что-то выводит? Ответы, которые работают только в REPL, не допускаются.
feersum

1
@ETHproductions Это вызвало бы функцию, но все равно ничего не печатало бы. Кроме того, это больше не будет Куайн.
Деннис

@ Деннис Верно. Ну, я думаю, что средства prompt()необходимы, если мы не переключимся на Node.JS. Я считаю, что $=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())работает должным образом, хотя, возможно, это может быть в гольфе больше.
ETHproductions

1
«Ваша программа не может [...] читать свой собственный исходный код каким-либо образом». Это решение попадает в эту категорию?
ETHproductions

2

Бурлеск, 40 байт

ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

Объяснение:

Burlesque имеет расширенные встроенные функции для работы со стеком и кодами. Фактически, вы не можете получить доступ к исходному коду программы, но вы можете получить доступ к оставшемуся коду, который должен быть выполнен в будущем. Это означает, #Qчто вернет весь код, который следует за ним, поэтому мы должны добавить все #Qк этому коду, что мы и делаем ri#Q.

blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q

++1 2технически недопустимый код, так как он основан на стеке. Но мы можем манипулировать кодом, чтобы он выполнялся как 1 2++:

blsq ) #Q<-#q++1 2 
12

Работать с этими встроенными модулями невероятно сложно, и никто до сих пор не использовал их для чего-то продуктивного, кроме вещей, связанных с Quine. Если вы перевернете, ++1 2вы получите то, 2 1++что будет производить, 21а не 12. Причина, по которой приведенный выше код 12состоит в том, что он #Qтакже включает в себя то, <-что в итоге мы выполняем намного больше, чем просто 2 1++: p. Мы заканчиваем тем, что выполняем, 2 1++#q<-который производит 12.

Мы можем фактически заменить вещи в нашем коде, например, этот код заменяет все вхождения ?+в себе?*

blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25

Использование:

$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

2

Haskell, 126 118 108 байтов

main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="

Ожидается 0или 1как вход.


2

Минколанг 0,10 , 13 байт

"66*2-n,?r$O.

Попробуй это здесь.

Это так же , как стандартный Куайном этих четырех символов , за исключением: n,?r. nберет целое число из ввода, ,инвертирует его, поэтому ?пропускает, rесли ввод верен. В противном случае rстэк переворачивает стек так, чтобы он выводился в обратном порядке.


1
Мой гром ушел. : c
Эддисон Крамп


0

Java 10 (полная программа), 282 байта

interface N{static void main(String[]a){var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}

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

Java 10 (как лямбда-функция), 154 байта

b->{var s="b->{var s=%c%s%1$c;s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}";s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}

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

Объяснение:

interface N{                          // Class
  static void main(String[]a){        //  Mandatory main-method
    var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";
                                      //   Unformatted source code
    s=s.format(s,34,s);               //   Format the source code (the quine-String)
    System.out.print(                 //   Print:
      new Boolean(a[0])?              //    If the input is true:
       new StringBuffer(s).reverse()  //     Print the quine-String reversed
      :                               //    Else:
       s);}}                          //     Print the quine-String as is

объяснение:

  • var sСодержит исходный код неформатированную
  • %s используется, чтобы поместить эту строку в себя с s.format(...)
  • %c, %1$cИ 34используются для форматирования двойных кавычек
  • s.format(s,34,s) складывает все вместе

И затем new StringBuffer(s).reverse()используется, чтобы при необходимости перевернуть строку quine-String на основе логического значения input.


0

05AB1E , 21 байт

0"D34çý‚sè"D34çý‚sè

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

Модификация по умолчанию 0"D34çý"D34çý , добавив ‚sè.

Объяснение:

0                        # Push 0 to the stack
                         #  STACK: [0]
 "D34çý‚sè"             # Push the string 'D34çý‚sè' to the stack
                         #  STACK: [0, 'D34çý‚sè']
            D            # Duplicate this string
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè']
             34ç         # Push '"' to the stack
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè', '"']
                ý        # Join the stack with '"' delimiter
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè']
                 Â       # Bifurcate (short for Duplicate & Reverse)
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè', 'ès‚Âýç43D"ès‚Âýç43D"0']
                        # Pair them up:
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0']]
                   s     # Swap to get the boolean input (0 or 1)
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0'], 1]
                    è    # Index the input into the list
                         #  STACK: ['ès‚Âýç43D"ès‚Âýç43D"0']
                         # (Output the top of the stack implicitly)

PS: автоматически печатает завершающий перевод строки. Если это также должно быть обращено, вместо этого это 23 байта:

0"D34çý‚sè?"D34çý‚sè?

Попробуйте онлайн. ( ?явная печать без новой строки )

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