1-up swojej średniej quine


34

1-up Quine to program, który jest bardzo podobny do Quine'a. Jedną z głównych różnic jest to, że zamiast drukować się raz, kiedy n kopii programu jest konkatenowanych, wynik drukuje oryginalny program n + 1 razy.

Przykład

Jeśli twój program to Abc123:

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

Wyzwanie

Twoim wyzwaniem jest stworzenie najkrótszej ważnej 1-up quine w dowolnym języku. Obowiązują zwykłe zasady dotyczące quine, więc nie możesz:

  • Prześlij pusty program.
  • Przeczytać bezpośrednio lub pośrednio 1 kod źródłowy.
  • Użyj wbudowanych quiningu.

To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.

1 Nie obejmuje to użycia zakodowanego ciągu lub bloku kodu jako części programu.


2
Czy to w porządku, jeśli njest ograniczone przez pewne ograniczenia typu danych (maksymalny rozmiar liczby całkowitej itp.)?
— Luis Mendo,

2
@LuisMendo Myślę, że to w porządku, o ile możesz obsłużyć rozsądną liczbę powtórzeń (być może 100).
— ETHprodukcje

Czy odczytywanie długości kodu źródłowego przy użyciu wbudowanej metody quining jest w porządku?
— Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ To wydaje się trochę zbyt podobne do pobierania samego kodu źródłowego, ponieważ wciąż otrzymujesz informacje o kodzie źródłowym. Więc nie.
— ETHprodukcje

Odpowiedzi:


13

GolfScript, 12 bajtów

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

Wypróbuj online!

Wyjaśnienie

Łączy to pomysły ze standardowego quinu GolfScript:

{'.~'}.~

I mój niedawno odkryty quine :

