สาขาวิชาฟิสิกส์


21

พื้นหลัง

ใช่ bitstring ฟิสิกส์คือสิ่งที่จริง ความคิดคือการสร้างทฤษฎีใหม่ของฟิสิกส์โดยใช้เพียงบิตของบิตที่วิวัฒนาการภายใต้กฎความน่าจะเป็น ... หรือบางสิ่งบางอย่าง แม้ว่าฉันจะอ่านบทความเกี่ยวกับเรื่องนี้บ้าง แต่ฉันก็ยังสับสนอยู่ดี อย่างไรก็ตามจักรวาล bitstring ทำให้กอล์ฟโค้ดเล็ก ๆ

โปรแกรมจักรวาล

Bitstring ฟิสิกส์จะเกิดขึ้นในสิ่งที่เรียกว่าจักรวาลโปรแกรม ในขั้นตอนของวิวัฒนาการของจักรวาลแต่ละมีรายการที่ จำกัดLของ bitstrings ของความยาวบางส่วนkที่เริ่มต้นด้วยรายการสององค์ประกอบที่[10,11] k = 2การประทับเวลาหนึ่งครั้งจะถูกประมวลผลดังต่อไปนี้ (ใน Pseudocode like 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เป็น input จำลองจักรวาลโปรแกรมสำหรับttimesteps Lและกลับหรือพิมพ์รายการผลลัพธ์ โปรดทราบว่าผลลัพธ์ในรายการเริ่มต้นt = 0 [10,11]คุณสามารถส่งออกLเป็นรายการของรายการจำนวนเต็มรายการของรายการค่าบูลีนหรือรายการสตริง หากผลลัพธ์ไปที่ STDOUT คุณอาจพิมพ์บิตหนึ่งต่อบรรทัดในรูปแบบที่เหมาะสม คำสั่งของ bitstrings มีความสำคัญ; โดยเฉพาะในรายการเริ่มต้นไม่สามารถ[11,10], [01,11]หรืออะไรอย่างนั้น ทั้งฟังก์ชั่นและโปรแกรมเต็มรูปแบบเป็นที่ยอมรับช่องโหว่มาตรฐานจะไม่ได้รับอนุญาตและชนะนับไบต์ต่ำสุด


เราสามารถจำกัดความยาวของสตริงบิตได้หรือไม่ (นั่นคือ: ฉันขอใช้หมายเลข 32 บิตและการดำเนินการบิต)
edc65

1
@ edc65 ไม่ความยาวของสตริงสามารถสูงได้ตามอำเภอใจ
Zgarb

3
@ edc65 ความต้องการเวลาและหน่วยความจำที่คาดหวังสำหรับการรับ 32 บิตนั้นเป็นเรื่องทางดาราศาสตร์ แต่นั่นก็เหมาะสมเพราะเราจำลองจักรวาล ;)
Zgarb

5
นี่คือบิตสตริงฟิสิกส์เป็นความคิดที่สติไม่สมประกอบ? ฉันยังไม่ได้อ่านบทความทั้งหมด แต่วลีที่ เราใช้ในฟิสิกส์บิต - สตริงเพื่อให้ทฤษฎีที่การประมาณ hbar c / e2 = 22 - 1 + 23 - 1 + 27 - 1 = 137 ทำให้รู้สึกในแง่ของ อัลกอริธึมคอมพิวเตอร์และทฤษฎีข้อมูลทำให้ฉันเป็น ... ตัวเลข
xebtl

1
@ xebtl มันก็ดูบ้าสำหรับฉันเช่นกัน ฉันจำได้ว่าอ่านเหตุผลสำหรับอัลกอริทึมและฟังดูเหมือนเป็นปรัชญาหลอกที่แย่กว่าฟิสิกส์ นอกจากนี้คำอธิบายของอัลกอริทึมของคุณดูเหมือนจะตรงกับเวอร์ชันของฉันบางทีฉันอาจเข้าใจผิดในบางเรื่อง
Zgarb

คำตอบ:


7

Pyth, 27 26 ไบต์

u?+RO2GqFKmOG2aGxVFKQ*]1U2

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

                              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

xVFKxMKเทียบเท่ากับ
isaacg

@isaacg ไม่xVFKเทียบเท่ากับxMCKจำนวนไบต์เดียวกัน
Jakube

11

CJam, 42 40 38 37 ไบต์

บันทึก 1 ไบต์โดย Sp3000

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

คำอธิบาย

สร้างสถานะเริ่มต้นเป็นหมายเลขฐาน 2:

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]]

จากนั้นดำเนินการวนรอบหลักและพิมพ์ผลลัพธ์ในตอนท้าย

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.

