สลับ, พิมพ์, ทำซ้ำ


17

ความท้าทายนี้ได้รับแรงบันดาลใจอย่างหลวม ๆ จาก Esolang Pada ที่ยังไม่ได้ใช้งาน

พิจารณาอาร์เรย์จำนวน 8 บิตซึ่งเริ่มต้นเป็นศูนย์ทั้งหมด เราจะแนะนำชุดคำสั่งแบบมินิมัลลิสต์เพื่อพิมพ์สตริงเอง มีสองคำแนะนำซึ่งทั้งคู่ใช้พารามิเตอร์Nซึ่งเป็นดัชนีของบิต:

  • t Nสำหรับเสื้อ oggle: Nนี้เปลี่ยนค่าของบิต
  • p Nสำหรับพี rint: ตำทั้งหมดนี้เป็น 8 บิตไบต์เริ่มต้นจากบิตNและการตัดรอบท้าย อักขระที่สอดคล้องกับไบต์นี้ถูกพิมพ์ไปยัง STDOUT

ลองดูตัวอย่าง :=เราต้องการที่จะพิมพ์ เราทำสิ่งนี้ได้อย่างไร้เดียงสาดังนี้ (ดัชนีบิต 0):

t 2    [0 0 1 0 0 0 0 0]
t 3    [0 0 1 1 0 0 0 0]
t 4    [0 0 1 1 1 0 0 0]
t 6    [0 0 1 1 1 0 1 0]
p 0    [0 0 1 1 1 0 1 0] == 58 == ':'
t 5    [0 0 1 1 1 1 1 0]
t 6    [0 0 1 1 1 1 0 0]
t 7    [0 0 1 1 1 1 0 1]
p 0    [0 0 1 1 1 1 0 1] == 61 == '='

แต่เราสามารถใช้คุณสมบัติ cyclic pและบันทึกสองคำแนะนำแทน:

t 2    [0 0 1 0 0 0 0 0]
t 3    [0 0 1 1 0 0 0 0]
t 4    [0 0 1 1 1 0 0 0]
t 6    [0 0 1 1 1 0 1 0]
p 0    [0 0 1 1 1 0 1 0] == 58 == ':'
t 1    [0 1 1 1 1 0 1 0]
p 7    [0 1 1 1 1 0 1 0] == [0 0 1 1 1 1 0 1] == 61 == '='
                      ^

ดังนั้นp 7เพียงแค่เริ่มอ่านค่าไบต์จากบิตสุดท้ายแทนที่จะเป็นบิตแรก

ความท้าทาย

รับสตริงอักขระ ASCII ที่ไม่ว่างเปล่าที่พิมพ์ได้ (0x20 ถึง 0x7E, รวม) สร้างรายการคำสั่งที่เหมาะสม (หนึ่งบรรทัดต่อหนึ่งคำสั่ง) เพื่อพิมพ์สตริงนั้นด้วยระบบข้างต้น หากมีการแก้ปัญหาที่ดีที่สุดหลายอย่าง (ซึ่งมักจะเป็นกรณี) สร้างเพียงหนึ่งในนั้น

คุณอาจเลือกระหว่างการจัดทำดัชนีแบบ 0 และแบบ 1 สำหรับบิต แต่โปรดระบุตัวเลือกของคุณ

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

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

แต่ละกรณีทดสอบเป็นบรรทัดเดียวที่มีสตริงป้อนข้อมูลตามด้วยจำนวนคำสั่งที่เหมาะสมตามด้วยโซลูชันที่เป็นไปได้หนึ่งข้อ

คุณไม่ควรส่งออกจำนวนการเรียนการสอนในการแก้ปัญหาของคุณ - นี้จะรวมอยู่ที่นี่เท่านั้นเพื่อให้คุณสามารถตรวจสอบความถูกต้องของรหัสของคุณถ้ามันพิมพ์รายการคำแนะนำที่แตกต่างกัน

?
7 instructions
t 2
t 3
t 4
t 5
t 6
t 7
p 0

:=
7 instructions
t 2
t 3
t 4
t 6
p 0
t 1
p 7

0123456789
26 instructions
t 2
t 3
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 2
t 3
p 3
t 2
p 3

9876543210
28 instructions
t 2
t 3
t 4
t 7
p 0
t 7
p 0
t 0
t 7
p 5
t 4
p 5
t 0
t 5
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0

Hello, World!
39 instructions
t 1
t 4
p 0
t 3
t 7
p 2
t 1
t 6
p 2
p 2
t 0
t 1
p 2
t 0
t 1
t 3
p 2
t 6
t 7
p 2
t 0
t 2
t 6
t 7
p 1
t 0
t 1
t 5
p 0
t 2
t 7
p 3
t 2
t 6
p 0
t 4
p 0
t 1
p 3

