Wie oft müssen Sie eine Quine golfen?


12

Für diese Herausforderung müssen Sie ein Programm erstellen, das eine Ganzzahl annimmt xund seine Quelle xmehrmals ausgibt .

Regeln

  • Dies ist Codegolf. Das Ziel ist es, Ihr Programm so zu golfen, dass es die geringste Anzahl von Bytes enthält

  • Wenn Sie eine Funktion übergeben, muss die Funktion xals Parameter dienen und den gesamten Code xmehrmals an STDOUT zurückgeben oder ausdrucken . Der Funktionskörper darf auch nicht leer sein

  • Wenn Sie ein Lambda einreichen, ist es nicht erforderlich, dass Sie es einer Variablen zuweisen

  • Es gelten die üblichen Lückenbeschränkungen.

  • Leere Programme sind verboten

  • Ihr Programm muss nur funktionieren, wenn xeine ganze Zahl größer oder gleich 0 ist

  • Ihr Programm liest möglicherweise auch keinen Teil seines Quellcodes direkt


Schöne erste Frage
Bald Bantha

Kann es xsein 0oder können wir es auf positive ganze Zahlen beschränken?
mbomb007

Ist das Lesen der Quelle unserer Funktion erlaubt?
Shaggy

@ mbomb007, Ich habe eine Änderung vorgenommen, um die Regeln zu klären, xmöglicherweise eine ganze Zahl größer oder gleich 0
Dignissimus - Spammy

@Shaggy, ich dachte, das wäre eine Standardlücke, es scheint, als wäre es keine. Ich habe bearbeitet auf die Frage klar Zustand gemacht , dass ein Programm nicht Teil des Teils des Quellcodes lesen kann
Dignissimus - Spammy

Antworten:


8

Python 2 , 50 Bytes

Beachten Sie das nachstehende Komma und die Zeilenumbrüche.

s='s=%r;print s%%s*input(),\n';print s%s*input(),

Probieren Sie es online!


@ mbomb007 Angenommen, am Ende des Codes befindet sich eine neue Zeile. Problem gelöst.
MD XF

Das OP sagte, dass x Null sein kann. In diesem Fall sollte nichts gedruckt werden, daher ist diese Antwort falsch.
mbomb007

@NickA Nein, es wird eine falsche Zeile ausgegeben.
mbomb007

0 scheint mir keine neue Zeile zu drucken, wie durch Verwenden von sys.stdout.write("2")danach getestet .
Ørjan Johansen

5

Japt , 14 Bytes

"iQ ²pU"iQ ²pU

Probieren Sie es online!

Erläuterung

"iQ ²pU"iQ ²pU
"iQ ²pU"       # Take this string
        iQ     # Prepend a quote
           ²   # Double the string (= source code)
            pU # Duplicate input times

4

RProgN 2 , 8 Bytes

