Bitstring fizik


21

Arka fon

Evet, bit fiziği fiziği gerçek bir şeydir . Buradaki fikir, yalnızca olasılıklı bir kural altında gelişen bit dizgilerini veya başka bir şeyi kullanarak yeni bir fizik teorisi inşa etmektir. Bununla ilgili birkaç makale okuduğum halde hala kafam oldukça karıştı. Bununla birlikte, bit eşlik eden evren güzel bir küçük kod golfü yaratır.

Program Evreni

Bitstring fiziği, sözde program evreninde gerçekleşir . Evrenin evrimi Her adımda, sonlu bir listesi var Lbazı uzunlukta bit katarı içinde kiki eleman listesi ile başlayan [10,11]nerede k = 2. Bir zaman adımı aşağıdaki gibi işlenir (Python benzeri sahte kodda).

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

Tüm rastgele seçimler eşit olarak rasgele ve birbirlerinden bağımsızdır.

Örnek

4 adımdan oluşan bir örnek evrimi aşağıdakine benzeyebilir. İlk listeden başlayın L:

10
11

Rastgele seçiyoruz A := 10ve B := 10aynı satır olan hangisini seçiyoruz , yani her dizeyi Lrastgele bir bitle genişletmemiz gerekiyor :

101
110

Sonra, biz seçiyoruz A := 101ve B := 110eşit olmadıkları için XOR'larını şuna ekledik L:

101
110
011

Daha sonra, seçim A := 011ve B := 110ve yine kendi XOR ekleyin:

101
110
011
101

Son olarak, eşit olan A := 101(son satır) ve B := 101(ilk satır) seçimini yaparız , bu nedenle rastgele bitlerle genişletiriz:

1010
1100
0111
1010

Görev

Göreviniz tgirdi olarak negatif olmayan bir tamsayı almak , program evrenini ttimesteps için simüle etmek ve sonuç listesini döndürmek veya yazdırmaktır L. t = 0İlk listede sonuçlandığını unutmayın [10,11]. Bir Ltamsayı listesi, boolean değer listesi veya bir dize listesi olarak çıktı alabilirsiniz; Eğer çıktı STDOUT'a giderse, bitstrings'i her satıra bir tane olacak şekilde basabilirsiniz. Bit dizelerinin sırası önemlidir; Özellikle, ilk liste olamaz [11,10], [01,11]ya da böyle bir şey. Hem fonksiyonlar hem de tam programlar kabul edilebilir, standart boşluklara izin verilmez ve en düşük bayt sayısı kazanır.


Bit dizesi uzunluğunu sınırlandırabilir miyiz (yani: 32 bit sayıları ve bit işlemlerini kullanabilir miyim)?
edc65

1
@ edc65 Hayır, dizgilerin uzunluğu isteğe bağlı olarak yükselebilir.
Zgarb

3
@ edc65 32 bitin üstesinden gelmek için beklenen zaman ve bellek gereksinimleri astronomiktir, ancak bir evreni simüle ettiğimizden beri bu çok uygundur. ;)
Zgarb

5
Bu Bit-string Physics bir crackpot fikri midir? Makalenin tamamını okumamıştım, ama cümle yaklaşımı h / c / e2 = 22 - 1 + 23 - 1 + 27 - 1 = 137 anlamında anlamlı olan bir teori sağlamak için bit dizeli fiziği kullandık. Bir bilgisayar algoritması ve bilgi teorisi beni biraz vurur ... numerolojik.
xebtl

1
@ xebtl Bana da çılgınca geliyor. Algoritma için bir yerde bir gerekçe okuduğumu hatırlıyorum ve fiziğe göre sahte sözde felsefe gibi geldi. Ayrıca, algoritma tanımınız benim sürümüme uyuyor gibi görünüyor, belki de sizi bir şekilde yanlış anlıyorum.
Zgarb

Yanıtlar:


7

Pyth, 27 26 bayt

u?+RO2GqFKmOG2aGxVFKQ*]1U2

Çevrimiçi deneyin: Gösteri

Açıklama:

                              implicit: Q = input number
                     *]1U2    the initial list [[1,0], [1,1]]
