ลำดับ Back-and-Forth


18

ลองนึกภาพเส้นทางที่สร้างขึ้นจาก<และ>และสิ้นสุดใน@เช่น

><>@

วอล์คเกอร์เริ่มต้นที่เซลล์ซ้ายสุด เขาจะข้ามเส้นทางดังต่อไปนี้:

  • หากวอล์คเกอร์อยู่ในห้อง@ขังเขาไปถึงเป้าหมายแล้วและเสร็จสิ้น
  • ถ้าวอล์คเกอร์อยู่บน>มือถือเส้นทางทั้งหมดกะขั้นตอนหนึ่งไปทางขวาวนการวอล์คเกอร์กับมัน
  • ถ้าวอล์คเกอร์อยู่บน<มือถือกะเส้นทางทั้งหมดขั้นตอนหนึ่งไปซ้ายวนการวอล์คเกอร์กับมัน
  • หลังจากนั้นวอล์คเกอร์ใช้ขั้นตอนเดียว หากเขาอยู่ที่ปลายทั้งสองของเส้นทางเขาจะย้ายออกจากจุดสิ้นสุด ไม่เช่นนั้นเขาจะเคลื่อนไหวต่อไปในทิศทางที่เขาเคลื่อนที่ในขั้นตอนสุดท้าย (ไม่สนใจการหมุน) เดินไปในขั้นต้น

เรามาดูตัวอย่างข้างต้นกันดีกว่า ตำแหน่งวอล์คเกอร์ถูกทำเครื่องหมายด้วย^:

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

วอล์คเกอร์เข้าชม6เซลล์ในกระบวนการ (รวมถึงเซลล์เริ่มต้นและเซลล์@และนับแต่ละเซลล์บ่อยเท่าที่เยี่ยมชม)

นี่คือตัวอย่างเล็ก ๆ ที่ซึ่งวอล์คเกอร์ถูกเคลื่อนย้ายข้ามขอบด้วยการหมุน:

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

ในครั้งนี้ผู้เยี่ยมชม3เซลล์เข้าเยี่ยมชม

เราสามารถเปลี่ยนให้เป็นลำดับจำนวนเต็มได้ง่ายๆ:

  • คุณได้รับในเชิงบวกจำนวนเต็มN9เช่น
  • 1001คุณคำนวณฐานเป็นตัวแทนของจำนวนเต็มนี้เช่น
  • จากนั้นเลี้ยว1เข้ามา>และ0เข้า<และผนวก:@><<>@
  • เราเชื่อมโยงกับNจำนวนเซลล์ที่วอล์คเกอร์เข้าชมในจำนวนที่สร้างขึ้นด้วยวิธีนี้

องค์ประกอบสองสามชิ้นแรกของลำดับผลลัพธ์คือ:

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

นี่อาจดูเป็นเรื่องที่ค่อนข้างไร้เหตุผล แต่ลำดับผลลัพธ์ที่ได้กลับกลายเป็นว่ามีโครงสร้างจำนวนมาก:

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับการอ้างอิงคุณสามารถค้นหาหมายเลข 2048 แรกของลำดับใน pastebinนี้

ความท้าทาย

คุณเดามัน: คุณจะคำนวณลำดับข้างต้น คุณสามารถทำได้หนึ่งในสามวิธี:

  • คุณสามารถสร้างลำดับอนันต์ (ในขณะที่หน่วยความจำอนุญาต) โดยการส่งออกค่า (คั่นด้วยอักขระที่ไม่ใช่ตัวเลข) อย่างต่อเนื่องหรือโดยใช้ตัวสร้างอนันต์ในภาษาที่รองรับ หากคุณพิมพ์สตรีมแบบไม่สิ้นสุดไปที่ STDOUT คุณไม่จำเป็นต้องพิมพ์ตัวเลขทีละตัว แต่ให้แน่ใจว่าทุกหมายเลขจะถูกพิมพ์หลังจากระยะเวลาที่ จำกัด (และตามลำดับ) หากคุณใช้ตัวเลือกนี้คุณไม่ควรรับข้อมูลใด ๆ
  • คุณสามารถใช้จำนวนเต็มNเป็นอินพุตและสร้างคำที่Nของลำดับ
  • คุณสามารถใช้จำนวนเต็มNเป็นอินพุตและสร้างทุกอย่างจนถึงคำที่Nของลำดับไม่ว่าจะเป็นรายการหรือสตริงโดยใช้ตัวคั่นที่ไม่กำกวม

