토글, 인쇄, 반복 명령을 저장할 수

이 과제는 구현되지 않은 esolang Pada 에서 느슨하게 영감을 얻었습니다 .

모두 0으로 초기화 된 8 비트 배열을 고려하십시오. 임의의 문자열을 인쇄하기위한 매우 최소한의 명령어 세트를 소개합니다 두 가지 명령이 있으며, 둘 다 N비트의 인덱스 인 매개 변수 를 사용합니다.

  • t N대한 t이 oggle :이 비트의 값을 변경합니다 N.
  • p N위한 P의 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 == '='

그러나 대신 순환 기능을 사용 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 (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다. 결과를 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 참조 구현 으로 생성되었습니다 .



답변

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.


답변

루비, 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으로 설정하고 문자를 반복합니다. 각 단계에서 현재 상태에서 문자를 인쇄 할 수있는 상태로 가장 짧은 경로를 사용합니다. 지정된 형식으로 문자열을 반환합니다.

이 프로그램의 초기 (골프가 적은) 버전은 여기에서 볼 수 있습니다 .


답변

CJam, 81 76 바이트

아직도 골프를 많이합니다.

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

온라인으로 사용해보십시오 .


답변