u                   Q         reduce, apply the following expression Q times to G = ^
          mOG2                  take two random elements of G
         K                      store in K
       qF                       check if they are equal
 ?                              if they are equal:
  +RO2G                           append randomly a 0 or 1 to each element of G
                                else:
              aG                  append to G
                xVFK              the xor of the elements in K

xVFKeşittir xMK.
isaacg

@ isaacg Hayır, aynı bayt sayısına xVFKeşittir xMCK.
Jakube

11

CJam, 42 40 38 37 bayt

Sp3000 tarafından kaydedilen 1 bayt.

B2b2/q~{:L_]:mR_~#L@~.^a+L{2mr+}%?}*p

açıklama

İlk durumu bir baz-2 numarası olarak oluşturun:

B2b e# Push the the binary representation of 11: [1 0 1 1]
2/  e# Split into chunks of 2 to get [[1 0] [1 1]]

Ve sonra ana döngüyü yapın ve sonunda sonucu güzel bir şekilde yazdırın:

q~       e# Read and eval input t.
{        e# Run this block t times.
  :L     e#   Store the current universe in L.
  _]     e#   Copy it and wrap both copies in an array.
  :mR    e#   Pick a random element from each copy.
  _~     e#   Duplicate those two elements, and unwrap them.
  #      e#   Find the second element in the first. If they are equal, it will be found at
         e#   index 0, being falsy. If they are unequal, it will not be found, giving
         e#   -1, which is truthy.

         e#   We'll now compute both possible universes for the next step and then select
         e#   the right one based on this index. First, we'll build the one where they were
         e#   not equal.

  L@~    e#   Push L, pull up the other copy of the selected elements and unwrap it.
  .^     e#   Take the bitwise XOR.
  a+     e#   Append this element to L.

  L      e#   Push L again.
  {      e#   Map this block onto the elements in L.
    2mr+ e#     Append 0 or 1 at random. 
  }%     
  ?      e#   Select the correct follow-up universe.
}*
p        e# Pretty-print the final universe.

Burada test et.


6

Julia, 141 129 bayt

t->(L=Any[[1,0],[1,1]];for i=1:t r=1:length(L);A=L[rand(r)];B=L[rand(r)];A==B?for j=r L[j]=[L[j],rand(0:1)]end:push!(L,A$B)end;L)

Zekice bir şey değil. Bir tamsayıyı girdi olarak kabul eden ve bir dizi dizisi döndüren adsız bir işlev oluşturur. Aramak için bir isim verin, örneğin f=t->....

Ungolfed + açıklama:

function f(t)
    # Start with L0
    L = Any[[1,0], [1,1]]

    # Repeat for t steps
    for i = 1:t
        # Store the range of the indices of L
        r = 1:length(L)

        # Select 2 random elements
        A = L[rand(r)]
        B = L[rand(r)]

        if A == B
            # Append a random bit to each element of L
            for j = r
                L[j] = [L[j], rand(0:1)]
            end
        else
            # Append the XOR of A and B to L
            push!(L, A $ B)
        end
    end

    # Return the updated list
    L
end

Örnekler:

julia> f(4)
4-element Array{Any,1}:
 [1,0,1,0]
 [1,1,1,1]
 [0,1,1,0]
 [0,1,0,0]

julia> f(3)
3-element Array{Any,1}:
 [1,0,1,1]
 [1,1,1,0]
 [0,1,0,1]

ML sayesinde 12 bayt kaydedildi!


Eğer ternay operatörünü if / else yerine kullanıyorsanız ve değiştirirseniz 133 karaktere kadar tıraş edebilirsiniz 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)
ML

@ML: Güzel, teşekkürler. Üçlü operatörü kullanmayı düşünmemiştim. Fakat aslında üçlünüzde parantez içine ihtiyacınız yok; bu da öneriniz üzerinden 4 tane daha tasarruf etmenizi sağlıyor. Atama Ave Bayrı ayrı yapmak, onları bir arada atamakla aynı uzunluktadır, ben de o kısmı olduğu gibi bıraktım. Öneriniz için tekrar teşekkürler!
Alex A.

