Цепные программы

26

Вызов

В этом задании вы будете писать первую программу p 1 из бесконечной последовательности программ, в которой запуск p n выводит / генерирует программу p n + 1 . При объединении первых n> = 2 программ последовательность должна быть выведена n.

пример

Допустим, первые 4 программы:

p1 p2 p3 p4

Если я должен был бежать p1, он должен вывести:

p2

Если я должен был бежать p1p2, он должен вывести:

2

Если бы я должен был запустить p1p2p3p4это должно вывести:

4

Если бы я должен был запустить p4, он должен сгенерировать следующую программу в последовательности:

p5

счет

Ваша оценка - это количество байтов первых 10программ.

Downgoat
источник
Будут ли последовательности p1p2p3...всегда от p1 до pn ?
Лось
@ Moose Да, это всегда будет от p1 до pn.
вниз
5
Это интересная проблема. Последовательность программы достаточно проста; цепочка сложнее.
Конор О'Брайен
Доступ к файлам разрешен?
Линн
@Mauris Да, но количество байтов содержимого и имени файла должно учитываться в общем количестве байтов для каждой программы, в которой он используется.
Downgoat

Ответы:

49

Пиф, 12

p1:

l"1

p2: 1

p3: 1

так далее..

p1p2p3:

l"111 

Выход: 3

Объяснение:

l        length
 "1      string "1"

При первом запуске выводится длина строки из одного символа 1. Это также, оказывается, действительная программа Pyth, выводящая 1снова. Следовательно, pn + 1 всегда 1. Когда программы связаны друг с другом, p1выводится длина связанных программ, которая будет равна n.

лось
источник
9

Lua, 950 900 байт

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;

Объяснение:

Первая строка захватывает весь исходный код программы. Затем мы сравниваем длину всей программы с 1 + длиной одной отдельной программы. Если размер текущей программы меньше этого значения, то печатается источник, который является следующей программой, p2, и мы завершаем работу. Каждая итерация - это просто квинна. Когда несколько из них объединяются, условное условие не выполняется, и мы печатаем длину объединенной программы, деленную на длину одной программы, которая является числом объединенных программ, n.

Nikolai97
источник
+1 за использование другого метода (чем мой). Это тип креативного ответа, на который я надеялся.
Лось
+1 за Луа, и выбор кулера, если более длительный метод, чем другие ответы: P
кошка
Хаха спасибо, я был очень горд тем, что мне удалось сделать это с не-гольфом и довольно многословным языком :)
Nikolai97
4

Vitsy , 19 байт

Здесь не рассматриваются строки, а используются приемы метода.

p1

1ml1-\+N
1

p2

1

p3

1

Так далее и так далее.

Объяснение ниже:

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.

Попробуйте онлайн!

Аддисон Крамп
источник
4

Витси , 14 байтов

Как и в ответах Pyth и Jolf, я сопоставляю строки. Единственное отличие состоит в том, что я использую функции переноса строк, чтобы всегда получать правильную длину.

p1

'l3-N

p2

1

Замените 1 на любое число.

p3 и т. д. соответствуют этому шаблону, и вы можете делать это до Integer.MAX_VALUEцелочисленного ограничения языка.

Объяснение:

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

Попробуйте онлайн!

Аддисон Крамп
источник
4

Серьезно, 15 байтов

Первая программа, 6 байт (содержит непечатный):

5Ql-.

Шестнадцатеричный дамп:

35516c2d2e7f

Эта программа печатает 1: попробуйте онлайн

Все остальные программы - 1действительная программа, которая печатает себя так же, как ответ Pyth. Оригинальная программа печатает длину своего исходного кода минус 5 и немедленно завершает работу. 1s, добавленные в конец, увеличивают длину исходного кода на 1 байт каждый раз, но никогда не выполняются.

quintopia
источник
2

Джольф , 14 байт

Попробуй это здесь!

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

Когда выполнено, это печатает 1. Таким образом, p2 = 1. Выполнение p2урожаев 1. Таким образом, для всех N > 1, pN = 1.

Заметим p1p2: a-1q41. Это переносится на:

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

Поскольку неявная печать отключается после первой печати, она печатается 2, так как длина исходного кода минус 4 равна 2. И так далее, и так далее.

Конор О'Брайен
источник
2

Рубин, 318 байт

р 1 :

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

Каждая отдельная программа р я выводит эту одну строку Quine: _="_=%p;puts _%%_";puts _%_.

Когда вы добавляете эти квины в конец p 1 , они заканчиваются как линии в DATAобъекте, потому что они находятся ниже магии __END__.

Вот тест:

$ 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

Конкатенация первых десяти программ выглядит следующим образом (318 байт):

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
источник
1

C #, 2099 + 7 = 2106 байт

Первая программа (использует флаг компилятора /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);}}

Вторая программа:

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

Третья программа:

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

Вы поняли идею.

LegionMammal978
источник
0

Javascript ES6, оценка 483 455

Программа 1, 77 байт:

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

Программа 2 и более, 42 байта каждая:

a=_=>this.v?v++:alert("a="+a+";a();");a();
SuperJedi224
источник
0

PHP, 1470 байт

Программа 1: 219 байт:

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

программа 2 и более 139 байт:

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

использовать как:

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

Использует слегка заигранную версию техники php quine, описанную здесь: http://10types.co.uk/the-lab/a-minimal-php-quine/

user59178
источник