1 - ваш средний квин

34

Quine 1-up - это программа, очень похожая на Quine. Единственное существенное отличие состоит в том, что вместо однократной печати, когда n копий программы объединяются, результат печатает исходную программу n + 1 раз.

пример

Если ваша программа Abc123:

Abc123  ->  Abc123Abc123
Abc123Abc123  ->  Abc123Abc123Abc123
Abc123Abc123Abc123  -> Abc123Abc123Abc123Abc123

Вызов

Ваша задача состоит в том, чтобы создать кратчайшую действующую 1-куану на любом языке. Применяются обычные правила Куайна, поэтому вы не можете:

  • Отправьте пустую программу.
  • Прямо или косвенно читайте 1 исходный код.
  • Используйте quining встроенные модули.

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

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

ETHproductions
источник
2
Это нормально, если nограничено каким-либо ограничением типа данных (максимальный целочисленный размер и т. Д.)?
Луис Мендо
2
@ LuisMendo Я думаю, что все в порядке, если вы можете поддерживать разумное количество повторов (возможно, 100).
ETHproductions
Можно ли считать длину исходного кода с помощью встроенного метода quining?
Конор О'Брайен
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Это кажется слишком похожим на получение мне самого исходного кода, так как вы все еще получаете информацию об исходном коде. Так что нет.
ETHproductions

Ответы:

13

GolfScript, 12 байт