{`{.*¶}{

Das RProgN2 Loop Quine eignet sich besonders gut dafür!

{     } # A function literal
       {# Without a matching }, this loops back to the second instruction, which essentially runs the function. This is a bug, but it works to make the "Looping Quine".
 `{.    # Append the literal {, stringifying the function.
    *   # Multiply the stringified function by the input.
     ¶  # Terminate the program.

Probieren Sie es online!


4

Mathematica, 40 33 Bytes

Danke an lanlock4 für das Speichern von 7 Bytes!

StringRepeat[ToString[#0], #1] & 

Reine Funktion, die ein nichtnegatives ganzzahliges Argument verwendet. ToString[#0]ist die Standardmethode von Mathematica, um auf die Definition der aktuellen reinen Funktion zuzugreifen. StringRepeat[..., #1]Verkettet (Eingabe) Kopien dieser Zeichenfolge miteinander. Beispielsweise,

StringRepeat[ToString[#0], #1] & [2]

ergibt:

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 

Könnten Sie ein Verwendungsbeispiel posten? Rennen, zum Beispiel , StringJoin @@ Table[ToString[#0], #1] & [2]gibt mir einen Fehler.
Julian Wolf

"Ja wirklich?" Dieser genaue Anruf funktioniert für mich. Ich benutze Mathematica 11 ....
Greg Martin

Hmm, ich verwende immer noch 10 (v10.0.1.0) - das könnte es sein. Als Referenz ist hier der Fehler, den ich erhalte:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Aha - Ich stelle fest, dass Table[x,5]das {x,x,x,x,x}in Mathematica 10.2 und darüber hinaus zurückkehren wird, aber in Mathematica 10.1 gibt es einen solchen Fehler (den es erwartet Table[x,{5}]).
Greg Martin

Ich glaube , Sie können ersetzen StringJoin @@ Tablemit StringRepeat.
Kein Baum



3

Python 2, 70 Bytes

Diese Lösung funktioniert, wenn x=0. Es gibt eine einzelne nachgestellte Zeile.

s='s=%r;exec"print%%r;"%%(s%%s)*input()';exec"print%r;"%(s%s)*input()

Probieren Sie es online aus


Python 2, 60 Bytes (ungültig)

Dies setzt voraus, dass x>=1aber das OP klarstellt, xdass Null sein kann. Es gibt eine einzelne nachgestellte Zeile.

s='s=%r;print(s%%s*input())[:-1]\n';print(s%s*input())[:-1]

Probieren Sie es online aus


2

Unterlast , 12 Bytes

(a(:^)*~^):^

Probieren Sie es online!

Funktionsübergabe, da Unterlast keine andere Möglichkeit hat, Eingaben vorzunehmen. (Der TIO-Link zeigt die Nummer 4 als Eingabe an und fügt Code zum Drucken der resultierenden Ausgabe hinzu.)

Dies ist nur ein universeller Quine-Konstruktor (a(:^)*):^, plus ~^("mache eine Anzahl von Kopien gleich dem Argument").



1

Gelee , 10 Bytes

“;⁾vṾẋɠ”vṾ

Probieren Sie es online!

Wie es funktioniert

“;⁾vṾẋɠ”vṾ  Main link. No arguments.

“;⁾vṾẋɠ”    Set the argument and the return value to the string ';⁾vṾẋɠ'.
         Ṿ  Uneval; yield '“;⁾vṾẋɠ”'.
        v   Eval ';⁾vṾẋɠ' with argument '“;⁾vṾẋɠ”'.
  ⁾vṾ           Yield 'vṾ'.
 ;              Concatenate '“;⁾vṾẋɠ”' and 'vṾ', yielding the source code.
      ɠ         Read an integer from STDIN.
     ẋ          Repeat the source code that many times.

4
Das sieht köstlich aus, aber meine Mutter sagte mir immer, ich solle keine seltsam aussehenden Dinge in meinen Mund stecken.
Mateen Ulhaq

1

GNU Make , 49 Bytes

$(foreach ,$(shell seq $1),$(strip $(value $0))) 

Make fügt die Kopien durch ein einzelnes Leerzeichen zusammen, sodass ich das zusätzliche Leerzeichen am Ende einfügen und mit einem stripdazwischenliegenden entfernen muss, um die Anforderung genau zu befolgen.


Das sieht so aus, als würde es den Quellcode lesen, der sowohl standardmäßig als auch explizit verboten ist.
Ørjan Johansen

@ ØrjanJohansen Nein, die Quelle wird nicht gelesen, es wird ein variabler Wert gelesen. Es ist genau das gleiche Prinzip wie in anderen Antworten, zum Beispiel JS oder Python.
Eush77

@ ØrjanJohansen Oh, ich verstehe. $0In Make-Funktionen ist nicht dasselbe wie in Shells. Dies ist der Name der Variablen, als die die Funktion aufgerufen wird. Siehe gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77

Seufz so eine Grauzone. Übrigens, die Python machen das nicht .
Ørjan Johansen

@ ØrjanJohansen Ich würde sagen, dass diese Antwort viel näher an Pythons liegt als an der von JS. Alles, callwas Sie tun, ist zu ersetzen $0und $1mit aktuellen Parametern zu versehen - es ist eine einfache String-Interpolation, genau wie bei Python %.
eush77


1

Betaload , 203 Bytes

Zeilenumbrüche zur Verdeutlichung hinzugefügt:

(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^

Ich gab mir die Einschränkung, dass es von STDIN lesen muss, anstatt von der Spitze des Stapels, wie es eine Unterlast-Antwort normalerweise tun würde. Ich habe auch die richtige Dezimaleingabe verwendet, die den größten Teil des Codes ausmacht.

Erläuterung:

Ich packe das Programm in einen Quine-Wrapper: (a(:^)*und):^ . Dies bedeutet, dass der Quellcode des Programms für den gesamten Code im Quine-Wrapper ganz unten im Stapel angezeigt wird.

Um Ziffern in eine normale Kirchenzahl umzuwandeln, ersetze ich jede Ziffer durch den Code, multipliziere mit 10 und addiere diese Ziffer:

0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*

Es gibt hier eine Menge Wiederholungen, also packen wir es in ein Unterprogramm, das eine Church-Ziffer von der Oberseite des Stapels nimmt und sie verwendet, um die "Ziffernfolge" zu konstruieren:

:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*

Ich habe dies in eine neue Umgebung gestellt, damit schnell darauf zugegriffen werden kann:

#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>

Jetzt kann ich den Ersatzcode für erstellen R. RVerwendet die obersten Elemente des Stapels, um eine Nachschlagetabelle zu erstellen, in der eine Zeichenfolge aus STDIN durch Betaload-Code ersetzt wird. Das funktioniert so:

()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R

Wir können jedoch das soeben erstellte Unterprogramm verwenden, um die Codesegmente zu generieren:

(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...

Beim RAusführen wird die Eingabe in eine Reihe von Unterprogrammen umgewandelt, die eine Kirchenzahl bilden. Wenn dieses Unterprogramm ausgeführt wird, erstellt es diese Church-Ziffer für das nächste Element auf dem Stapel (0, das zuvor abgelegt wurde). Dies bedeutet, dass R^der oberste Wert auf dem Stapel die Church-Ziffer ist. Wir dann^ wenden die Church-Nummer noch einmal auf das letzte Element im Stapel (den Quellcode des Programms) an, um die Antwort zu erhalten.

Lustige Tatsache: Ich habe den MD für diese Einreichung seit mehreren Monaten. Ich hatte es behalten, nachdem ich eine Frage missverstanden hatte (die ich anscheinend nicht mehr finde). Ich musste es aus meinem Papierkorb ausgraben, um es hier zu posten.



1

Python 2 , 41 Bytes

_="input('_=%r;exec _'%_*input())";exec _

Probieren Sie es online!

Verwendet eine irgendwie hackige Ausgabe inputstatt print, da printes einen seltsamen Fehler gibt, bei dem eine neue Zeile gedruckt wird, wenn dies nicht der Fall sein soll ... . Wird mit einem EOF-Fehler beendet.

Erläuterung:

_="input('_=%r;exec _'%_*input())"; # Set _ to a string
exec _                              # Execute that string
input(                        )     # "print"
      '_=%r;exec _'%_               # The source code with _ formatted in
                     *input()       # Actual input many times


0

Pyth, 13 Bytes

*jN*2]"*jN*2]

Testsuite

Das Standard-Pyth-Quine plus zwei *für die Wiederholung.


0

Perl, 48 Bytes

print"$_\47"x(2*pop)for'print"$_\47"x(2*pop)for'

\47ist das oktale Escape für ein einfaches Anführungszeichen ( '). Es wird in doppelten Anführungszeichen ( "), aber nicht in einfachen Anführungszeichen interpretiert .


0

Javascript ES6, 27 37 Bytes

_=>alert(`${f.name}=${f}`.repeat(_))

Bearbeiten

+10 Bytes f=sollten ebenfalls angezeigt werden


f=

_=>alert(`${f.name}=${f}`.repeat(_))

f(2);


@ Downvoter warum?
Weedoze

@Kaiido Ich weiß nicht .. Soll ich das behalten f=?
Weedoze

Ihr Code liest sich selbst, indem er implizit toStringdie Funktion aufruft .
Aebabis

@acbabis Calling f.toString()or fist dasselbe, zeigt aber nicht den Funktionsnamen an
Weedoze

Ich glaube, @acbabis hat gemeint, dass es den letzten Punkt der Herausforderung verletzt "Ihr Programm liest möglicherweise auch keinen Teil seines Quellcodes direkt" - auf fdiese Weise wird auf seine eigene Quelle verwiesen .
Skyline3000

0

CJam , 20 12 Bytes

8 Bytes gespart dank Martin Ender

{"_~"+ri*}_~

Probieren Sie es online!

Exaplanation

{       e# Begin a block literal:
 "_~"+  e#  Add whatever's on the stack to the beginning of the array ['_', '~'].
 ri*    e#  Repeat the resulting array a number of times equal to the input.
}       e# Close the block. Push it on the stack.
_~      e# Copy it and run it.

0

PHP, 194 Bytes

<?php $a="PD9waHAgJGE9IiMiOyRpPSRhcmd2WzFdO3doaWxlKCRpLS0pZWNobyBzdHJfcmVwbGFjZShjaHIoMzUpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=";$i=$argv[1];while($i--)echo str_replace(chr(35),$a,base64_decode($a));

Probieren Sie es online!

Überhaupt nicht golfen, wie es B64-Quines sind.


0

Los , 257 254 Bytes

Das tut mir weh.

package main;import(."fmt";."strings";."strconv";."os");func main(){s:="package main;import(.\"fmt\";.\"strings\";.\"strconv\";.\"os\");func main(){s:=%q;n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}";n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}

Probieren Sie es online!


0

Mikroskript II, 22 Bytes:

"v{lqp}sN*h"v{lqp}sN*h

Microscript II, 20 Bytes (aber technisch ungültig, da es auf den Quellcode eines Codeblocks zugreift):

{s""+`"~sN*"s`+}~sN*

0

C 144 116 Bytes

i;main(a){for(i=getchar()-48;i--;)printf(a="i;main(a){for(i=getchar()-48;i--;)printf(a=%c%s%c,34,a,34);}",34,a,34);}

0

Python 3, 69 Bytes

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)


0

05AB1E , 17 Bytes

0"D34çý×?"D34çý×?

Änderung der Standard- 0"D34çý"D34çý durch Hinzufügen ×?.

Probieren Sie es online aus.

Erläuterung:

0                   # Push 0 to the stack
                    #  STACK: [0]
 "D34çý×?"          # Push the string 'D34çý×?' to the stack
                    #  STACK: [0, 'D34çý×?']
          D         # Duplicate this string
                    #  STACK: [0, 'D34çý×?', 'D34çý×?']
           34ç      # Push '"' to the stack
                    #  STACK: [0, 'D34çý×?', 'D34çý×?', '"']
              ý     # Join the stack by this '"' delimiter
                    #  STACK: ['0"D34çý×?"D34çý×?']
               ×    # Repeat the string the (implicit) input amount of times
                    #  input = 2 → STACK: ['0"D34çý×?"D34çý×?0"D34çý×?"D34çý×?']
                ?   # Output to STDOUT without trailing newline
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.