เนื่องจากฉันไม่ต้องการลงโทษภาษาที่ไม่สามารถแปลงระหว่างฐานได้อย่างง่ายดายแทนที่จะเป็นจำนวนเต็มNคุณอาจใช้การแทนค่าฐานสองของNโดยใช้0s และ1s ตามปกติ (เป็นรายการหรือสตริง) โดยส่วนใหญ่ - บิตที่มีนัยสำคัญก่อน

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

ใช้กฎมาตรฐานของ

พื้นหลัง

สิ่งนี้คำนวณจำนวน "เห็บ" ล่ามตรงไปข้างหน้าของภาษาโปรแกรมลับของเขาวงกตเขาจะต้องตีความ "เส้นทาง" เป็นซอร์สโค้ด ในกรณีนั้น "ผู้เดิน" เป็นเพียงตัวชี้คำสั่ง (ซึ่งมีตำแหน่งและทิศทาง) @คำสั่งจะยุติโปรแกรมและ<และ>เป็นคำสั่งการแก้ไขซอร์สโค้ด


ต้องใช้อันไหน 1, 2 หรือ 3 และวิธีการส่งผลงานของเราเป็นอย่างไร
Abr001am

@ Agawa001 "คุณสามารถทำได้หนึ่งในสามวิธี:" เลือกหนึ่งในวิธีใดวิธีหนึ่งที่คุณคิดว่าง่ายที่สุดสำหรับวิธีการและภาษาที่คุณต้องการใช้
Martin Ender

ทำไมตัวเลขซ้ำทั้งหมดในวันนี้!?! codegolf.stackexchange.com/questions/78787/… : D
cat

คำตอบ:


6

เยลลี่ , 10ไบต์

ð+\ḤiḤoµL‘

ฟังก์ชันนี้ยอมรับเลขจำนวนเต็มเดียวในรูปแบบของรายการเลขฐานสองของมันเป็นอินพุต

อัลกอริทึมนั้นเทียบเท่ากับคำตอบของ @ Agawa001คำตอบของ

ลองออนไลน์! หรือสร้างหมายเลข 2048 แรกสร้างหมายเลข

พื้นหลัง

ระบุตำแหน่งที่อยู่ด้านล่างเส้นทางจาก0ถึงLทำให้มีจำนวนL + 1ทั้งหมด Lเกิดขึ้นพร้อมกันกับจำนวนเลขฐานสองของหมายเลขNที่เข้ารหัสเส้นทาง ด้วยเครื่องหมายนี้วอล์คเกอร์เริ่มต้นที่ตำแหน่ง0เป้าหมายที่ตำแหน่งL

ในแต่ละขั้นตอนที่ผู้เล่นใช้เวลาเขาจะเข้าใกล้เป้าหมายมากขึ้นหนึ่งก้าว (ในทิศทางที่เขากำลังเดินอยู่) นอกจากนี้ในแต่ละขั้นตอนการเปลี่ยนขึ้นอยู่กับว่าเขาเดินด้วยหรือต่อต้านทิศทางการขยับเขาจะเพิ่มหรือลดตำแหน่งของเขา2โมดูโล่ L + 1หรือเขายังคงอยู่ในตำแหน่งปัจจุบัน

