Складіть переплітаючу квітку


17

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

Якщо ваша оригінальна програма Derp:

Derp -> Derp (must return itself as output to be a quine)

DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)

DerpDerpDerp -> DDDeeerrrppp
etc. etc.

Майте на увазі, що у вашій "базовій" програмі вам доступно пробіли, але вони враховуються під час "переплетення". Скажіть, ваша програма є

Derp 
{newline}

(Новий рядок позначає зворотний новий рядок, а після цього є додаткове місце Derp). Коли дублюється, щоб стати

Derp 
Derp 
{newline}

Ви повинні вивести

DDeerrpp  
{newline}
{newline}

Майте на увазі, що 2після DDeerrpp.

Правила та характеристики:

  • Ваша програма повинна містити принаймні два різних символи (що означає, що ваш код повинен бути принаймні 2 байти).
  • Застосовуються стандартні правила квочки .

Це , тому найкоротший код у байтах виграє!


1
"Застосовуються стандартні правила" - чи означає це відсутність читання вихідного коду?
FlipTack

@FlipTack Це означає, що - прочитайте посилання для отримання додаткової інформації.
клісмік

Відповіді:


12

Ділення , 6 байт

'!+OR"

Спробуйте в Інтернеті! Спробуйте дві копії! Спробуйте три!

Пояснення

Це просто стандартна квітка Fission . Це, як правило, працює над цим викликом, оскільки Fission має чіткі вхідні точки до програми. Зокрема, дублюючи програму, ми додаємо ще один, Rякий додає інший атом (покажчик інструкції). Оскільки вихідний код є тороїдальним, ефективний код, який виконується, не змінюється інакше - для кожного атома код все ще виглядає локально однаковим. Однак атоми виконуються на етапі блокування, так що речі, які вони друкують, переплітаються, і ми отримуємо додаткову копію кожного символу у висновку.

Для повноти я лише коротко повторю, як працює сама програма. Незалежно від того, повторюємо ми програму чи ні (наприклад '!+OR"'!+OR"'!+OR"), кожен атом бачить такий код:

R"'!+OR"'!+O

"Режим друку перемикає рядки, так що програма починається друк '!+ORбезпосередньо на STDOUT, що все , окрім Куайном цитати. Потім '!встановлює масу атома на код символу !, +збільшує його, який дає ", і Oдрукує його, одночасно знищуючи атом. Потім програма припиняється, тому що атомів не залишилося.


11

Python 2.7, 377 310 304 194 191 байт!

Це мій перший гольф, тому я не очікував, що це буде занадто добре. Але я вважав, що концепція рішення, яке я придумав, є дещо смішним, тому я все-таки розміщую його.

def f():
 import threading as T,inspect as i;global t,a,i
 try:t.cancel()
 except:a=0
 a+=1;t=T.Timer(1,d);t.start()
def d():print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")
f()

Дійсно, це квінка; ви можете спробувати тут . Він зловживає модулем перевірки досить важко.

Якщо ми спробуємо запустити його з тим же вихідним кодом x2, ми отримаємо і правильний вихід; ви можете спробувати це тут . x3, x4 та ін., всі працюють як очікувалося.

Необурені з поясненням:

def f():                                   # Defines a central function f
    import threading as T,inspect as i     # Imports threading and inspect
    global t,a,i                           # Global vars
    try:
        t.cancel()                         # Tries to cancel Timer from previous code
    except:
        a = 0                              # Reached when code is 1st copy; initializes a.
    a += 1                                 # a++; this is the number of copies thus far.
    t = T.Timer(1,d)               # Creates, then starts a timer to call function
    t.start()                              # d in 1 second.

def d():                                   # Prints out the source code; the quine part.
    print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")

f()                                        # Calls f()!

Хіба це не обман, бо він читає вихідний код власних функцій за допомогою inspect? (див. відповідний мета-пост ). У PPCG ми маємо конкретні визначення того, що робить квітку дійсною, а "читання джерела" зазвичай розцінюється як обман.
FlipTack

@FlipTack Я не впевнений, що перевірка функції - це те саме, що читання вихідного коду. Лайки в JavaScript та мовах на основі стека роблять це постійно.
Денніс

