Łączenie programów

26

Wyzwanie

W tym wyzwaniu napiszesz pierwszy program, p 1 , o nieskończonej sekwencji programów, w którym uruchomienie p n wyprowadza / generuje program p n + 1 . Podczas łączenia pierwszych n> = 2 programów sekwencja powinna zostać wyprowadzona n.

Przykład

Powiedzmy, że pierwsze 4 programy to:

p1 p2 p3 p4

Gdybym miał uruchomić p1, powinien wypisać:

p2

Gdybym miał uruchomić p1p2, powinien wypisać:

2

Gdybym miał uruchomić p1p2p3p4, powinien wypisać:

4

Gdybym miał uruchomić p4, powinien wygenerować następny program w sekwencji:

p5

Punktacja

Twój wynik to liczba bajtów pierwszych 10programów.

Downgoat
źródło
Czy sekwencje p1p2p3...zawsze będą od p1 do pn ?
Łoś
@Moose Tak, zawsze będzie od p1 do pn.
Downgoat
5
To interesujący problem. Sekwencja programu jest dość łatwa; łańcuch jest trudniejszy.
Conor O'Brien,
Czy dostęp do plików jest dozwolony?
Lynn
@ Mauris Tak, ale liczba bajtów treści i nazwy pliku musi być liczona w całkowitej liczbie bajtów dla każdego programu, w którym jest używany.
Zniżka

Odpowiedzi:

49

Pyth, 12

p1:

l"1

p2: 1

p3: 1

itp..

p1p2p3:

l"111 

Wydajność: 3

Wyjaśnienie:

l        length
 "1      string "1"

Na pierwszym biegu, to wyprowadza długość pojedynczego ciągu znaków, 1. Zdarza się również, że jest to poprawny program Pyth, generujący 1ponownie. Dlatego pn + 1 jest zawsze 1. Gdy programy są powiązane, p1wyświetla długość połączonych programów, która będzie n.

Łoś
źródło
9

Lua, 950 900 bajtów

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

Nie golfowany:

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

Wyjaśnienie:

Pierwszy wiersz pobiera całe źródło programu. Następnie porównujemy długość całego programu do 1 + długości jednego pojedynczego programu. Jeśli rozmiar bieżącego programu jest mniejszy niż ta wartość, drukowane jest źródło, czyli następny program, p2, i wychodzimy. Każda iteracja jest tylko quine. Po połączeniu kilku z nich warunek kończy się niepowodzeniem i wypisujemy długość konkatenowanego programu podzieloną przez długość jednego programu, czyli liczbę konkatenowanych programów, n.

Nikolai97
źródło
+1 za użycie innej metody (niż moja). To jest rodzaj kreatywnej odpowiedzi, na którą liczyłem.
Łoś
+1 dla Luy i wybór fajniejszej, jeśli dłuższej metody niż inne odpowiedzi: P
kot
Haha dziękuję, byłem dość dumny, że udało mi się to zrobić w języku nie golfowym i dość gadatliwym :)
Nikolai97
4

Vitsy , 19 bajtów

Nie zajmuje się tutaj łańcuchami, ale używa sztuczek metod.

p1

1ml1-\+N
1

p2

1

p3

1

Tak dalej.

Objaśnienie poniżej:

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.

Wypróbuj online!

Addison Crump
źródło
4

Vitsy , 14 bajtów

Podobnie do odpowiedzi Pyth i Jolf, mapuję ciągi. Jedyną różnicą jest to, że korzystam z funkcji owijania linii, aby mieć pewność, że zawsze otrzymam odpowiednią długość.

p1

'l3-N

p2

1

Zamień 1 na dowolny pojedynczy numer.

p3 i tak dalej pasują do tego wzorca i możesz to zrobić, aż Integer.MAX_VALUEdo całkowitego ograniczenia języka.

Wyjaśnienie:

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

Wypróbuj online!

Addison Crump
źródło
4

Poważnie, 15 bajtów

Pierwszy program, 6 bajtów (zawiera niedrukowalne):

5Ql-.

Hex Dump:

35516c2d2e7f

Ten program drukuje 1: Wypróbuj online

Wszystkie pozostałe programy to 1poprawny program, który drukuje się tak samo jak odpowiedź Pyth. Oryginalny program wypisuje długość kodu źródłowego minus 5 i natychmiast się kończy. 1s dołączane na końcu zwiększają długość kodu źródłowego o 1 bajt za każdym razem, ale nigdy nie są wykonywane.

kwintopia
źródło
2

Jolf , 14 bajtów

Wypróbuj tutaj!

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

Po uruchomieniu drukuje się 1. Tak więc p2 = 1. Wykonywanie p2plonów 1. Więc dla wszystkich N > 1, pN = 1.

Przestrzegać p1p2: a-1q41. Przenosi to na:

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

Ponieważ niejawne drukowanie jest wyłączone po pierwszym wydruku, drukuje się 2, ponieważ długość kodu źródłowego minus 4 wynosi 2. I tak dalej i dalej.

Conor O'Brien
źródło
2

Rubinowy, 318 bajtów

p 1 :

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

Każdy program oddzielny p i wyprowadza jedną linię Quine'a: _="_=%p;puts _%%_";puts _%_.

Kiedy dodasz te quiny na końcu p 1 , kończą się one liniami w DATAobiekcie, ponieważ znajdują się poniżej magii __END__.

Oto 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

Dziesięć pierwszych połączonych programów wygląda następująco (318 bajtów):

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
źródło
1

C #, 2099 + 7 = 2106 bajtów

Pierwszy program (używa flagi kompilatora /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);}}

Drugi program:

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("\"","\"\""));}}

Trzeci program:

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("\"","\"\""));}}

Masz pomysł.

LegionMammal978
źródło
0

JavaScript ES6, wynik 483 455

Program 1, 77 bajtów:

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

Program 2 i kolejne, każdy 42 bajty:

a=_=>this.v?v++:alert("a="+a+";a();");a();
SuperJedi224
źródło
0

PHP, 1470 bajtów

Program 1: 219 bajtów:

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

progam 2 i ponad 139 bajtów:

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

użyj jak:

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();"

Używa nieco golfowej wersji techniki php quine opisanej tutaj: http://10types.co.uk/the-lab/a-minimal-php-quine/

użytkownik59178
źródło