Beralih, Cetak, Ulangi

17

Tantangan ini secara longgar terinspirasi oleh esolang Pada yang tidak diterapkan .

Pertimbangkan array 8 bit, semua diinisialisasi ke nol. Kami akan memperkenalkan set instruksi yang sangat minimalis untuk mencetak string acak. Ada dua instruksi, keduanya mengambil parameter Nyang merupakan indeks bit:

  • t Nfor t oggle: Ini mengubah nilai bit N.
  • p Nfor p rint: Ini mengartikan semua 8 bit sebagai byte, mulai dari bit Ndan membungkus ujungnya . Karakter yang sesuai dengan byte ini dicetak ke STDOUT.

Mari kita lihat sebuah contoh. Kami ingin mencetak :=. Secara naif kami mencapai ini sebagai berikut (indeks bit berbasis 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 == '='

Tetapi sebaliknya, kita dapat menggunakan fitur siklik pdan menyimpan dua instruksi:

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

Jadi p 7cukup mulai membaca nilai byte dari bit terakhir, bukan yang pertama.

Tantangan

Diberikan string karakter ASCII yang tidak kosong yang dapat dicetak (0x20 hingga 0x7E, inklusif), menghasilkan daftar instruksi yang optimal (satu baris per instruksi) untuk mencetak string tersebut dengan sistem di atas. Jika ada beberapa solusi optimal (yang hampir selalu demikian), hasilkan hanya satu saja.

Anda dapat memilih antara pengindeksan berbasis-0 dan berbasis-1 untuk bit-bit tersebut, tetapi sebutkan pilihan Anda.

Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter fungsi (keluar). Jika Anda tidak mencetak hasilnya ke STDOUT, seharusnya masih berupa string yang dipisahkan baris baru.

Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.

Uji Kasus

Setiap test case adalah satu baris yang berisi string input, diikuti oleh jumlah instruksi optimal, diikuti oleh satu solusi yang memungkinkan.

Anda tidak boleh menampilkan jumlah instruksi dalam solusi Anda - ini hanya termasuk di sini sehingga Anda dapat memeriksa kebenaran kode Anda jika mencetak daftar instruksi yang berbeda.

?
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

Kasus uji dihasilkan dengan implementasi referensi CJam ini .

Martin Ender
sumber

Jawaban:

3

CJam, 67 byte

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

Cobalah online

Penjelasan:

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.
Reto Koradi
sumber
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}

Fungsi Ruby yang hanya dua kali lipat ukuran implementasi referensi. :)

Cobalah online: http://ideone.com/ysYyFP

Program ini sangat lurus: dimulai dengan 8 bit diatur ke 0 dan beralih melalui karakter. Pada setiap langkah, dibutuhkan rute terpendek dari kondisi saat ini ke keadaan yang memungkinkan pencetakan karakter. Ini mengembalikan string dalam format yang ditentukan.

Versi awal program (kurang golf) tersedia di sini .

Cristian Lupascu
sumber
4

CJam, 81 76 byte

Masih banyak bermain golf.

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

Cobalah online .

Andrea Biondo
sumber