Добре :). Я додав виділення синтаксису для вашої публікації. Хороша ідея з використанням різьби!
FlipTack

import threading,inspect as iможнаimport threading as T,inspect as i
nedla2004

@FlipTack На жаль, дякую.
Кальконім

3

CJam , 19 байт

{]W=s"_~"+T):Te*}_~

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

Як це працює

{               }_~  Define an anonymous code block (function).
                 _~  Push a copy, and execute the copy.
 ]W=                 Wrap the entire stack in an array and select its last element.
                     This discards whatever was on the stack before the original
                     code block, which is needed for subsequent iterations.
    s"_~"+           Cast the code block to string, push "_~", and concatenate.
                     This pushes the stringified source code on the stack.
          T):T       Push T (initially 0), increment it, and save the result in T.
              e*     Repeat each character in the stringified source code T times.

Що ... як ... так швидко ... поясніть, будь ласка, код, щоб ви могли навчити мене способам CJam.
клісмік

@ Qwerp-Derp Я додав пояснення.
Денніс

3

RProgN , 66 байт

Значним пробілом буде смерть мене

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R 

Пояснив

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R   #
[                                                                   # Pop whatever is already on the stack, if anything.
  "[ %q ] F 0 1 + `0 = `. { 0 m } R "                               # This string contains basically the entire function.
                                      ] F                           # ] F duplicates the string, and then F formats it, which in this case puts the first string into the second at %q, surrounded by qoutes.
                                          0 1 + `0 =                # I needed an Incrementer, so I chose 0. 0, is conveniently, pre initilized at 0. And because RProgN is horrifying, you can remap the number functions as they're just more variables. So this increments 0 every time the group is called.
                                                     `. { 0 m } R   # Replace each character with itself repeated '0' times. Because '0' is an incrementer, each time the script is called, the amount of times the characters are repeated increase.

Добрий пане, я чудовисько ...

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


Крім того, хоча він ~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}Rпрацює нормально, але це не є правильним рішенням, оскільки немає можливості копіювати маркер ZSS.
Атако

2

Perl 5, 107 байт

$_=q[$_=q[S];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}

Безумовно:

$_ = '...INSERT_SOURCE_HERE...';      # Standard quine
s/INSERT_SOURCE_HERE/$_;
$a++;                                 # Count the number of repetitions
END {
    s/./$&x$a/eg;                     # Interweave
    print if $a;                      # Print...
    $a=0;                             # ...but only once
}

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


2

Python 3 , 122 121 112 байт

s='try:from atexit import*;n+=1\nexcept:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])';exec(s);

Спробуйте в Інтернеті: одна копія | два примірники | три примірники | чотири екземпляри, з автоматичною верифікацією

Як це працює

Для цього використовується стандартна Python quine: Зберігайте код, який потрібно виконати у змінній (у вигляді рядка); включити певну логіку в цей рядок, щоб надрукувати себе, все перед ним і все після нього; потім виконати цей рядок.

Код, який виконується через рядок s , наступний.

try:from atexit import*;n+=1
except:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])

Перший рядок беззастережно імпортує модуль atexit , що дозволить нам зареєструвати обробник виходу. Спроба імпортувати один і той же модуль кілька разів не впливає на сценарій. Потім він намагається збільшити змінну n , щоб відстежити, скільки копій вихідного коду виконано.

Другий рядок виконується лише в тому випадку, якщо перший містить помилку. Так буде в першій ітерації, оскільки n ще не визначено. У цьому випадку ми ініціалізуємо n як 1 і реєструємо лямбда, яка виконує фактичну магію.

Зареєстрований обробник виходу

lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s]

буде викликано безпосередньо до завершення програми. Сама лямбда створює рядок "s=%r;exec(s);"%s- %rстворює строкове представлення правого аргументу ( ів ), який включає в себе всі , що між одинарними лапками і самі котируваннями - то перебирає свої символи. Для кожного символу c ми просто надрукуємо n копій c . Перехід c*nяк названий аргумент означає, що жодна стрічка endпередачі printне буде додана.


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