Verkettungsprogramme

26

Herausforderung

In dieser Herausforderung schreiben Sie das erste Programm, p 1 , einer unendlichen Folge von Programmen, in denen das Ausführen von p n das Programm p n + 1 ausgibt / generiert . Bei der Verkettung der ersten n> = 2 Programme sollte die Sequenz ausgegeben werden n.

Beispiel

Nehmen wir an, die ersten 4 Programme sind:

p1 p2 p3 p4

Wenn ich laufen sollte p1, sollte es Folgendes ausgeben:

p2

Wenn ich laufen sollte p1p2, sollte es Folgendes ausgeben:

2

Wenn ich es ausführen p1p2p3p4würde, sollte es Folgendes ausgeben:

4

Wenn ich laufen sollte p4, sollte es das nächste Programm in der Reihenfolge erzeugen:

p5

Wertung

Ihre Punktzahl ist die Byteanzahl der ersten 10Programme.

Downgoat
quelle
Werden die Sequenzen p1p2p3...immer von p1 bis pn sein ?
Elch
@ Elch Ja, es wird immer von p1 bis pn sein.
Downgoat
5
Das ist ein interessantes Problem. Der Programmablauf ist einfach genug; Die Verkettung ist schwieriger.
Conor O'Brien
Ist der Zugriff auf Dateien erlaubt?
Lynn
@ Mauris Ja, aber die Byteanzahl des Inhalts und des Namens der Datei muss in der
Gesamtbyteanzahl

Antworten:

49

Pyth, 12

p1:

l"1

p2: 1

p3: 1

etc..

p1p2p3:

l"111 

Ausgabe: 3

Erläuterung:

l        length
 "1      string "1"

Bei der ersten Ausführung wird die Länge einer einzelnen Zeichenfolge ausgegeben 1. Dies ist zufällig auch ein gültiges Pyth-Programm, das 1erneut ausgegeben wird . Daher ist pn + 1 immer 1. Wenn die Programme verkettet sind, wird p1die Länge der verketteten Programme ausgegeben n.

Elch
quelle
9

Lua, 950 900 Bytes

s=io.open(arg[0]):read()if#s<95 then print(s)do return end end print(#s/90) do return end;

Ungolfed:

s=io.open(arg[0]):read'*a'
if #s < 96 then 
    print(s)
    do return end 
