รหัสสีเทาทั่วไป


13

อินพุต:อาร์เรย์Iของจำนวนเต็มบวกk จำนวนเต็มจะมีขนาดไม่เกิน 100 k ≤ 100

เอาท์พุท:อาร์เรย์เป็นไปได้ทั้งหมดต้องรหัสการส่งออกของคุณOของจำนวนเต็มไม่ใช่เชิงลบของความยาวkกับข้อ จำกัด ที่0 ≤ O ฉัน ≤ฉันฉัน ที่จะได้รับจากอาร์เรย์หนึ่งไปยังอีกคุณสามารถเพิ่มหรือลบ 1 ถึงหนึ่งมูลค่าในอาร์เรย์ รหัสของคุณจะต้องไม่ส่งออกอาร์เรย์เดียวกันสองครั้ง หากจำนวนของอาร์เรย์ที่แตกต่างกันที่จะส่งออกมีขนาดใหญ่มากรหัสของคุณควรดำเนินการในการส่งออกตลอดไปจนกว่าจะถูกฆ่าตาย

ตัวอย่าง

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

  • ถ้าI = [2,1]เป็นไปได้การเรียงลำดับของเอาต์พุตเอาท์พุตอย่างใดอย่างหนึ่งคือ(0,0),(0,1),(1,1),(1,0),(2,0),(2,1)

  • หากแล้วหนึ่งการสั่งซื้อเป็นไปได้ของอาร์เรย์ออกเป็นI = [2,1,3](0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,3),(0,1,2),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,1,2),(1,1,3),(2,1,3),(2,1,2),(2,1,1),(2,1,0),...

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

นี่เป็นความท้าทายที่ จำกัด อย่างซับซ้อน อาร์เรย์ใหม่ทุกตัวควรถูกส่งออกด้วยการผ่านเวลาO (k)นับตั้งแต่อาร์เรย์เอาท์พุทก่อนหน้า (หรือจุดเริ่มต้นของโปรแกรมสำหรับอาร์เรย์แรกที่เอาต์พุต) ซึ่งหมายความว่าเวลาการทำงานต่ออาร์เรย์ส่งออกใหม่ (พวกเขาจะมีความยาวแต่ละk ) ที่ควรจะเป็นมากขึ้นกว่าไม่มีO (k) นั่นคือมันควรจะใช้สัดส่วนของเวลาที่จะkและไม่ได้ตัวอย่างเช่นk 2หรือ2 k หมายเหตุนี่ไม่ใช่เวลาเฉลี่ยต่อเอาต์พุต แต่เวลาที่เลวร้ายที่สุดสำหรับแต่ละอาร์เรย์ที่เอาต์พุต

คุณสามารถสันนิษฐานได้ว่าการคำนวณทางคณิตศาสตร์ทั้งหมดในจำนวนเต็ม 64 บิตสามารถดำเนินการได้ในเวลาคงที่เช่นเดียวกับการอ่านและส่งออกรวมถึงการมอบหมายและค้นหาและการเปลี่ยนแปลงค่าในอาร์เรย์

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


1
(ควร "เพิ่มหรือลบ 1" โมดูโลที่ดำเนินการI_i+1หรือไม่คุณสามารถไปถึง 0 ได้I_iหรือไม่)
user202729

@ user202720 ไม่ฉันไม่ได้ตั้งใจ
Anush

ความซับซ้อนทำงานอย่างไรเมื่อnและkถูก จำกัด ? สมมติว่าพวกเขาไปอินฟินิตี้ที่มีความกว้างบิตวิธีการไป
l4m2

@ l4m2 สำหรับวัตถุประสงค์ของการวิเคราะห์ความซับซ้อนสมมติว่า k ไปที่อนันต์
Anush

@ ถามว่าแล้วความกว้างของบิตจะเป็นอย่างไร
l4m2

คำตอบ:


4

Python 3 , 116 ไบต์

def f(a):
 l=len(a);t=[0]*l;d=[1]*l
 while 1:
  i=0;yield t
  while not-1<t[i]+d[i]<=a[i]:d[i]*=-1;i+=1
  t[i]+=d[i]

