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.