ในการเปลี่ยนทิศทางเขาต้องลงจอดในตำแหน่งL - 1 (หันหน้าไปทางL ) หรือตำแหน่ง1 (หันหน้า0 ) จากนั้นจึงขยับไปตามทิศทางของเขา ขั้นตอนต่อไปเขาจะพาเขากลับไปยังตำแหน่งก่อนหน้าหันหน้าไปในทิศทางตรงกันข้าม

  • ถ้าLเป็นL , L - 1ก็แปลกดังนั้นเขาไม่สามารถเลื่อนจากตำแหน่งเริ่มต้นของเขาไปที่L - 1ได้โดยตรง วิธีเดียวที่จะไปถึงก็คือการผ่านLไปถึง0และเข้าสู่ขั้นตอนต่อไปเพื่อลงจอดบน1แล้วก้าวไปทางขวา สิ่งนี้ต้องการตำแหน่ง2L ที่ก้าวหน้าซึ่งสามารถทำได้ในไม่น้อยกว่าขั้นตอนL

    อย่างไรก็ตามหลังจากทำตามขั้นตอนLโดยไม่เปลี่ยนทิศทางเขาจะไปถึงเป้าหมาย การเพิ่มหนึ่งเซลล์สำหรับเซลล์เริ่มต้นเราจะได้รับจำนวนเซลล์ที่เข้าชมL + 1 ทั้งหมดในกรณีนี้

  • หากLแปลก, L - 1เป็นเลขคู่ดังนั้นเขาสามารถไปถึงตำแหน่งนั้นได้โดยขยับ(L - 1) / 2ครั้งไปทางขวา หากตำแหน่งL - 1อยู่ใต้1ในเวลานั้นเขาจะถูกเลื่อนไปที่ตำแหน่งLหมุนไปรอบ ๆ และก้าวสู่ตำแหน่งL - 1 (หันหน้าไปทางซ้าย)

    สิ่งนี้อาจหรือไม่เกิดขึ้นก่อนที่เขาจะบรรลุเป้าหมายดังนั้นจึงมีสองกรณีที่ต้องวิเคราะห์:

    • หากมีน้อยกว่า(L + 1) / 2เกิดขึ้น1ในการขยายฐานสองของNการทำตามขั้นตอนLจะไม่เพียงพอที่จะเปลี่ยนทิศทาง เนื่องจากขั้นตอนLเหล่านี้นำวอล์คเกอร์ไปยังเป้าหมายของเขาเพิ่มหนึ่งเซลล์สำหรับเซลล์เริ่มต้นเราจึงได้รับเซลล์ที่เยี่ยมชมL + 1 ทั้งหมดในกรณีนี้

    • ถ้ามีอย่างน้อย(L + 1) / 2การเกิดขึ้นของ1ในการขยายตัวของฐานN , ล้ำหน้าไป((L + 1) / 2) วันที่เกิดขึ้นจะต้องมีผมทำตามขั้นตอนที่ผมเป็นตำแหน่งเริ่มต้นของการเกิดขึ้นว่า ของ1

      ดังนั้นหลังจากการที่ผมทำตามขั้นตอนที่วอล์คเกอร์อยู่ในตำแหน่งที่L - 1หันหน้าไปทาง leftwards ในการเปิดเส้นทางอีกครั้งเขาจะต้องเดิน leftwards ล่วงหน้าไปยังตำแหน่งที่1 อย่างไรก็ตามเช่นในกรณีที่สม่ำเสมอเนื่องจาก(L - 1) - 1เป็นเลขคี่สิ่งนี้จะต้องผ่าน0และทำตามขั้นตอนที่ไม่น้อยกว่าL

      ตั้งแต่ระยะเริ่มต้นเพื่อให้บรรลุเป้าหมายในทิศทางซ้ายเป็น1หลังจากที่ผมทำตามขั้นตอนที่วอล์คเกอร์พบว่าตัวเองที่ระยะห่างจากI + 1จากเป้าหมายหลังจากที่เปลี่ยนทิศทาง เนื่องจากฉัน <LเรามีI + 1 ≤ Lดังนั้นขั้นตอนถัดไปที่ฉัน + 1จะนำเขาไปสู่เป้าหมาย

      สิ่งนี้จะให้ผลรวมของI + I + 1 = 2I + 1 ที่ทำตามขั้นตอน การเพิ่มหนึ่งเซลล์สำหรับเซลล์เริ่มต้นเราจะได้รับจำนวน2I + 1 + 1 = 2 (I + 1)เซลล์ที่เยี่ยมชมในกรณีนี้