ลองออนไลน์!

ขอบคุณMnemonicสำหรับ -1 ไบต์

ฟังก์ชั่นเครื่องกำเนิด (ขอบคุณเดนนิสสำหรับการเตือนฉันฉันลืมคุณลักษณะที่มีอยู่) ถ้าผลการควรจะพิมพ์เพื่อ stdout แล้วใช้print(t,flush=1)9 ไบต์เพิ่มเติมหรือถ้างูใหญ่เรียกว่ามี-u, print(t)พอเพียงสำหรับ 1 ไบต์

หยุดโดยมีข้อผิดพลาด ( IndexError) หากคุณต้องการเรียกใช้ฟังก์ชั่นนี้และจากนั้นดำเนินการโปรแกรมต่อไปคุณต้องจับมัน


ภายในขณะที่ลูปรันนานเท่าไร
Anush

@Anush ที่kขั้นตอนส่วนใหญ่เพราะในแต่ละขั้นตอนจะiเพิ่มขึ้นโดย1และหลังkขั้นตอนi==kและd[i]ทำให้เกิดข้อผิดพลาด
user202729

นี่เป็นทางออกที่ดีมาก
Anush

คุณสามารถบันทึกไบต์โดยการแทนที่ด้วยnot 0<= not-1<

1
คุณสามารถใช้yield tแทนprint(t,flush=1)?
เดนนิส

2

Stax , 22 ไบต์

▒)∙ñ╚▀NK♀F☺S(A#P`░]╪Db

เรียกใช้และแก้ไขข้อบกพร่อง

ต่อไปนี้เป็นสิ่งที่ยิ่งใหญ่เพื่อแสดงพฤติกรรมแบบ กดปุ่ม

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

,           pop from input to main stack
W           run the rest of the program repeatedly until explicitly cancelled
  cJP       copy top of stack and print, delimited by spaces
            get the index to mutate
  i^            iteration index + 1
  x{^|%}I       repeatedly apply divmod using l[k]+1 from input
                get the index of the first value that returns modulus >0
  cU=C      if the result is -1 (no match), then terminate the program
            get the direction to mutate
  s             get the "div" part of the last div operation called "d"
  ^|1           -1 ^ (d+1)
  ~{+}&     increment element in array at the index by the calculated amount

เรียกใช้อันนี้


1
การวัดความซับซ้อนของบิตดัชนีการทำซ้ำเป็นO(k)บิตดังนั้นkเวลาในการหารอาจใช้O(k²)เวลานาน ...
user202729

1

JavaScript (Node.js) , 114 ไบต์

a=>{b=a.map(_=>0);c=a.map(_=>1);for(i=0;a[i];b[i]+=c[i]||-1){console.log(b);for(i=0;b[i]==a[i]*c[i];i++)c[i]^=1;}}

ลองออนไลน์! Ungolfed:

function ggray(maxima) {
    var current = Array(maxima.length).fill(0);
    var flag = Array(maxima.length).fill(1);
    for (;;) {
        console.log(current);
        for (var i = 0; ; i++) {
            if (i == maxima.length) return;
            if (current[i] != maxima[i] * flag[i]) break;
            flag[i] = 1 - flag[i];
        }
        if (flag[i]) current[i]++;
        else current[i]--;
    }
}

1

Kotlin , 181 178 bytes

ขอบคุณที่: Anush ชี้ให้เห็นฉันเข้าใจผิดว่าความท้าทายในการบันทึก 2 ไบต์ ovs ชี้ให้เห็นการประหยัด 1 ไบต์

val p={a:List<Int>->var l=a.size
val v=Array(l,{0})
val i=Array(l,{1})
l-=1
o@while(0<1){println(v)
var p=l
while(v[p]+i[p]!in 0..a[p]){i[p]*=-1
p-=1
if(p<0)break@o}
v[p]+=i[p]}}

ลองออนไลน์!


1
สำหรับตัวอย่างในคำถามที่มี 2 1 3 รหัสของคุณต้องการ 3 2 4 ตามที่ปรากฏ
Anush

1
while(true)สามารถwhile(1<2)
ovs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.