ทดสอบที่นี่


6

Julia, 141 129 ไบต์

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)

ไม่มีอะไรที่ฉลาด สร้างฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนเต็มเป็นอินพุตและส่งกลับอาร์เรย์ของอาร์เรย์ f=t->...เรียกว่าให้มันชื่อเช่น

คำอธิบาย Ungolfed +:

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

ตัวอย่าง:

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]

บันทึก 12 ไบต์ด้วย ML!


คุณสามารถโกนมันได้มากถึง133 ตัวอักษรหากคุณใช้ตัวดำเนินการ ternay แทน if / else และหากคุณเปลี่ยน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: ดีขอบคุณ ฉันไม่ได้คิดที่จะใช้ผู้ประกอบการที่สาม แต่คุณไม่จำเป็นต้องใช้วงเล็บในไตรภาคซึ่งช่วยคุณประหยัดได้มากกว่า 4 ข้อ จริง ๆ แล้วการกำหนดAและBแยกความยาวเท่ากับการกำหนดเข้าด้วยกันดังนั้นฉันจึงปล่อยให้ส่วนนั้นเป็น ขอบคุณอีกครั้งสำหรับคำแนะนำของคุณ!
Alex A.

ไม่เป็นไร อ่าฉันเข้าใจแล้ว ใช่ไม่จำเป็นต้องใส่วงเล็บ
ML

4

Python 2, 141

ฉันลองใช้วิธีการที่แตกต่างกันเล็กน้อย แต่สิ่งที่ดีที่สุดที่ฉันจะทำได้คือตรงไปตรงมา ขอบคุณ @ Sp3000 เป็นเวลา 15 ตัวอักษร (และสำหรับการสอนฉันเกี่ยวกับการมีอยู่ของ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

นี่คือ 141: ลิงค์
Sp3000

4

Python 2, 127 122

สมมติว่าสตริง python bit ของแบบฟอร์ม'0b1'ฯลฯ นั้นใช้ได้:

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)

ความแตกต่างเล็กน้อยที่นี่เท่านั้นคือการใช้ความจริงที่ว่า XOR (A, B) = 0 iff A = B

ขอบคุณ @ Sp300 ที่ทำให้การforวนซ้ำของวงรอบสั้นลง


แม้ว่าการดูความคิดเห็นที่ฉันคิดว่าศูนย์นำต้องได้รับการเก็บรักษาไว้
Sp3000

ฉันไม่สามารถทดสอบคำตอบนี้ได้ในตอนนี้ แต่ถ้ามันไม่รักษาศูนย์นำหน้าแสดงว่ามันไม่ถูกต้องแน่นอน
Zgarb


2

K, 46 53 46 ไบต์

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

อันนี้ขนาดที่ดี (ประมาณ 7 ไบต์) ของสิ่งนี้คือความจริงที่ว่า K ไม่มีxorโอเปอเรเตอร์ดังนั้นฉันต้องใช้ตัวเอง เดิมฉันใช้รายการสตริงตามด้วยการตระหนักว่าโง่อย่างบ้าคลั่ง ดังนั้นตอนนี้ฉันตัด 7 ไบต์อีกครั้ง!

ก่อน:

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

@ JohnE ชี้ให้เห็นในความคิดเห็นว่าสถานะเริ่มต้นควรจะฮาร์ดโค้ดซึ่งมีราคาเพิ่ม 7 ไบต์ : /


การอ่านข้อมูลจำเพาะของปัญหาของฉันคือคุณต้องเริ่มต้นด้วย "จักรวาล" ฮาร์โค้ดเสมอ(1 0;1 1)- โปรแกรมของคุณยอมรับสิ่งนี้เป็นอินพุต
JohnE

@JohnE แก้ไขแล้ว อย่างไรก็ตามไม่มีการรับประกันว่าจะใช้งานได้เพราะฉันไม่ได้ทดสอบการเปลี่ยนแปลง ฉันลองใช้ตอนจบใน
โปรแกรมทดแทนโอเค

ดูเหมือนว่าจะทำงานได้ดีในโคนาเช่นกัน
JohnE

2

JavaScript ( ES6 ) 152

ฟังก์ชั่นการใช้สตริง (ที่มีตัวเลขควรจะสั้นกว่า แต่ในการดำเนินการจาวาสคริปต์บิต จำกัด จำนวนเต็ม 32 บิต)

ทดสอบใน Firefox โดยใช้ตัวอย่างด้านล่าง

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 ไบต์

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

