ส่งรายการรหัสสีเทาของความกว้างบิตให้ฉัน


11

รหัสสีเทาคือลำดับของเลขฐานสองของความกว้างบิตnซึ่งจำนวนที่ต่อเนื่องจะแตกต่างกันในหนึ่งบิตเท่านั้น (ดูตัวอย่างผลลัพธ์)

การอ้างอิง

อินพุตตัวอย่าง:

3

ตัวอย่างผลลัพธ์:

000
001
011
010
110
111
101
100

หมายเหตุ:

  • คำถามนี้ดูเหมือนจะมีล่อลวงแต่ไม่สำหรับคำถามนั้นไม่ใช่รหัสกอล์ฟและต้องการผลลัพธ์ที่แตกต่างกัน มันจะช่วยในการตรวจสอบคำตอบของมัน
  • คุณอาจคิดว่าตัวแปรnที่มีการป้อนข้อมูล

6
เมื่อพิจารณาว่าคำถามอื่นเป็นความท้าทายของโค้ดที่เร็วที่สุดโดยไม่มีเกณฑ์การชนะอย่างมีเป้าหมาย (วัดได้เร็วที่สุดได้อย่างไร) ฉันเสนอให้ปิดอีกฝ่ายและเปิดใหม่อีกครั้ง
Dennis

2
ฉันเห็นด้วยกับ @dennis และดังนั้นฉันจึง upvoted คำตอบที่ไม่เป็นที่นิยมต่อไปนี้สำหรับคำถามเดิม "ถ้าคำตอบที่คุณกำลังมองหานั้นเป็นผลลัพธ์ที่รวดเร็วถ้าคุณประกาศอาร์เรย์ (ของรหัสสีเทา) ... "อย่างไรก็ตามคำถามเดิมนั้นมีคำถาม 7 ข้อและ 4 ตัวอักษรดังนั้นฉันจึงไม่ ไม่เห็นพื้นที่มากนักสำหรับการปรับปรุง ดังนั้นฉันไม่ได้ลงคะแนนเปิดใหม่ในปัจจุบัน
เลเวลริเวอร์เซนต์


คำถามโค้ดสีเทาที่เก่าที่สุดนั้นไม่ดี แต่มีคำตอบอยู่แล้วซึ่งเป็นพื้นฐานเหมือนกับคำตอบที่คำถามนี้ต้องการและที่ไม่น่าจะได้รับการปรับปรุง ฉันคิดว่ามันคงสมเหตุสมผลกว่าถ้าปล่อยให้อันนี้ปิดและเปลี่ยนอีกอันเป็นโค้ดกอล์ฟ
Peter Taylor

คำตอบ:


2

จาวาสคริปต์ (77)

for(i=0;i<1<<n;)alert((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))

เวอร์ชันที่เหมาะกับเบราว์เซอร์เพิ่มเติม (console.log และพรอมต์ ()):

n=prompt();for(i=0;i<1<<n;)console.log((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))

อาจจะเป็นแถวนี้ ... เข้าร่วมเป็น overkillfor(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
edc65

2

Python 2 (47)

for i in range(2**n):print bin(2**n+i/2^i)[3:]

การแสดงออกi/2^iสำหรับi'TH หมายเลขรหัสสีเทาจากคำตอบนี้ ในการเพิ่มศูนย์ชั้นนำที่แผ่นความยาวnผมเพิ่มก่อนที่จะแปลงเป็นสตริงไบนารีสร้างสตริงของความยาว2**n n+1แล้วฉันตัดชั้นนำ1คำนำหน้าและประเภทจำนวนด้วย0b[3:]



2

APL (Dyalog Classic) 11 ไบต์

2≠/0,↑,⍳n2

ลองออนไลน์!

n⍴2is 2 2...2- เวกเตอร์ของntwos

คือดัชนีของnอาร์เรย์มิติที่มีรูปร่าง2 2...2- นั่นคืออาร์เรย์2 × 2 × ... ×× 2 ของเวกเตอร์ซ้อนกัน ในฐานะที่เราใช้ 0 การจัดทำดัชนี ( ⎕IO←0) nผู้ที่มีทั้งหมดเวกเตอร์ไบนารีของความยาว

,แผ่รูปร่าง 2 × 2 × ... × 2 ออกไปเราจะได้เวกเตอร์ของเวกเตอร์ไบนารีซ้อนกัน2 n

"mix" - แปลงเวกเตอร์ของเวกเตอร์เป็นเมทริกซ์แข็ง 2 n × n ดูเหมือนว่านี้:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

0, ศูนย์รวมทางด้านซ้ายของเมทริกซ์

2≠/คำนวณ pairwise ( 2) xor ( ) ตามมิติสุดท้าย ( /ตรงข้ามกับ); กล่าวอีกนัยหนึ่งองค์ประกอบทุกตัวได้รับ xor-ed กับเพื่อนบ้านที่ถูกต้องและคอลัมน์สุดท้ายจะหายไป

0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

คุณจะเพิ่มคำอธิบายอย่างรวดเร็วหรือไม่
Jonah

1
@Jonah แน่ใจเพิ่ม
ngn

ฉลาดมากขอบคุณ
โยนาห์

2

Japt , 14 12 ไบต์

2pU Ç^z)¤ùTU