end 
print(#s/90) 
do return end;

Erläuterung:

Die erste Zeile erfasst die gesamte Programmquelle. Dann vergleichen wir die Länge des gesamten Programms mit 1 + der Länge eines einzelnen Programms. Wenn die Größe des aktuellen Programms kleiner als dieser Wert ist, wird die Quelle gedruckt. Dies ist das nächste Programm, p2, und wir beenden das Programm. Jede Iteration ist nur eine Quine. Wenn mehrere davon zusammengesetzt werden, schlägt die Bedingung fehl, und wir drucken die Länge des verketteten Programms geteilt durch die Länge eines Programms, dh die Anzahl der verketteten Programme, n.

Nikolai97
quelle
+1 für die Verwendung einer anderen Methode (als meiner). Dies ist die Art von kreativer Antwort, auf die ich gehofft habe.
Elch
+1 für Lua, und wählen Sie eine kühlere, wenn langwierigere Methode als die anderen Antworten: P
Katze
Haha danke, ich war ziemlich stolz, dass ich es geschafft habe, dies mit einer nicht
golfenden
4

Vitsy , 19 Bytes

Hier geht es nicht um Strings, sondern um Methodentricks.

p1

1ml1-\+N
1

p2

1

p3

1

Und so weiter und so fort.

Erklärung unten:

1ml1-\+N
1m       Execute the first index of lines (the bit with the ones)
  l1-    Get the length minus 1.
     \+  Add them all up.
       N Output as number.

1        Push one to the stack.

Probieren Sie es online!

Addison Crump
quelle
4

Vitsy , 14 Bytes

Ähnlich wie bei den Antworten von Pyth und Jolf ordne ich Strings zu. Der einzige Unterschied besteht darin, dass ich die Zeilenumbruch-Funktionen verwende, um sicherzustellen, dass ich immer die richtige Länge bekomme.

p1

'l3-N

p2

1

Ersetzen Sie 1 durch eine einzelne Zahl.

p3 und so weiter stimmen mit diesem Muster überein, und Sie können dies bis Integer.MAX_VALUEzur ganzzahligen Einschränkung der Sprache tun .

Erläuterung:

'l3-N
'     Wrap around the line until finding another '. Since no ' is found before the
      End of the line, it wraps around.
 l    Get the length of the stack.
  3-  Subtract three.
    N Output as number.

Probieren Sie es online!

Addison Crump
quelle
4

Im Ernst, 15 Bytes

Erstes Programm, 6 Bytes (enthält ein nicht druckbares):

5Ql-.

Hex Dump:

35516c2d2e7f

Dieses Programm wird gedruckt 1: Probieren Sie es online aus

Der Rest der Programme ist allesamt 1ein gültiges Programm, das sich genau wie die Pyth-Antwort ausgibt. Das ursprüngliche Programm druckt die Länge seines Quellcodes minus 5 und wird sofort beendet. 1s, die an das Ende angehängt werden, verlängern den Quellcode jedes Mal um 1 Byte, werden aber nie ausgeführt.

Quintopie
quelle
2

Jolf , 14 Bytes

Probieren Sie es hier aus!

a-lq4
a      print
  lq   the length of the source code
 -  4  minus 4

Bei der Ausführung wird dies gedruckt 1. So ist p2 = 1. p2Erträge ausführen 1. Also, für alle N > 1, pN = 1.

Beachten Sie p1p2: a-1q41. Dies überträgt sich auf:

alert(sub(length("a-lq41"),4));
1;

Da das implizite Drucken nach dem ersten Druck deaktiviert ist, wird dies gedruckt 2, da die Länge des Quellcodes minus 4 2 beträgt. Und weiter und weiter und weiter.

Conor O'Brien
quelle
2

Ruby, 318 Bytes

p 1 :

x=DATA.readlines.size
_="_=%p;puts _%%_"
puts x>0?x+1:_%_
__END__

Jede separate Programm P i gibt diesen einzeiligen quine: _="_=%p;puts _%%_";puts _%_.

Wenn Sie diese Quines am Ende von p 1 anfügen , werden sie als Linien im DATAObjekt angezeigt, da sie sich unterhalb der Magie befinden __END__.

Hier ist ein Test:

$ ruby chain.rb                                    # running p1
_="_=%p;puts _%%_";puts _%_

$ ruby -e '_="_=%p;puts _%%_";puts _%_'            # running p2
_="_=%p;puts _%%_";puts _%_

$ ruby -e '_="_=%p;puts _%%_";puts _%_'            # running p3
_="_=%p;puts _%%_";puts _%_

$ # Concatenating p2 and p3 to p1:
$ ruby -e '_="_=%p;puts _%%_";puts _%_' >> chain.rb
$ ruby -e '_="_=%p;puts _%%_";puts _%_' >> chain.rb

$ ruby chain.rb                                    # running p1p2p3
3

Die zehn ersten verketteten Programme sehen folgendermaßen aus (318 Bytes):

x=DATA.readlines.size
_="_=%p;puts _%%_"
puts x>0?x+1:_%_
__END__
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
_="_=%p;puts _%%_";puts _%_
daniero
quelle
1

C #, 2099 + 7 = 2106 Bytes

Erstes Programm (benutzt Compiler Flag /main:A):

class A{static void Main(){int a=System.Reflection.Assembly.GetEntryAssembly().GetTypes().Length;var b=@"class A{0}{{static void Main(){{var a=@""{1}"";System.Console.Write(a,{0}+1,a.Replace(""\"""",""\""\""""));}}}}";System.Console.Write(a>1?"{2}":b,0,b.Replace("\"","\"\""),a);}}

Zweites Programm:

class A0{static void Main(){var a=@"class A{0}{{static void Main(){{var a=@""{1}"";System.Console.Write(a,{0}+1,a.Replace(""\"""",""\""\""""));}}}}";System.Console.Write(a,0+1,a.Replace("\"","\"\""));}}

Drittes Programm:

class A1{static void Main(){var a=@"class A{0}{{static void Main(){{var a=@""{1}"";System.Console.Write(a,{0}+1,a.Replace(""\"""",""\""\""""));}}}}";System.Console.Write(a,1+1,a.Replace("\"","\"\""));}}

Du hast die Idee.

LegionMammal978
quelle
0

Javascript ES6, Ergebnis 483 455

Programm 1, 77 Bytes:

v=1;setTimeout(_=>alert(v>1?v:'a=_=>this.v?v++:alert("a="+a+";a();");a();'));

Programm 2 und höher mit jeweils 42 Bytes:

a=_=>this.v?v++:alert("a="+a+";a();");a();
SuperJedi224
quelle
0

PHP, 1470 Bytes

Programm 1: 219 Bytes:

class O{public$n=1;function __destruct(){echo($n=$this->n)>1?$n:'if(!$o->n++)echo str_replace(chr(9),$a=aWYoISRvLT5uKyspZWNobyBzdHJfcmVwbGFjZShjaHIoOSksJGE9CSxiYXNlNjRfZGVjb2RlKCRhKSk7,base64_decode($a));';}}$o=new O();

Programm 2 und mehr als 139 Bytes:

if(!$o->n++)echo str_replace(chr(9),$a=aWYoISRvLT5uKyspZWNobyBzdHJfcmVwbGFjZShjaHIoOSksJGE9CSxiYXNlNjRfZGVjb2RlKCRhKSk7,base64_decode($a));

verwenden wie:

php -r "class O{public$n=1;function __destruct(){echo($n=$this->n)>1?$n:'if(!$o->n++)echo str_replace(chr(9),$a=aWYoISRvLT5uKyspZWNobyBzdHJfcmVwbGFjZShjaHIoOSksJGE9CSxiYXNlNjRfZGVjb2RlKCRhKSk7,base64_decode($a));';}}$o=new O();"

Verwendet eine leicht golfene Version der hier beschriebenen PHP-Quine-Technik: http://10types.co.uk/the-lab/a-minimal-php-quine/

user59178
quelle