The quick brown fox jumps over the lazy dog.
150 instructions
t 1
t 3
t 5
p 0
t 1
t 2
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 3
t 7
p 0
t 5
p 0
t 3
t 4
t 5
p 0
t 4
t 6
p 0
t 4
p 0
t 1
t 4
t 6
t 7
p 0
t 1
t 6
p 0
t 3
p 0
t 0
t 5
p 4
t 0
t 7
p 0
t 1
p 1
t 3
t 5
t 6
t 7
p 0
t 1
t 5
t 6
p 0
t 4
t 7
p 0
t 1
t 2
p 3
t 5
t 6
t 7
p 2
t 1
t 2
t 6
p 0
t 0
p 7
t 0
t 7
p 5
t 3
t 4
t 6
t 7
p 0
t 6
t 7
p 0
t 1
t 3
t 6
t 7
p 0
t 1
t 4
t 5
t 6
t 7
p 0
t 4
p 4
t 6
p 0
t 1
t 6
p 4
t 5
t 6
t 7
p 0
t 1
t 3
t 5
p 0
t 1
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 4
t 5
p 0
t 1
p 3
t 3
t 7
p 1
t 1
t 5
p 0
t 1
t 3
t 4
t 7
p 0
t 1
t 5
p 0
t 4
t 6
t 7
p 0
t 4
p 0
t 1
t 4
t 7
p 0

กรณีทดสอบถูกสร้างขึ้นด้วยการใช้งานอ้างอิง CJamนี้

คำตอบ:


3

CJam, 67 ไบต์

U]8*l{i2b8Ue[8,{1$m>2$.^:+}$0=_@m>@1$.^ee{~{"t "op}{;}?}/"p "o\p}/;

ลองออนไลน์

คำอธิบาย:

U]8*    Build start bit array [0 0 0 0 0 0 0 0].
l       Get input.
{       Start loop over input characters.
  i       Convert character to integer.
  2b      Convert to binary array.
  8Ue[    Pad to 8 entries with leading 0.
  8,      Generate list of possible rotation amounts.
  {       Start of sort function block.
    1$      Get bit array of character.
    m>      Rotate by rotation amount.
    2$      Get previous bit array.
    .^      Element-wise xor to get different bits.
    :+      Add elements in result to get count of different bits.
  }$      Sort possible rotations by count of different bits.
  0=      Get first rotation amount in sorted list, which is the one with the
          one that results in the smallest count of different bits.
  _       Copy count. Will use original for "p" output later.
  @       Get the character bit array to top of stack.
  m>      Rotate it, to get optimal rotated bit array.
  @       Get previous bit array to top of stack.
  1$      Copy rotated bit array, will need the original as starting point
          for next character.
  .^      Element-wise xor to get different bits.
  ee      Enumerate array to get pairs of index and bit value.
  {       Loop over bits.
    ~       Unpack index bit pair.
    {       Start of if block for bit value.
      "t "o   Output "t ".
      p  Output index and newline.
    }       End of if block.
    {       Start of else block.
      ;       Pop the index value.
    }?      End of ternary if.
  }/      End loop over bits.
  "p "o   Output "p ".
  \       Swap rotation amount to top.
  p       Print rotation amount and newline.
}/      End loop over input characters.
;       Ppp current bit array off stack to prevent extra output.

5

ทับทิม, 171

->w{s=[0]*8
w.chars.flat_map{|c|z=0..7
*m,i=z.map{|j|z.select{|k|s[k]!=z.map{|i|c.ord[i]}.rotate(j)[k]}<<j}.min_by &:size
m.map{|m|s[m]=1-s[m];"t #{7-m}"}+["p #{i}"]}*?\n}

ฟังก์ชัน Ruby ที่มีขนาดเป็นสองเท่าของการใช้งานอ้างอิง :)

ลองใช้งานออนไลน์: http://ideone.com/ysYyFP

โปรแกรมค่อนข้างตรงไปตรงมา: มันเริ่มต้นด้วย 8 บิตตั้งค่าเป็น 0 และวนซ้ำผ่านตัวละคร ในแต่ละขั้นตอนจะใช้เส้นทางที่สั้นที่สุดจากสถานะปัจจุบันไปยังสถานะที่จะอนุญาตให้พิมพ์อักขระ มันจะส่งกลับสตริงในรูปแบบที่ระบุ

เริ่มต้น (แข็งแรงเล่นกอล์ฟน้อย) รุ่นของโปรแกรมที่มีอยู่ที่นี่


4

CJam, 81 76 ไบต์

ยังคงเล่นกอล์ฟอยู่

0]8*q{i2b8Te[8,\fm>:X\_@\f.=::+_$W=#:YX=_@.{=M['tSUN]?U):U;}o0:U;['pSYN]o}/;

ลองมันออนไลน์

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