":n`":n`

Główną ideą jest ponowne użycie, nktóre jest drukowane niejawnie na końcu programu, aby uzyskać dodatkową kopię quine. Ponieważ przypisanie zmiennej nic nie zmienia, gdy zostanie powtórzone w kolejnych kopiach, spowoduje to dodanie tylko jednej kopii. Oto podział kodu:

{        # 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 bajtów

{: ".~"][}.~

Wypróbuj online!

Jak działa kod źródłowy

{: ".~"][}.~

{        }    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.

Jeśli powyższy kod źródłowy zostanie wykonany raz, stos zakończy się jako

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

gdzie pusty ciąg na początku odpowiada początkowemu stanowi stosu (puste wejście).

Dwie kopie kodu źródłowego pozostawiałyby końcowy stan

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

trzy kopie ostatecznego stanu

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

i tak dalej.

Co się potem dzieje

Po wykonaniu kodu źródłowego interpreter wykonuje następujące czynności.

  1. Zawija cały stos w tablicę i wypycha tę tablicę na stos.

    Dla dwóch kopii kodu źródłowego stos zawiera teraz

    ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [["" {: ".~"][} ".~"] [{: ".~"][} ".~"]]
    
  2. Wykonano go putsz zamiarem wydrukowania owiniętego stosu, a następnie podania linii.

    putsjest zdefiniowany jako {print n print}, więc wykonuje następujące czynności.

    1. printdrukuje zawiniętą kopię stosu bez sprawdzania go (tzn. bez konwertowania go do reprezentacji ciągu). To wysyła

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

      (kod źródłowy) do STDOUT i wyrzuca kopię stosu z góry stosu.

      Stos zawiera teraz

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"]
      
    2. wykonuje zdefiniowany wcześniej blok kodu.

      :zaczyna się od zapisania [{: ".~"][} ".~"]znaku spacji, a następnie ".~"przesuwa się, ]otacza ".~"tablicę i [ustawia nowy znacznik tablicy.

    3. n wypycha ciąg składający się z pojedynczego kanału.

      Stos zawiera teraz

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n"
      
    4. jest wykonywany ponownie. Zostało jednak na nowo zdefiniowane, gdy wywołaliśmy go po raz pierwszy i teraz zawiera tablicę, a nie blok kodu.

      W rzeczywistości pcha [{: ".~"][} ".~"], pozostawiając stos jako

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n" [{: ".~"][} ".~"]
      
    5. Na koniec printdrukuje najwyższy element stosu bez sprawdzania go, wysyłając

      {: ".~"][}.~
      

      do STDOUT, 1-up up kodu źródłowego.


11

JavaScript ES6 (REPL), 55 bajtów

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

Zaoszczędzono 2 bajty dzięki @ user81655!

Wyjaśnienie

Oto standardowe ramy quine:

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

Powinieneś być w stanie zobaczyć te ramy w zgłoszeniu. Więcej wyjaśnień poniżej.


var a=-~a;

Jest to licznik, domyślnie ustawiony na 1. Zasadniczo mówi nam, ile powtarzać quine i przyrostów w tym samym czasie.

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

To jest część quine. Zasadniczo powtarzamy ciąg znaków quine przez licznik + 1. Kolejne wywołania funkcji zastąpią dane wyjściowe.


To może być tylko ja, ale wydaje się, że nic nie drukuje. (testowane przy użyciu JSFiddle, jeśli to ma znaczenie?)
— jrich

Ach, powinieneś użyć konsoli Firefox. (I przeładuj po każdym uruchomieniu, aby zresetować a).
— Mama Fun Roll

Nie sądzę, że potrzebujeszvar
— Cyoce,

Nie, robię to, ponieważ a jest początkowo niezdefiniowane. Korzystanie z var pozwala nam z nim pracować.
— Mama Fun Roll

7

CJam, 14 bajtów

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

Wypróbuj online!

Jak to działa

{"_~"]-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.

Po wykonaniu ostatniej kopii programu tablica zawierająca blok i ciąg znaków nadal znajduje się na stosie, więc jest drukowana niejawnie.


4

Groovy, 83 bajty

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

Jest jeden osadzony i nie ma końca nowej linii. To drukuje:

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()//

Funkcja f()drukuje jedną kopię quine. Początkowy program wywołuje go dwukrotnie. Pierwszy wiersz dołączonego kodu staje się komentarzem i wykonywane jest tylko drugie wywołanie do f().


4

Rubinowy, 43 bajty

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

Sama drukuje się sama 2-0lub 2razy. Po skonkatenowaniu z inną kopią samego siebie wygląda następująca instrukcja print $><<s%s*n=2-01, co oznacza, że ​​wysyła się tylko raz (01 ósemkowa 1). Tak więc tylko ostatnia kopia łańcucha jest drukowana dwa razy, a pozostałe drukowane jeden raz.

Inline przypisanie do njest po prostu, aby kolejność operacji działała poprawnie; stan nie jest przekazywany z jednej kopii do następnej.


4

NodeJS, 63 61 60 55 bajtów

zadziała to również w JavaScript (ES6), jeśli weźmiesz pod uwagę, że wiele komunikatów konsoli jest oddzielonych znakami nowej linii (nie wymaga REPL)

Zaoszczędzono 2 bajty dzięki @ dev-null

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

zwróć uwagę, że na końcu kodu znajduje się nowa linia.


To był interesujący, zdecydowanie jak dotąd jeden z moich ulubionych na tej stronie.

Jestem całkiem pewny, że nie da się więcej grać w golfa. (może printfunkcja SpiderMonkey ...)

Wyjaśnienie

//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.

Uwielbiam to, jak to wygląda, że ​​najpierw zakłada okulary przeciwsłoneczne. (f=_=Mogę być trochę zbyt zmęczony.
— Ben Leggiero

2

Rubinowy, 55 bajtów

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

Nic bardzo interesującego tutaj, jest to po prostu zwykły rubinowy quine z ladą.


2

JavaScript (ES6), 164 bajty

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))

Działa na dowolnej stronie testowej JS lub konsoli w Firefoksie, przy założeniu, że spacja między dwoma komunikatami konsoli liczy się jako nowa linia.


Wiele rekwizytów do robienia tego w języku ogólnego przeznaczenia!
— Ben Leggiero

skrócić windowdo this.
— Mama Fun Roll



1

Y

Niekonkurencyjne, 6 bajtów

UCn*px

Y to działka na głowę, którą miałem od dłuższego czasu, i to zainspirowało mnie do napisania tego. Przeznaczony jest do wyzwań, w których sekwencjonowanie ma kluczowe znaczenie, takich jak to. Kod jest podzielony na linki za pomocą znaków „węzła”. W tym przypadku nasz kod jest umieszczony w dwóch łańcuchach (pierwotnie), przy czym węzeł jest C.

U  C  n* px
1  N    2

Urejestruje łańcuch transcendentalny, tzn. taki, który obejmuje linki. Nagrywa, dopóki nie spotka innego U. Jeśli a Unie zostanie spełnione na końcu ciągu, zostanie ono zawinięte. Jest również Udomyślnie zawarty w ciągu. Po zarejestrowaniu ciągu przechodzimy do węzła C, który po prostu przenosi nas do następnego łącza.

nprzesuwa liczbę łańcuchów. W naszym przypadku podstawowym to 2. Dla sekwencji Kłańcuchów istnieją K+2łańcuchy, podobnie jak Kwęzły. *to przekazywanie ciągu.pwypisuje cały stos (w tym przypadku jeden ciąg) i xkończy działanie programu.

W tekście:

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

Wypróbuj tutaj!


Więc jakie byłoby praktyczne zastosowanie Uoprócz quiningu? (Gratulacje za 7k, btw)
— ETHprodukcje

@ETHproductions U można wykorzystać do przechwytywania ciągu obejmującego łącza, a także do przechwytywania i wydawania demontażu łączy do programu. I dzięki! : D
— Conor O'Brien

1

Brachylog , 20 bajtów

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

Wypróbuj online!

Zmodyfikowany z tego quine.

⊥                       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.

Kiedy jest to konkatenowane ze sobą, każda trasa oprócz ostatniej kończy się niepowodzeniem, a program przechodzi do następnej, wykonując każdą w₃i cofając się za każdym w₅z wyjątkiem ostatniej.

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

Wypróbuj online!

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

Wypróbuj online!

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

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.