1-річна середня кількість квіток


34

1-вгору Куайн це програма , яка дуже схожа на Куайна. Основна відмінність полягає в тому, що замість того, щоб надрукувати себе один раз, коли n копій програми об'єднано, результат виводить оригінальну програму n + 1 раз.

Приклад

Якщо ваша програма Abc123:

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

Виклик

Ваше завдання полягає в тому, щоб створити найкоротший дійсний 1-вгору quine будь-якою мовою. Застосовуються звичайні правила кволі, тому ви не можете:

  • Надішліть порожню програму.
  • Прямо чи опосередковано прочитайте 1 вихідний код.
  • Використовуйте вбудовані вбудовані програми.

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

1 Це не включає використання жорстко закодованого рядка або блоку коду як частини вашої програми.


2
Чи нормально, якщо nвоно обмежене деяким обмеженням типу даних (максимальний цілий розмір тощо)?
— Луїс Мендо

2
@LuisMendo Я думаю, що це нормально, якщо ви можете підтримувати розумну кількість повторів (можливо, 100).
— ETHproductions

Чи добре зчитування довжини вихідного коду за допомогою вбудованого методу квінінгу?
— Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Це здається занадто схожим на отримання самого вихідного коду для мене, оскільки ви все ще отримуєте інформацію про вихідний код. Так ні.
— ETHproductions

Відповіді:


13

GolfScript, 12 байт

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

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

Пояснення

Це поєднує ідеї зі стандартної квітки GolfScript:

{'.~'}.~

І моя нещодавно виявлена ​​quine :

":n`":n`

Основна ідея - знову використовувати те, nщо друкується неявно в кінці програми, щоб отримати додаткову копію quine. Оскільки присвоєння змінної нічого не змінює, коли це робиться знову в наступних копіях, це додасть лише одну копію. Ось розбивка коду:

{        # 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 лічильником + 1. Подальші виклики функції перекриють вихід.


Це може бути тільки я, але це, здається, нічого не друкує. (перевірено за допомогою JSFiddle, якщо це має значення?)
— jrich

Ах, вам слід скористатися консоллю Firefox. (І перезавантажуйте після кожного запуску для скидання a).
— Mama 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()друкує одну копію ланцюжка. Початкова програма викликає її двічі. Перший рядок доданого коду стає коментарем, і f()виконується лише другий дзвінок до .


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будучи восьмим восьмим). Отже, лише остаточна копія рядка друкується двічі, інші друкуються один раз.

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


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.

Мені подобається, як це також виглядає, як спочатку надягати сонцезахисні окуляри. (f=_=Я, можливо, трохи надто втомився.
— Бен Леджієро

2

Рубін, 55 байт

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

Нічого дуже цікавого тут, це просто звичайна рубінова квітка з прилавком.


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, припускаючи, що проміжок між двома повідомленнями консолі вважається новим рядком.


Багато реквізитів для цього загальною мовою!
— Ben Leggiero

скоротити windowдо this.
— Mama Fun Roll



1

Y

Без конкуренції, 6 байт

UCn*px

Y - це гармати, які я мав деякий час, і це надихнуло мене на його написання. Він створений для викликів, у яких ключове значення має послідовність, наприклад ця. Код розділений на посилання символами "вузла". У цьому випадку наш код розміщується у дві ланцюги (спочатку), при цьому вузол є C.

U  C  n* px
1  N    2

Uзаписує трансцендентальний рядок, тобто такий, який охоплює посилання. Він записує, поки не зустріне іншого U. Якщо а 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, btw)
— ETHproductions

@ETHproductions U може використовуватися для зйомки рядка, який охоплює посилання, а також здатний захоплювати та проводити демонтаж посилання на програму. І дякую! : D
— Conor O'Brien

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₅

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

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