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.