โครงสร้างของคำตอบของฉันค่อนข้างคล้ายกับของ @ kirbyfan64sos แต่แทนที่จะใช้สตริงฉันใช้เวกเตอร์ 1/0 และฉันหลีกเลี่ยงความต้องการเงื่อนไข ( :[ ; ; ]) โดยการทำดัชนีในรายการแทน

วิ่งน้อย:

  {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)

แก้ไข:

บันทึกสี่ไบต์ด้วยวิธีการที่กะทัดรัดกว่าในการสร้างจักรวาลเริ่มต้น:

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

Edit2:

ฉันลืมว่า "เลือก" สามารถใช้รายการเป็นอาร์กิวเมนต์ที่ถูกต้อง:

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

ดังนั้นฉันสามารถทำให้ส่วนนี้ง่ายขึ้น เครดิตที่มันครบกำหนดเคอร์บีได้รับเคล็ดลับนี้ก่อนที่ฉันจะทำ

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

1
แดงบางครั้งฉันคิดว่าฉันรู้จัก K แล้วฉันเห็นคำตอบของคุณ ... : O
kirbyfan64sos

ฉันคิดว่าวิธีนี้นับเป็นความพยายามของทีมอย่างแน่นอน!
JohnE

1

Javascript, 241 233 ไบต์

มันยาวมาก

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

คอมไพเลอร์ปิดบีบอัดมันประหยัด 8 ไบต์
Gustavo Rodrigues

216 ไบต์: 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 ของเวลา
Ismael Miguel

217 ไบต์: 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% ของเวลา
Ismael Miguel

1

T-SQL (2012+), 1019

ฉันเสียใจจริงๆที่นี่ไม่มีที่ไหนใกล้การแข่งขัน แต่พูดตามตรงฉันไม่คิดว่าฉันจะได้งานนี้และต้องโพสต์มันทันทีที่ฉันทำ ฉันลองเล่นกอล์ฟสักหน่อย :)

เพื่อจัดการการแปลงแบบไบนารี / จำนวนเต็มฉันต้องสร้างฟังก์ชันสเกลาร์สองสามตัว (513 จากไบต์) Aไปจากจำนวนเต็มสตริงบิต Bจะย้อนกลับ

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

จากนั้นก็มีขั้นตอน @Cคือจำนวนขั้นตอน

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 @

การทำซ้ำหมื่นครั้งใช้เวลาประมาณ 2 นาทีและส่งกลับ 9991 แถว

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

0

Pyth - 37 ไบต์

เห็นได้ชัดว่าเพียงแค่ติดตาม psuedocode อาจเป็นไปได้ที่จะเล่นกอล์ฟเป็นจำนวนมาก

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

ลองมันนี่เกมออนไลน์


3
คุณต้องแทนO2 จะช่วยให้คุณเป็นจำนวนสุ่มจากช่วง O1O1U1 = [0]
Jakube

2
0ดังนั้นคุณเสมอท้าย
Jakube


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"

ลองฉัน


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

ไม่มีอะไรวิเศษที่นี่ ป้อนค่าสำหรับtในคอนโซล R และเรียกใช้สคริปต์ มันยากที่จะรหัส R "กอล์ฟ" แต่นี่เป็นรุ่นที่อ่านได้มากขึ้น:

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

คุณสามารถบันทึกจำนวนอักขระได้โดยกำหนดให้sampleกับตัวแปร เช่นs=sampleจากนั้นใช้ s แทนตัวอย่าง น่าเสียดายที่ฉันคิดว่าวิธีการของคุณต่อท้ายบิตแบบสุ่มlapplyจะเป็นการสิ้นสุดด้วยการสุ่มหนึ่งตัวอย่างที่ถูกเพิ่มเข้าไปในรายการทั้งหมดในรายการ lapply(L,function(x)append(x,sample(0:1,1)))ดูเหมือนจะใช้งานได้ แต่มีค่าใช้จ่าย คุณสามารถแทนที่คุณas.numericด้วย1*ซึ่งควรได้รับกลับมาบ้าง
มิคกี้

จับทั้งสองประเด็นได้ดีและใช้เทคนิคการข่มขู่ที่ดีเช่นกัน
shadowtalker

ยังเพิ่งสังเกตเห็นว่าการนับของคุณออก ฉันจะทำให้มัน 168 ใช้นี้
MickyT

0

ทับทิม, 82

ค่อนข้างตรงไปตรงมามาก เมื่อเทียบกับภาษาอื่น ๆ ที่ไม่ใช่การเล่นกอล์ฟทับทิมดูเหมือนว่าจะทำได้ดีกับห้องสมุดมาตรฐานขนาดใหญ่

->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:

[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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.