มันทำงานอย่างไร

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.

9

Matlab (คะแนน = 230, n = inf)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • ฟังก์ชั่นใช้ s เป็นดัชนีเริ่มต้นและ f เป็นจุดสิ้นสุด (ประเภท infหากคุณต้องการคงไว้ไม่สิ้นสุด)
  • ฟังก์ชั่นสามารถทำงานได้ตลอดไปโดยไม่มีการหน่วงเวลาอันน่าทึ่งระหว่างประเภทเอาท์พุทสองแบบ h=1000000000000000000000000000000000000000000000000000;w(h,h+1)เพื่อให้แน่ใจ
  • อัลกอริทึมดังต่อไปนี้วิธีการทางคณิตศาสตร์ที่ฉันจะอธิบายในภายหลังและจะยืนยันรายการอ้างอิงของมาร์ตินโดยใช้โปรแกรมนี้:

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • เนื่องจากอัลกอริทึมตรวจสอบผลการทดสอบครั้งแรก 2048 ฉันจะสุ่มสี่สุ่มห้าคิดว่ามันจะเป็นกรณีทดสอบใด ๆ ดังนั้นอัลกอริทึมของฉันทำงานเกี่ยวกับคุณสมบัติบางอย่างที่ฉันค้นพบในกระบวนการนี้โดยไม่ต้องเจ็บปวดจากการขยับและตัวชี้เคลื่อนไหว

    1- หากจำนวนของ 1 ในการแปลไบนารีสองเท่าไม่เกินความยาวของ sequnce Lดังนั้นเอาต์พุตจะเป็นL+1

    2- หากความยาวของลำดับเป็นเลขคู่และเงื่อนไขก่อนหน้านี้ไม่ได้ตั้งค่าไว้ดังนั้นเอาต์พุตจะเหมือนกัน L+1

    3- มิฉะนั้นเอาต์พุตจะเป็นสองเท่าของL/2ดัชนีที่ 1


คุณช่วยอธิบายสิ่งที่คุณหมายถึงด้วย"ผลลัพธ์เป็นสองเท่าของดัชนี L / 2 ของ 1" ? มันไม่ชัดเจนอย่างไม่น่าเชื่อ
orlp

@orlp ในลำดับนี้ 10010001 การเกิดขึ้นครั้งที่สองของ 1 คือ 4 โดย 2 คือ 8
Abr001am

1
สิ่งนี้สามารถเล่นกอล์ฟได้อย่างน้อย 89 ไบต์a=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),endซึ่งให้องค์ประกอบเดียวของลำดับ
เดวิด

8

Python, 122 119 113 110 108 107 103 ไบต์

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

รับอินพุตเป็นรายการของเลขฐานสอง ฟังก์ชั่นผู้ช่วยในการทดสอบ:

b = lambda n: [int(d) for d in bin(n)[2:]]

ให้เครดิตกับ Lynn สำหรับการบันทึก 7 ไบต์


4
Pew pew pew : D
AdmBorkBork

มันไม่มาก แต่ ... ฉันคิดว่าp-d-1in[-2,w]ช่วยประหยัดหนึ่งไบต์
Lynn

การเปลี่ยนคำสั่งเป็นd*=2*(1!=d-p>~w)-1บันทึกอีกสี่รายการ! ° v °
Lynn

@Lynn ใช้กฎของเดอมอร์แกนได้ดี!
orlp

คุณช่วยให้ช่วงเอาท์พุทกว้างเพื่อเปรียบเทียบกับของฉันได้ไหม thanx
Abr001am

3

Python 2, 99 ไบต์

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Python พอร์ตของ Agawa001 คำตอบที่ยอดเยี่ยม