โกนสองไบต์ขอบคุณที่ETHproductions

ลองออนไลน์!


ตัวอย่างที่สมบูรณ์แบบของวิธีการùใช้ เนื่องจากN.z(n)เป็นการหารจำนวนเต็มด้วยค่าเริ่มต้น arg = 2 คุณสามารถบันทึกสองไบต์ด้วย2pU Ç^z)¤ùTU: ลองออนไลน์!
ETHproductions

@ ETHproductions ขอบคุณฉันยังคงพลาด args เริ่มต้นทุกขณะนี้ มีประโยชน์มากขอบคุณมาก
Nit

1

Python - 54

อ้างอิงจากอัลกอริทึมจากการอ้างอิงที่ให้ไว้ในการท้าทาย:

for i in range(2**n):print'{1:0{0}b}'.format(n,i>>1^i)

Ungolfed:

# For each of the possible 2**n numbers...
for num in range(2**n):
    gray = num>>1 ^ num

    # Print in binary and pad with n zeros.
    print '{1:0{0}b}'.format(grey)

1

PowerShell (168)

PowerShell's สมัครเล่นกลับมาพร้อมกับความพยายามอีกครั้งที่ golF! หวังว่าคุณจะไม่รังเกียจ! อย่างน้อยที่สุดคำถามเหล่านี้คือความสนุกและประสบการณ์การเรียนรู้ในการบูต สมมติว่า n ได้รับการป้อนข้อมูลเรามี:

$x=@('0','1');for($a=1;$a-lt$n;$a++){$x+=$x[($x.length-1)..0];$i=[Math]::Floor(($x.length-1)/2);0..$i|%{$x[$_]='0'+$x[$_]};($i+1)..($x.length-1)|%{$x[$_]='1'+$x[$_]}}$x

เนื่องจาก PowerShell ที่ฉันทำงานด้วยมีเพียง 2.0 ฉันไม่สามารถใช้ cmdlet การเลื่อนบิตใด ๆ ซึ่งอาจทำให้รหัสสั้นลง ดังนั้นฉันจึงใช้ประโยชน์จากวิธีการต่าง ๆ ที่อธิบายไว้ในแหล่งที่มาของคำถามพลิกอาร์เรย์และเพิ่มเข้าไปในตัวเองต่อท้าย 0 กับด้านหน้าของครึ่งบนและ 1 ถึงครึ่งล่าง


1

F # (86) (84) (80)

for i in 0..(1<<<n)-1 do printfn"%s"(Convert.ToString(i^^^i/2,2).PadLeft(n,'0'))

สิ่งนี้อาจปรับปรุงได้อีก

โปรดทราบด้วยว่าหากทำงานใน FSI คุณจะต้องopen System;;ก่อน หากคุณต้องการหลีกเลี่ยงการนำเข้าสิ่งนั้น (และหากคุณไม่สนใจลำดับที่พิมพ์ค่า) คุณสามารถใช้เวอร์ชัน 82 อักขระนี้:

for i in 0..(1<<<n)-1 do(for j in 0..n-1 do printf"%i"((i^^^i/2>>>j)%2));printfn""

1

ทับทิม - 42 39

อัลกอริทึมเดียวกันภาษาที่แตกต่าง:

(2**n).times{|b|puts"%0#{n}b"%(b>>1^b)}

