คำสั่งซื้อใหม่ # 2: Turn My Way


15

บทนำ(อาจถูกละเว้น)

การใส่ตัวเลขบวกทั้งหมดในลำดับปกติ (1, 2, 3, ... ) นั้นน่าเบื่อนิดหน่อยใช่ไหม? ดังนั้นนี่คือชุดของความท้าทายรอบพีชคณิต (reshuffelings) ของจำนวนบวกทั้งหมด นี่คือความท้าทายที่สองในชุดนี้ ความท้าทายแรกสามารถพบได้ที่นี่

ในความท้าทายนี้เราใช้รหัสสีเทาเพื่อจัดเรียงหมายเลขตามธรรมชาติ รหัสสีเทาหรือ "รหัสไบนารีที่สะท้อนกลับ" เป็นการเข้ารหัสแบบไบนารีในลักษณะที่ค่าต่อเนื่องสองค่าแตกต่างกันในหนึ่งบิตเท่านั้น การประยุกต์ใช้ในทางปฏิบัติของการเข้ารหัสนี้คือการใช้ในการเข้ารหัสโรตารี่จึงอ้างอิงของฉันไป"เปิดทาง"

Rotary Encoder สำหรับอุปกรณ์วัดมุมที่ทำเครื่องหมายไว้ในไบนารี 3 บิต

โปรดทราบว่าการเข้ารหัสนี้จะให้อิสระในระดับหนึ่ง ตัวอย่างเช่นต่อไปนี้ไบนารี 1100 มีสี่รหัสต่อไปนี้จะเป็นไปได้: 1101 1110 1000 และ 0100. นี่คือเหตุผลที่ฉันจะกำหนด( n )เป็นที่เล็กที่สุดค่าไม่ได้ใช้ก่อนหน้านี้ว่ามีความแตกต่างเพียงตัวละครตัวหนึ่งในการเข้ารหัสแบบไบนารี ลำดับนี้สอดคล้องกับA163252a(n)

ตั้งแต่นี้เป็น "ลำดับบริสุทธิ์" ความท้าทายของงานคือการส่งออก( n )สำหรับให้nเป็น input ที่( n )เป็นA163252a(n)na(n)

งาน

รับอินพุตจำนวนเต็มnส่งออกa(n)ในรูปแบบจำนวนเต็ม ( ไม่ใช่ในรูปแบบไบนารี)

a(n)ถูกกำหนดให้เป็นจำนวนเต็มบวกอย่างน้อยไม่ได้เกิดขึ้นก่อนหน้านี้ในลำดับดังกล่าวว่า ( n - 1 )และ ( n )ที่แตกต่างกันในเวลาเพียงหนึ่งบิตเขียนเมื่อไบนารีa(n1)a(n)

หมายเหตุ: การจัดทำดัชนีแบบ 1 จะถือว่าที่นี่; คุณอาจใช้การจัดทำดัชนีa(0)=1;a(1)=3ดังนั้นa ( 0 ) = 1 ; a ( 1 ) = 3ฯลฯ โปรดพูดถึงสิ่งนี้ในคำตอบของคุณหากคุณเลือกที่จะใช้

กรณีทดสอบ

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

กฎระเบียบ

  • อินพุตและเอาต์พุตเป็นจำนวนเต็ม (อย่างน้อยโปรแกรมของคุณควรสนับสนุนอินพุตและเอาต์พุตในช่วง 1 ถึง 32767)
  • อินพุตที่ไม่ถูกต้อง (0, ลอย, สตริง, ค่าลบ, ฯลฯ ) อาจนำไปสู่เอาต์พุตที่ไม่ได้คาดการณ์ไว้, ข้อผิดพลาดหรือ (un) พฤติกรรมที่กำหนดไว้ ในA163252 , a(0)ถูกกำหนดเป็น 0 สำหรับความท้าทายนี้เราจะไม่สนใจสิ่งนี้
  • ใช้กฎ I / Oเริ่มต้น
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

หมายเหตุสุดท้าย

