Задний план
Да, физика цепочек - это реальная вещь . Идея состоит в том, чтобы построить новую теорию физики, используя только цепочки битов, которые развиваются по вероятностному правилу ... или что-то в этом роде. Несмотря на чтение нескольких статей об этом, я все еще в замешательстве. Тем не менее, вселенная битрейн делает для милого маленького кода гольф.
Программа Вселенная
Физика цепочек происходит в так называемой программной вселенной . На каждом этапе эволюции вселенной существует конечный список L
цепочек битов некоторой длины k
, начиная с двухэлементного списка [10,11]
где k = 2
. Один временной шаг обрабатывается следующим образом (в Python-подобном псевдокоде).
A := random element of L
B := random element of L
if A == B:
for each C in L:
append a random bit to C
else:
append the bitwise XOR of A and B to L
Все случайные выборы равномерно случайны и не зависят друг от друга.
пример
Пример эволюции из 4 шагов может выглядеть следующим образом. Начнем с начального списка L
:
10
11
Мы выбираем случайным образом A := 10
и B := 10
, которые являются одной и той же строкой, что означает, что нам нужно расширить каждую строку L
случайным битом:
101
110
Далее мы выбираем A := 101
и B := 110
, и поскольку они не равны, мы добавляем их XOR к L
:
101
110
011
Затем мы выбираем A := 011
и B := 110
, и снова добавляем их XOR:
101
110
011
101
Наконец, мы выбираем A := 101
(последний ряд) и B := 101
(первый ряд), которые равны, поэтому мы расширяем со случайными битами:
1010
1100
0111
1010
Задание
Ваша задача - принять неотрицательное целое число в t
качестве входных данных, смоделировать программный юниверс для t
временных шагов и вернуть или распечатать полученный список L
. Обратите внимание, что t = 0
результаты в начальном списке [10,11]
. Вы можете вывести L
как список списков целых чисел, список списков логических значений или список строк; если вывод идет в STDOUT, вы можете также распечатать битовые строки по одной на строку в некотором приемлемом формате. Порядок цепочек битов значителен; в частности, первоначальный список не может быть [11,10]
, [01,11]
или что-то в этом роде. Приемлемы как функции, так и полные программы, стандартные лазейки запрещены, и побеждает меньшее количество байтов.
Ответы:
Pyth,
2726 байтовПопробуйте онлайн: демонстрация
Объяснение:
источник
xVFK
эквивалентноxMK
.xVFK
эквивалентно томуxMCK
же количеству байтов.CJam,
42403837 байт1 байт сохранен Sp3000.
объяснение
Создайте начальное состояние как число base-2:
А затем выполните основной цикл и напечатайте результат в конце:
Проверьте это здесь.
источник
Юлия,
141129 байтНичего умного. Создает безымянную функцию, которая принимает целое число в качестве входных данных и возвращает массив массивов. Чтобы назвать его, дайте ему имя, например
f=t->...
.Ungolfed + объяснение:
Примеры:
Сохранено 12 байтов благодаря ML!
источник
A=something;B=something else to A,B=something,something else
:t->(L=Any[[1,0],[1,1]];for i=1:t r=1:length(L);A,B=L[rand(r)],L[rand(r)];A==B?(for j=r L[j]=[L[j],rand(0:1)]end):(push!(L,A$B))end;L)
A
иB
отдельно - фактически такая же длина, как и назначение их вместе, поэтому я оставил эту часть как есть. Еще раз спасибо за ваше предложение!Python 2, 141
Я попробовал несколько разных методов, но лучшее, что я мог получить, было относительно простым. Спасибо @ Sp3000 за 15 символов или около того (и за то, что научили меня существованию
int.__xor__
).источник
Python 2,
127122Предполагая, что строки битов Python формы
'0b1'
и т. Д. В порядке:Единственным легким нюансом здесь является использование того факта, что XOR (A, B) = 0 тогда и только тогда, когда A = B.
Спасибо @ Sp300 за укорочение
for
замкнутого контураисточник
Пиф, 34
Использует сокращение, чтобы применить каждую итерацию. Я объясню, когда я закончу играть в гольф.
Попробуй здесь
источник
K
465346 байтХорошая часть этого размера (около 7 байт) связана с тем, что K не имеет
xor
оператора, поэтому мне пришлось реализовать его самому. Первоначально я использовал список строк, а затем понял, что это безумно глупо. Так что теперь я снова отрезал 7 байтов!До:
@JohnE указал в комментариях, что начальное состояние должно быть жестко закодировано, что стоит 7 дополнительных байтов. : /
источник
(1 0;1 1)
- ваша программа принимает это как ввод.JavaScript ( ES6 ) 152
Функция, использующая строки (с числами она должна быть короче, но в битовых операциях javascript ограничены 32-битными целыми числами).
Проверьте в Firefox, используя фрагмент ниже.
источник
К,
454138 байтСтруктура моего ответа очень похожа на структуру @ kirbyfan64sos, но вместо строк я использовал 1/0 векторов, и я избегаю необходимости в условном (
:[ ; ; ]
), вместо этого индексируя в списке.Несколько прогонов:
Редактировать:
Сохранены четыре байта с более компактным способом построения начальной вселенной:
Edit2:
Я забыл, что «выбрать» может принять список в качестве правильного аргумента:
Так что я могу упростить часть этого. Отдайте должное, Кирби получил этот трюк раньше, чем я.
источник
Javascript,
241233 байтаЭто довольно долго.
источник
for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{for(h=0,g=[];h<d.length;)g.push(d[h]^e[h++]);a.push(g)}}alert(a.join("\n"))
производит желаемый результат в 3/5 времени.for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{g=[];for(h=0;h<d.length;h++)g.push(d[h]^e[h]);a.push(g)}}alert(a.join("\n"))
работает 90% времени.T-SQL (2012+), 1019
Мне очень жаль, что это далеко не конкурентоспособно, но, честно говоря, я не думал, что смогу заставить это работать, и мне пришлось опубликовать его, как только я это сделал. Я попытался немного поиграть в гольф :)
Для обработки двоичных / целочисленных преобразований мне пришлось создать пару скалярных функций (513 байтов).
A
идет от целого числа до битовой строки.B
делает обратное.Тогда есть процедура.
@C
это количество шаговДесять тысяч итераций заняли около 2 минут и вернули 9991 ряд
источник
Pyth - 37 байт
Очевидно, просто следует psuedocode. Вероятно, может много играть в гольф.
Попробуйте здесь онлайн .
источник
O2
вместоO1
.O1
дает случайное число из диапазонаU1 = [0]
.0
.Mathematica, 106 байт
источник
Perl, 102
Попробуй меня .
источник
R 186
Здесь нет ничего волшебного. Введите значение для
t
в консоли R и запустите скрипт. Трудно «сыграть в гольф» R-код, но вот более читаемая версия:источник
sample
переменную. напримерs=sample
, тогда используйте s вместо образца. К сожалению, я думаю, что ваш метод добавления случайного бита вlapply
конец в конечном итоге добавляет одну случайную выборку ко всем элементам в списке.lapply(L,function(x)append(x,sample(0:1,1)))
кажется, работает, но за плату. Вы можете заменить васas.numeric
с1*
который должен получить обратно.Руби, 82
Довольно просто. По сравнению с другими не относящимися к гольфу языками, ruby, похоже, хорошо справляется со своей большой стандартной библиотекой.
Пример вывода для t = 101010:
источник