เปลี่ยนจาก#mapการ#timesเป็น @voidpigeon แสดงให้เห็นบันทึก 3 ตัวอักษร


1
แทนการที่คุณสามารถใช้[*0...2**n].map (2**n).times
ชัดเจน


1

MATL 10 ไบต์

W:qt2/kZ~B

ลองออนไลน์!

วิธีเก่า "XOR n กับ n >> 2" ที่ดี

W- คำนวณ 2 ^ (อินพุต) (รับอินพุตโดยปริยาย)
:q- สร้างช่วงของตัวเลขตั้งแต่ 0 ถึง 2 ^ n - 1
t - ทำซ้ำช่วงนั้น
2/k- MATL ไม่มี bitshift ดังนั้นแบ่ง (แต่ละตัวเลข) ด้วย 2 และพื้น
Z~ - elementwise XOR ผลลัพธ์นั้นด้วยอาร์เรย์ 0 ถึง 2 ^ n - 1 ดั้งเดิม
B - แปลงตัวเลขแต่ละตัวในผลลัพธ์เป็นไบนารี
(แสดงผลลัพธ์โดยปริยาย)


1

K (ngn / k) 25 ไบต์

{(x-1){,/0 1,''|:\x}/0 1}

ลองออนไลน์!


  • |:\xคือ "reverse scan x" ใช้ย้อนกลับไปที่ x จนกระทั่งเอาต์พุตเท่ากับอินพุตและแสดงการวนซ้ำแต่ละครั้ง ส่งกลับ (0 1; 1 0) เมื่อผ่านครั้งแรก
  • 0 1,''คือ "0 1 เข้าร่วมแต่ละรายการ" รวม 0 เข้ากับค่าของ elem ที่ 1 และ 1 ต่อค่าของ 2nd elem แต่ละค่าให้ ((0 0; 0 1); (1 1; 1 0) ในการผ่านครั้งแรก
  • ,/ คือ "เข้าร่วมมากกว่า" และแบนเพื่อแสดงรายการ
  • (x-1){...}/0 1คือ "ใช้ {func} มากกว่า0 1x-1 ครั้ง" ใช้เอาต์พุตของการวนซ้ำล่าสุดเป็นอินพุต

0

APL (22)

{(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1

เอาต์พุตนี้เมทริกซ์ n-by-2 ^ n ที่มีบิตเป็นแถว:

      n←3
      {(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1
0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

คำอธิบาย:

  • {... }⍣(n-1)⍪0 1: เรียกใช้ฟังก์ชันn-1ด้วยการป้อนค่าเริ่มต้นของเมทริกซ์(0 1)T(ซึ่งเป็นรหัสสีเทา 1 บิต)

    • (0,⍵): แต่ละแถวของด้วย0คำนำหน้า
    • : ด้านบนของ,
    • 1,⊖⍵: แต่ละแถวของด้วย1คำนำหน้าในลำดับที่กลับรายการ

0

Jq 1.5 , 105 100 ไบต์

def g(n):if n<2then. else map([0]+.)+(reverse|map([1]+.))|g(n-1)end;[[0],[1]]|g(N)[]|map("\(.)")|add

สมมติว่า N ให้อินพุต เช่น

def N: 3 ;

ขยาย

def g(n):  # recursively compute gray code
  if n < 2
  then .
  else map([0]+.) + (reverse|map([1]+.)) | g(n-1)
  end;

  [[0],[1]]                 # initial state
| g(N)[]                    # for each element in array of gray codes
| map("\(.)")|add           # covert to a string

ลองออนไลน์!



-1

T-SQL 134

ความท้าทายนี้ขอให้คืนพลังคาร์ทีเซียนเป็น {(0), (1)} ตัวอย่างนี้สร้างรหัสซึ่งจะเรียกใช้งานผลิตภัณฑ์คาร์ทีเซียนของ {(0), (1)} n ครั้ง

DECLARE @ int=4,@s varchar(max)='SELECT*FROM's:set @s+='(VALUES(0),(1))t'+ltrim(@)+'(b)'if @>1set @s+=','set @-=1if @>0goto s exec(@s)

มันขอพลังคาร์ทีเซียนในคำสั่งเฉพาะ รหัสของคุณเป็นแบบนั้นหรือเปล่า?
ToonAlfrink
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.