ดูคำถาม PP&CG ที่เกี่ยวข้อง (แต่ไม่เท่ากัน) ต่อไปนี้:

คำตอบ:


1

Stax , 19 17 ไบต์

êÑ{╚α8è╙mc┼σ▀»É▲ü

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

มันหยุดทำงานในบางจุดหลังจากโดเมนที่ระบุเนื่องจากการวนซ้ำของดัชนี hardcoded (32767)

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

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

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


คุณเหลือ 1 ไบต์หลังคำตอบที่สั้นที่สุดของ 05AB1E คุณวางแผนที่จะปรับให้เหมาะสมต่อไปหรือไม่? มิฉะนั้นผมจะยอมรับคำตอบของเควิน ...
agtoever

1
หากฉันมีโอกาสฉันจะทำงานกับมันวันนี้บางครั้งในอีก 14 ชั่วโมงข้างหน้า
เรียกซ้ำ

Allright ฉันจะให้มันเปิดอีกวัน โชคดี!
agtoever

@agtoever: ขอบคุณ ฉันเสร็จแล้ว
เรียกซ้ำ

ทำได้ดี! คุณชนะ! ขอแสดงความยินดี!
agtoever

4

JavaScript (ES6), 65 ไบต์

1 การจัดทำดัชนี

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

ลองออนไลน์!

แสดงความคิดเห็น

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

บน TIO ฉันได้รับสแต็กมากเกินสำหรับ n> ~ 1024 ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีจัดการกับสิ่งนั้นในสภาพแวดล้อมอื่นของ Abu กฎ: " โปรแกรมของคุณควรรองรับอินพุตและเอาท์พุตอย่างน้อย 1 ถึงทีโอที 32767 "
ตลอดไป

1
@ ไม่ว่าฉันจะอัปเดตเป็นเวอร์ชันที่ไม่เรียกซ้ำ
Arnauld

4

เจลลี่ , 26 20 ไบต์

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

ลองออนไลน์!

โปรแกรมเต็มรูปแบบที่รับ n เป็นอาร์กิวเมนต์เดี่ยว ใช้งานได้กับทุกกรณีทดสอบ นอกจากนี้โปรดทราบว่าแม้ว่าไม่จำเป็นต้องใช้มันจะจัดการ n = 0

คำอธิบาย

ลิงค์ผู้ช่วยเหลือ: ค้นหาคำถัดไปและเสริม

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

ลิงค์หลัก

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

Java (JDK) , 142 138 124 123 132 130 98 ไบต์

  • เพิ่มขึ้นเป็นบัญชีสำหรับการนำเข้าบันทึกเป็นไบต์ด้วย@ kevin-cruijssen
  • เปลี่ยนคอลเล็กชันเป็น int array ด้วย@ olivier-grégoire
n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

ลองออนไลน์!


1
ฉันกลัวการนำเข้าจะต้องรวมอยู่ในการนับไบต์ คุณสามารถ แต่กอล์ฟimport java.util.*;+ ไปSet s=new HashSet(); นอกจากนี้ส่วนที่เหลือสามารถแข็งแรงเล่นกอล์ฟไปที่:var s=new java.util.HashSet(); Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;คำตอบที่ดีอย่างไรก็ตาม +1 จากฉัน :)
Kevin Cruijssen

1
ที่บันทึกไว้อีก 2 ไบต์ใช้มากกว่าStack HashSetช้ามาก แต่ใช้งานได้!
Daniel Widdis

1
O(n)O(nn)

2
คุณยังสามารถตีกอล์ฟได้ถึง126 ไบต์ด้วยสนามกอล์ฟที่สองที่ฉันแนะนำในความคิดเห็นแรกของฉัน :)
Kevin Cruijssen

2
98 ไบต์
Olivier Grégoire

2

Python 2 , 81 ไบต์

การจัดทำดัชนีแบบ 1

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

ลองออนไลน์!


Python 2 , 79 ไบต์

ใช้เวลานาน (9999 ยังไม่เสร็จสิ้นหลังจากใช้งานในเครื่องเป็นเวลา 7 นาที)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