Rica ederim. Ah, anlıyorum. Evet, parantez gerekli değildir.
ML,

4

Python 2, 141

Birkaç farklı yöntem denedim, ancak elde edebileceğimin en iyisi nispeten kolaydı. @ Sp3000'e 15 karakter ya da öylesine bir şey için (ve bana varlığı hakkında bilgi verdiğiniz için int.__xor__).

from random import*
L=[[1,0],[1,1]];C=choice
exec"A=C(L);B=C(L);L=[L+[map(int.__xor__,A,B)],[x+[C([1,0])]for x in L]][A==B];"*input()
print L

: İşte 141 var linki
SP3000

4

Python 2, 127 122

Form '0b1'vb python bit dizeleri varsayalım : Tamam

from random import*
C=choice
L=[2,3]
exec"x=C(L)^C(L);L=L+[x]if x else[a*2+C([0,1])for a in L];"*input()
print map(bin,L)

Buradaki sadece hafif nüans, XOR (A, B) = 0 olması durumunda A = B olduğu gerçeğinin kullanılmasıdır.

Muhafaza fordöngüsünü kısaltmak için @ Sp300 sayesinde


Yorumlara
bakılırsa

Şu anda bu yanıtı test edemiyorum, ancak baştaki sıfırları koruyamıyorsa, gerçekten de yanlış.
Zgarb

3

Pyth, 34