รุ่นที่อ่านได้:

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]

@ Agawa001 ฉันยังไม่เข้าใจอัลกอริทึมของคุณ แต่ฉันได้ทำการตรวจสอบแล้วถึง 10 ล้านแล้ว
orlp

3

MATL, 31 , 25 ไบต์

BXHnQtHsy2/<w2\+~?2/Hfw)E

นี่เป็นเพียงอัลกอริทึมของ Agawa001 รุ่น MATL ยกเว้นจะรับอินพุตเป็นจำนวนเต็ม N และส่งคืนคำศัพท์ N-th ตามลำดับ มันเป็นเรื่องยากที่จะติดตามองค์ประกอบทั้งหมดในกอง! ฉันต้องใช้คลิปบอร์ดเพื่อหลีกเลี่ยงการเสียสติ คุณสามารถลองออนไลน์ได้!

สามารถทำเป็นลูปการพิมพ์คำศัพท์ N แรกโดยเพิ่ม:"@ก่อนรหัสและ]Dหลัง

ขอบคุณ Luis Mendo สำหรับการบันทึกทั้ง 6 ไบต์!


2

Julia 0.4, 4̷4̷ 42 ไบต์

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

ฟังก์ชันนี้ยอมรับเลขจำนวนเต็มเดียวในรูปแบบของรายการเลขฐานสองของมันเป็นอินพุต

อัลกอริทึมนั้นเทียบเท่ากับคำตอบของ @ Agawa001และคำตอบของฉันใน Jellyคำตอบของวุ้นของฉัน

ลองออนไลน์!

มันทำงานอย่างไร

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

สิ่งนี้จะล้มเหลวถ้าหากสิ่งใดสิ่งหนึ่งต่อไปนี้เป็นจริง:

  • k / 2เป็น non-integral float ดังนั้นInexactErrorจึงเพิ่มขึ้น

  • อาร์เรย์ดัชนีมีองค์ประกอบน้อยกว่าk / 2ดังนั้นBoundsErrorจึงเพิ่มขึ้น

ไม่ว่าในกรณีใดการเขียนทับkจะล้มเหลวดังนั้นค่าเดิมจะถูกส่งกลับ


1

JavaScript (ES6), 65 ไบต์

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

ยอมรับสตริงไบนารี ใช้การตรวจสอบการตีกลับจากคำตอบอื่น ๆ


1

Python 2, 74 ไบต์

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

ฟังก์ชันนี้ยอมรับเลขจำนวนเต็มเดียวในรูปแบบของรายการเลขฐานสองของมันเป็นอินพุต

อัลกอริทึมนั้นเทียบเท่ากับคำตอบของ @ Agawa001และคำตอบของฉันใน Jellyคำตอบของวุ้นของฉัน

ทดสอบบน IdeoneIdeone

มันทำงานอย่างไร

nextพยายามหาจำนวนเต็ม2iตัวแรกที่k==2*sum(x[:i])คืนค่าจริง เนื่องจากx[:i]มีองค์ประกอบiสิ่งนี้จะให้ดัชนีที่ใช้ 1 ของ(k / 2) th 1 1

nextจะล้มเหลวถ้าk / 2ไม่เป็นหนึ่งหรือถ้าxมีน้อยกว่าk / 2คน ในกรณีนี้ค่าเริ่มต้นkจะถูกส่งกลับ


0

> <> , 63 ไบต์

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

จากช่วงเวลาที่ฉันเห็นรูปแบบตัวอย่างในการท้าทายนี้ฉันรู้ภาษาที่ใช้ :)

ใช้Nเพื่อรับเทอมN

อินพุตที่สมมติว่าเป็นแบบไบนารีที่สแต็ก แทนที่จะขยับวอล์คเกอร์ไปรอบ ๆ โซลูชันนี้อาศัยการเคลื่อนย้ายเทปใต้วอล์คเกอร์เป็นส่วนใหญ่

ลองออนไลน์!

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