{`'.~'+:n}.~

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

объяснение

Это объединяет идеи из стандартного quine GolfScript:

{'.~'}.~

И мой недавно обнаруженный квин :

":n`":n`

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

{        # Standard quine framework. This pushes the block, duplicates it and runs the
         # second copy, such that it can process the first copy to create a quine.
  `      # Convert the block to its string representation.
  '.~'+  # Append the string '.~' to make a complete quine. This is simply left on the
         # stack to be printed at the end.
  :n     # Store the string in n such that one more copy is printed at the end.
}.~
Мартин Эндер
источник
12

GolfScript, 12 байт

{: ".~"][}.~

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

Как работает исходный код

{: ".~"][}.~

{        }    Define and push a code block.
          .~  Push a copy and execute it.
 :            Save the code block in the space character.
              Every subsequent space will now execute the code block.
   ".~"       Push that string.
       ]      Wrap everything up to the last [ in an array.
        [     Set a new array marker.

Если приведенный выше исходный код выполняется один раз, стек в конечном итоге

["" {: ".~"]} ".~"]

где пустая строка в начале соответствует начальному состоянию стека (пустой ввод).

Две копии исходного кода оставили бы окончательное состояние

["" {: ".~"]} ".~"] [{: ".~"]} ".~"]

три копии окончательного состояния

["" {: ".~"]} ".~"] [{: ".~"]} ".~"] [{: ".~"]} ".~"]

и так далее.

Что произойдет дальше

После выполнения исходного кода интерпретатор делает следующее.

  1. Он оборачивает весь стек в массив и помещает этот массив в стек.

    Для двух копий исходного кода стек теперь содержит

    ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [["" {: ".~"][} ".~"] [{: ".~"][} ".~"]]
    
  2. Он выполняется putsс намерением распечатать упакованную стопку с последующей переводом строки.

    putsопределяется как {print n print}, поэтому он делает следующее.

    1. printпечатает свернутую копию стека без проверки его (т. е. без преобразования его в строковое представление). Это отправляет

      {: ".~"][}.~{: ".~"][}.~
      

      (исходный код) в STDOUT и выскакивает копию стека с вершины стека.

      Стек теперь содержит

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"]
      
    2. выполняет блок кода, который мы определили ранее.

      :начинается с сохранения [{: ".~"][} ".~"]в пространстве характер, затем ".~"толкает себя, ]обертывания ".~"в массиве, и [устанавливает новый маркер массива.

    3. n выдвигает строку, состоящую из одного перевода строки.

      Стек теперь содержит

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n"
      
    4. выполняется еще раз. Однако он был переопределен, когда мы вызывали его впервые, и теперь содержит массив, а не блок кода.

      На самом деле, это толкает [{: ".~"][} ".~"], оставляя стек как

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n" [{: ".~"][} ".~"]
      
    5. Наконец, printпечатает самый верхний элемент стека, не проверяя его, отправляя

      {: ".~"][}.~
      

      в STDOUT, 1 - повышение исходного кода.

Деннис
источник
11

Javascript ES6 (REPL), 55 байтов

var a=-~a;$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

Сохранено 2 байта благодаря @ user81655!

объяснение

Вот стандартная структура Quine:

$=_=>`$=${$};$()`;$()

Вы должны увидеть эту структуру внутри представления. Более подробное объяснение ниже.


var a=-~a;

Это счетчик, по умолчанию равный 1. В основном, он говорит нам, сколько нужно повторять квин и приращения в одно и то же время.

$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

Это часть Quine. По сути, мы повторяем строку quine счетчиком +1. Последующие вызовы функций отменят вывод.

Mama Fun Roll
источник
Это может быть только я, но это ничего не печатает. (проверено с использованием JSFiddle, если это имеет значение?)
jrich
Ах, вы должны использовать консоль Firefox. (И перезагрузите после каждого запуска, чтобы сбросить a).
Мама Fun Roll
Я не думаю, что вам нужноvar
Cyoce
Нет, я делаю, потому что изначально не определено. Использование var позволяет нам работать с ним.
Mama Fun Roll
7

CJam, 14 байтов

{"_~"]-2>_o}_~

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

Как это работает

{"_~"]-2>_o}_~

{          }    Define a code block and push it on the stack.
            _~  Push and execute a copy of it.
 "_~"           Push that string.
     ]          Wrap the entire stack in an array.
      -2>       Discard all but the last two elements (block and string).
         _o     Push and print a copy of that array.

После выполнения последней копии программы массив, содержащий блок и строку, все еще находится в стеке, поэтому он печатается неявно.

Деннис
источник
4

Groovy, 83 байта

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

Есть один встроенный и не завершающий перевод строки. Это печатает:

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

Функция f()печатает одну копию Quine. Первоначальная программа вызывает его дважды. Первая строка добавленного кода становится комментарием, и выполняется только второй вызов f().

Sleafar
источник
4

Рубин, 43 байта

1;s="1;s=%p;$><<s%%s*n=2-0";$><<s%s*n=2-0

Само по себе это печатает сам 2-0или 2раз. При объединении с другой копией самого себя конечный оператор печати выглядит следующим образом $><<s%s*n=2-01, то есть он выводит себя только один раз ( 01будучи восьмеричным 1). Таким образом, только последняя копия строки печатается дважды, остальные печатаются один раз.

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

histocrat
источник
4

NodeJS, 63 61 60 55 байт

это также будет работать в JavaScript (ES6), если вы считаете, что несколько сообщений консоли разделяются символами новой строки (REPL не требуется)

Сохранено 2 байта благодаря @ dev-null

(f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t()))()

обратите внимание, что в конце кода есть новая строка.


Это был интересный, безусловно, один из моих любимых на этом сайте.

Я вполне уверен, что это не может быть гораздо лучше. (возможно, printфункция SpiderMonkey ...)

объяснение

//FIRST ITERATION
            console.log(`(f=${f})()`)                   //logs to the console a quine of the source code using function f's toString()
                                     ||                 //causes the expression to evaluate to the second part, since console.log's return value is falsy
                                       (_=>t)           //a function that returns function t when called
       t=_=>                                            //defines function t to be the code above. When called, t will log a quine and then return a function that returns t.
      (                                      )(t())     //call t twice. (one call is done via the t() as an ignored parameter) This will print the quine twice.
 f=_=>                                                  //define f as the above code.
(                                                  )()  //call function f with no arguments. this results in a function returning t. (the result of calling t once)
                                                        //this newline is to compensate for console.log's behavior of adding a newline to its output
//SECOND ITERATION
(                                                  )    //call the function that returns t that was returned from the first iteration. This expression will result in whatever that function returns, which is t.
 f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t())     //this part evaluates to a function, which is passed as a parameter to the function that returns t, that ignores its parameter.
                                                    ()  //call whatever the last expression returned, which is the function t, with no parameters. This will print the quine once.
                                                        //this call will result in a function returning t, just like from the first iteration, so we can add on more iterations at will.
jrich
источник
Мне нравится, как это выглядит так, будто сначала надеваешь солнцезащитные очки. (f=_=Я могу быть немного уставшим.
Бен Легжеро
2

Рубин, 55 байт

n||=2;s="n||=2;s=%p;$><<(s%%s)*n;n=1;";$><<(s%s)*n;n=1;

Здесь нет ничего интересного, это просто обычный рубиновый квин с прилавком.

afuous
источник
2

JavaScript (ES6), 164 байта

console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))
console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))

Работает на любой странице тестирования JS или консоли в Firefox, предполагая, что пробел между двумя сообщениями консоли считается переводом строки.

ETHproductions
источник
Много реквизита для этого на универсальном языке!
Бен Легжеро
сократить windowдо this.
Мама Ролл
1

Y

Неконкурентный, 6 байт

UCn*px

Y - головная пушка, которая у меня была некоторое время, и это вдохновило меня на ее написание. Это сделано для задач, в которых последовательность является ключевой, таких как эта. Код разделен на ссылки по символам «узла». В этом случае наш код помещается в две цепочки (изначально) с узлом C.

U  C  n* px
1  N    2

Uзаписывает трансцендентную строку, т. е. ту, которая охватывает ссылки. Он записывает, пока не встретит другого U. Если a Uне встречается в конце строки, он оборачивается. Также Uвключен в строку по умолчанию. После записи строки мы переходим к узлу C, который просто перемещает нас к следующей ссылке.

nтолкает количество цепей. Для нашего базового случая это 2. Для последовательности Kцепочек существуют K+2цепочки, так же как и Kузлы. *это повторение строки. pпечатает весь стек (в данном случае одну строку) и xзавершает программу

В тексте:

UCn*px
U..... record that string
 C     next link
  n*   repeat that string twice.
    px print and terminate

UCn*pxUCn*pxUCn*px
U.....U            record string
 C                 next link
  n*               repeat that string four times (three Cs)
    px             print and terminate

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

Конор О'Брайен
источник
Так в чем же практическая польза от Uкавычек? (Поздравляю с 7k, кстати)
ETHproductions
@ETHproductions U может использоваться для захвата строки, которая охватывает ссылки, также может захватывать и тратить ссылки на программу. И спасибо! : D
Конор О'Брайен
1

Брахилог , 20 байт

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

Модифицировано из этого квайна.

⊥                       Fail,
 ∨                      or
                w       print
  "⊥∨~kgjw₃w₅"          "⊥∨~kgjw₃w₅"
                 ₃      formatted
              gj        with itself;
                 ₃w₅    print it again at the end of the program if this route succeeds.

Когда он соединяется с самим собой, каждый маршрут, кроме последнего, завершается неудачно, и программа переходит к следующему, выполняя каждый w₃и возвращаясь к предыдущему, w₅кроме самого последнего.

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

Несвязанная строка
источник