u?+RO`TGqJOGKOG+Gsm`s!dqVJKQ[`T`11

Her yinelemeyi uygulamak için azaltma kullanır. Golf bittiğimi ne zaman açıklayacağım.

Burada dene


2

K, 46 53 46 bayt

{x{:[~/t:2?x;{x,*1?2}'x;x,,,/~=/t]}/(1 0;1 1)}

Bunun büyüklüğünde (yaklaşık 7 bayt) iyi bir yığın, K'nin xoroperatör sahibi olmadığı gerçeğinden kaynaklanıyor , bu yüzden kendimi bir tane uygulamak zorunda kaldım. Başlangıçta, dizelerin bir listesini kullandım, ardından bunun delice aptalca olduğunu fark ettim. Şimdi tekrar 7 baytı kestim!

Önce:

{x{:[~/t:2?x;{x,*$1?2}'x;x,,,/$~=/(0$')'t]}/$:'10 11}

@JohnE, yorumda ilk durumun, 7 ekstra byte'a mal olması zor kodlandığını belirtti. : /


Problem spesifikasyonunu okumam, daima sabit kodlu "evren" ile başlamanız gerektiğidir (1 0;1 1)- programınız bunu girdi olarak kabul eder.
JohnE

@JohnE Sabit. Ancak, bunun işe yarayacağının garantisi yok çünkü değişiklikleri test etmedim; Az önce son bölümünüzü denedim ...
kirbyfan64sos

Kona'da da iyi çalışıyor gibi görünüyor.
JohnE

2

JavaScript ( ES6 ) 152

Dizeleri kullanan bir işlev (sayılarla kısa olması gerekir, ancak javascript bit işlemlerinde 32 bit tamsayılarla sınırlıdır).

Aşağıdaki pasajı kullanarak Firefox'ta test edin.

F=(t,L=['10','11'],l=2,R=n=>Math.random()*n|0,a=L[R(l)],b=L[R(l)])=>
   t--?a==b
     ?F(t,L.map(x=>x+R(2)),l)
     :F(t,L,L.push([...a].map((x,p)=>x^b[p]).join('')))
  :L
  
test=_=>O.innerHTML=F(+I.value).join('\n')
#I{width:3em}
<input id=I value=10><button onclick=test()>-></button><pre id=O></pre>


1

K, 45 41 38 bayt

{x{(x,,~=/t;{x,1?2}'x)@~/t:2?x}/1,'!2}

Cevabımın yapısı @ kirbyfan64sos'unkine oldukça benzer, ancak stringler yerine 1/0 vektör kullandım ve :[ ; ; ]bir listeye endeksleyerek koşullu ( ) gereksiniminden kaçınıyorum .

Birkaç tur:

  {x{(x,,~=/t;{x,1?2}'x)@~/t:2?x}/1,'!2}3
(1 0 0 0
 1 1 1 1
 0 1 1 1)

  {x{(x,,~=/t;{x,1?2}'x)@~/t:2?x}/1,'!2}3
(1 0 0
 1 1 0
 0 1 0
 1 0 0)

  {x{(x,,~=/t;{x,1?2}'x)@~/t:2?x}/1,'!2}3
(1 0 0
 1 1 0
 0 1 0
 1 1 0)

Düzenle:

İlk evreni oluşturmak için daha kompakt bir yolla dört bayt kurtardı:

1,'!2     / new
(1 0;1 1) / old

Edit2:

"Seç" in bir listeyi doğru argüman olarak alabileceğini unuttum:

  2?"abcd"
"dc"
  2?"abcd"
"cc"
  2?"abcd"
"ca"

Böylece bunun bir kısmını basitleştirebilirim. Neden olduğu kredisi, Kirby benden önce bu numarayı aldı.

2?x    / new
x@2?#x / old

1
Dang, bazen sanırım K'yi tanıyorum, sonra cevaplarını görüyorum ...: O
kirbyfan64sos

Bence bu çözüm kesinlikle bir takım çalışması olarak sayılıyor!
JohnE

1

Javascript, 241 233 bayt

Bu biraz uzun.

a=[[1,0],[1,1]];for(b=prompt();b--;)if(c=a.length,d=a[c*Math.random()|0],e=a[c*Math.random()|0],d+""==e+"")for(f=0;f<c;f++)a[f].push(2*Math.random()|0);else{g=[];for(h=0;h<d.length;h++)g.push(d[h]^e[h]);a.push(g)}alert(a.join("\n"));

Kapanış Derleyicisi 8 bayttan tasarruf sağladı.
Gustavo Rodrigues,

216 bayt:, 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"))zamanın 3/5 istenen çıkışını üretir.
Ismael Miguel,

217 bayt:, 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"))zamanın% 90'ını çalışır.
Ismael Miguel,

1

T-SQL (2012+), 1019

Gerçekten üzgünüm, bu hiçbir rekabet gücüne yakın değildi, ama dürüst olmak gerekirse, bunu işe alabileceğimi ve bir kez yaptıktan sonra göndermek zorunda kalacağımı düşünmedim. Biraz golf oynamayı denedim :)

İkili / tamsayılı dönüşümleri ele almak için birkaç skaler fonksiyon (513 bayt) oluşturmak zorunda kaldım. Atamsayıdan bir bit dizgisine gider. Btersini yapar.

CREATE FUNCTION A(@ BIGINT)RETURNS VARCHAR(MAX)AS
BEGIN
DECLARE @S VARCHAR(MAX);
WITH R AS(SELECT @/2D,CAST(@%2 AS VARCHAR(MAX))M
UNION ALL
SELECT D/2,CAST(D%2 AS VARCHAR(MAX))+M
FROM R
WHERE D>0)SELECT @S=M FROM R WHERE D=0
RETURN @S
END
CREATE FUNCTION B(@ VARCHAR(MAX))RETURNS BIGINT AS
BEGIN
DECLARE @I BIGINT;
WITH R AS(SELECT CAST(RIGHT(@,1)AS BIGINT)I,1N,LEFT(@,LEN(@)-1)S
UNION ALL 
SELECT CAST(RIGHT(S,1)AS BIGINT)*POWER(2,N),N+1,LEFT(S,LEN(S)-1)
FROM R
WHERE S<>''
)SELECT @I=SUM(I)FROM R
RETURN @I
END

Sonra prosedür var. @Cadımların sayısı

DECLARE @C INT=9
DECLARE @ TABLE(S VARCHAR(MAX))
DECLARE @R VARCHAR(MAX)
INSERT @ VALUES('10'),('11')
WHILE(@C>=0)
BEGIN
SET @C-=1
SELECT @R=CASE WHEN MAX(S)=MIN(S)THEN''ELSE RIGHT(REPLICATE('0',99)+dbo.A(dbo.B(MAX(S))^dbo.B(MIN(S))),LEN(MAX(S)))END
FROM(SELECT TOP 2S,ROW_NUMBER()OVER(ORDER BY(SELECT\))N FROM @,(VALUES(1),(1),(1))D(D)ORDER BY RAND(CAST(NEWID()AS VARBINARY(50))))A
IF @R=''UPDATE @ SET S=CONCAT(S,ROUND(RAND(CAST(NEWID() AS VARBINARY(50))),0))
ELSE INSERT @ VALUES(@R)
END
SELECT * FROM @

On bin yineleme 2 dakika kadar sürdü ve 9991 satır döndürdü

1001001100110
1101001001110
0111100100101
1111100001011
1111001010011
0110101001101
...
1110101000100
1111011101100
1100001100010
0110010001001
1110100010100

0

Pyth - 37 bayt

Açıkçası, sadece psuedocode izler. Muhtemelen çok golf oynayabilir.

KPP^,1Z2VQ=K?m+dO1KqFJ,OKOKaKxVhJeJ;K

Burada çevrimiçi deneyin .


3
Onun O2yerine ihtiyacın var O1. O1size aralıktan rastgele bir sayı verir U1 = [0].
Jakube

2
Demek her zaman ekliyorsun 0.
Jakube

0

Mathematica, 106 bayt

Nest[If[Equal@@#,Map[#~Append~RandomInteger[]&],Append[BitXor@@#]]&[#~RandomChoice~2]@#&,{{1,0},{1,1}},#]&

0

Perl, 102

#!perl -p
@l=qw(10 11);$_=$l[rand@l]^$l[rand@l],$_|=y//0/cr,@l=/1/?(@l,$_):map{$_.~~rand 2}@l for 1..$_;$_="@l"

Deneyin beni .


0

R, 186

L=list(0:1,c(1,1))
if(t>0)for(t in 1:t){A=sample(L,1)[[1]]
B=sample(L,1)[[1]]
if(all(A==B)){L=lapply(L,append,sample(0:1, 1))}else{L=c(L,list(as.numeric(xor(A,B))))}}
L

Burada büyülü bir şey yok. tR konsoluna için değeri girin ve betiği çalıştırın. "Golf" R kodunu zor ama işte daha okunaklı bir sürüm:

L <- list(0:1, c(1, 1))
if(t > 0) {
  for(t in 1:t) {
    A <- sample(L, 1)[[1]]
    B <- sample(L, 1)[[1]]
    if (all(A == B)) {
      L <- lapply(L, append, sample(0:1, 1))
    } else {
      L <- c(L,list(as.numeric(xor(A, B))))
    }
  }
}
L

sampleBir değişkene atayarak çok sayıda karakter kaydedebilirsiniz . örneğin s=sample, o zaman örnek yerine s kullanın. Ne yazık ki, rasgele bir bit ekleme yönteminizin lapplylistedeki tüm öğelere bir rastgele örnek eklenerek sonuçlanacağını düşünüyorum . lapply(L,function(x)append(x,sample(0:1,1)))iş gibi görünüyor, ama bir bedeli var. Sen yerini alabilir as.numericile 1*bazı geri almak gerekir.
MickyT

İyi de her iki noktaları üzerinde yakalamak ve güzel bir zorlama hüner
shadowtalker

Ayrıca, sayının tükendiğini fark ettim. Ben kullanarak bunu 168 yapmak bu
MickyT

0

Ruby, 82

Hemen hemen ileri. Diğer golf dışı dillerle karşılaştırıldığında, yakut büyük standart kütüphanesi ile iyi görünüyor.

->t{l=[2,3]
t.times{a,b=l.sample 2
a.equal?(b)?l.map!{|x|x*2+rand(2)}:l<<(a^b)}
l}

T = 101010 için örnek çıktı:

[9, 15, 6, 13, 5, 12, 10, 11, 5, 4, 15, 13, 2, 7, 11, 9, 3, 3, 8, 6, 3, 13, 13, 12, 10, 9, 2, 4, 14, 9, 9, 14, 15, 7, 10, 4, 10, 14, 13, 7, 15, 7]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.