Chuyển đổi, in, lặp lại


17

Thử thách này được lấy cảm hứng lỏng lẻo từ Pada esolang chưa thực hiện .

Hãy xem xét một mảng 8 bit, tất cả được khởi tạo về 0. Chúng tôi sẽ giới thiệu một tập lệnh rất tối giản để in các chuỗi tùy ý. Có hai hướng dẫn, cả hai đều lấy tham số Nlà chỉ số của một bit:

  • t Nfor t oggle: Điều này thay đổi giá trị của bit N.
  • p Ncho p rint: Điều này diễn giải tất cả 8 bit dưới dạng một byte, bắt đầu từ bit Nvà quấn quanh cuối . Ký tự tương ứng với byte này được in thành STDOUT.

Hãy xem một ví dụ. Chúng tôi muốn in :=. Chắc chắn chúng tôi đạt được điều này như sau (chỉ số bit dựa trên 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 == '='

Nhưng thay vào đó, chúng ta có thể sử dụng tính năng tuần hoàn pvà lưu hai hướng dẫn:

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 == '='
                      ^

Vì vậy, p 7chỉ cần bắt đầu đọc giá trị byte từ bit cuối cùng thay vì đầu tiên.

Các thách thức

Đưa ra một chuỗi các ký tự ASCII có thể in trống (0x20 đến 0x7E, đã bao gồm), tạo một danh sách hướng dẫn tối ưu (một dòng trên mỗi lệnh) để in chuỗi đó với hệ thống trên. Nếu có nhiều giải pháp tối ưu (hầu như sẽ luôn luôn như vậy), chỉ tạo một trong số đó.

Bạn có thể chọn giữa lập chỉ mục dựa trên 0 và 1 dựa trên các bit, nhưng vui lòng cho biết lựa chọn của bạn.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out). Nếu bạn không in kết quả sang STDOUT, thì nó vẫn chỉ là một chuỗi được phân tách bằng dòng mới.

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Các trường hợp thử nghiệm

Mỗi trường hợp thử nghiệm là một dòng duy nhất chứa chuỗi đầu vào, theo sau là số lượng hướng dẫn tối ưu, theo sau là một giải pháp có thể.

Bạn không nên xuất số lệnh trong giải pháp của mình - điều này chỉ được bao gồm ở đây để bạn có thể kiểm tra tính chính xác của mã nếu nó in một danh sách hướng dẫn khác.

?
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

Các trường hợp thử nghiệm đã được tạo ra với việc thực hiện tham chiếu CJam này .

Câu trả lời:


3

CJam, 67 byte

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

Dùng thử trực tuyến

Giải trình:

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

Ruby, 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}

Hàm Ruby chỉ tăng gấp đôi kích thước của việc triển khai tham chiếu. :)

Dùng thử trực tuyến: http://ideone.com/ysYyFP

Chương trình này khá căng thẳng: nó bắt đầu với 8 bit được đặt thành 0 và lặp qua các ký tự. Ở mỗi bước, nó đi theo con đường ngắn nhất từ ​​trạng thái hiện tại đến trạng thái cho phép in ký tự. Nó trả về một chuỗi trong định dạng đã chỉ định.

Phiên bản ban đầu (ít chơi gôn) của chương trình có sẵn tại đây .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.