ลองออนไลน์!


1
ไม่รองรับอินพุตสูงสุด 32767 (ความลึกของการเรียกซ้ำเริ่มต้นไม่ได้ขึ้นอยู่กับระบบ)
Erik the Outgolfer

แม้แต่กรณีทดสอบที่ระบุ 9999 ก็ยังไม่รองรับ :)
Daniel Widdis

@EriktheOutgolfer เปลี่ยนเป็นวิธีการทำซ้ำอาจจะยังไม่เสร็จในเวลาที่ TIO แต่ทำงานในท้องถิ่นได้ดี
OVS

@ovs โอ้การหมดเวลาอย่างเดียวไม่สำคัญ
Erik the Outgolfer

เย็น! ฉันเพิ่งลองใช้สำหรับ n = 9999 และเสร็จสมบูรณ์หลังจากผ่านไปประมาณหนึ่งชั่วโมง +1 เย้! ;-)
agtoever



1

ถ่าน , 65 ไบต์

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁰θ

เริ่มต้นผลลัพธ์เป็น 0

FN«

วนnครั้ง

⊞υθ

บันทึกผลลัพธ์ก่อนหน้าเพื่อไม่ให้ใช้อีก

≔¹ηW¬‹θ⊗η≦⊗η

ค้นหาบิตสูงสุดในผลลัพธ์ก่อนหน้า

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

ในขณะที่บิตนั้นมากกว่า 1 ถ้าบิตถูกตั้งค่าในผลลัพธ์ก่อนหน้าให้ลองลบบิตนั้นเพื่อดูว่าผลลัพธ์นั้นเป็นผลลัพธ์ที่มองไม่เห็นหรือไม่ สิ่งนี้ทำให้มั่นใจได้ว่าผลลัพธ์ที่เป็นไปได้นั้นจะถูกลองในลำดับของค่าที่สูงขึ้น

W№υ⁻|θη&θη≦⊗η

ตอนนี้ลอง XORing บิตนั้นพร้อมกับผลลัพธ์ก่อนหน้าเพิ่มบิตอีกสองเท่าจนกระทั่งพบผลลัพธ์ที่มองไม่เห็น สิ่งนี้จะจัดการกับกรณีที่จำเป็นต้องตั้งค่าบิตอีกครั้งตามลำดับจากน้อยไปหามาก แต่ในกรณีที่บิตที่มีนัยสำคัญน้อยที่สุดจำเป็นต้องสลับซึ่งลูปก่อนหน้านี้ไม่ต้องทดสอบ (เพราะนักกอล์ฟจะทดสอบ ที่นี่) หากลูปก่อนหน้านี้พบผลลัพธ์ที่มองไม่เห็นลูปนี้จะไม่ทำงาน หากไม่เป็นเช่นนั้นการวนซ้ำนี้จะเป็นการทดสอบผลลัพธ์เหล่านั้นซ้ำ ๆ

≔⁻|θη&θηθ

อัปเดตผลลัพธ์ด้วย XORing bit ด้วยจริง

»Iθ

เอาท์พุทผลลัพธ์สุดท้ายที่ส่วนท้ายของลูป


1

05AB1E , 21 20 18 ไบต์

ÎFˆ∞.Δ¯θy^bSO¯yå_*

ค่อนข้างไม่มีประสิทธิภาพดังนั้นยิ่งอินพุตยิ่งใช้เวลานานก็ยิ่งได้ผลลัพธ์มากขึ้นเท่านั้น ทำงานเพื่อป้อนข้อมูล0เช่นกัน

ลองออนไลน์หรือตรวจสอบก่อนnเงื่อนไข

คำอธิบาย:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

Haskell , 101 ไบต์

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

ลองออนไลน์!

ดูเหมือนว่าเป็นเรื่องน่าละอายที่จะมีการนำเข้าเพียงเพื่อxorแต่ฉันยังไม่พบวิธีแก้ไขที่ดี ฉันยังสงสัยว่ามีวิธีที่ดีกว่าในการแสดงวง


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