순환 태그 시스템 시뮬레이션


14

순환 태그 시스템은 두 개의 기호 알파벳 (내가 사용하는 것이다 구성된 작은, 튜링 완전한 계산 모델 {0,1}의), 유한, 비어 있지 않은 순환 목록 제작 이 두 기호로 구성, 그리고 무제한의 단어 도 구성 그 두 상징.

각 단계에서 :

  • 단어 의 첫 번째 요소 가 제거됩니다
  • 이 있다면 0, 현재 생산 스킵이고
  • 그것이 1현재 생산 이라면 단어 의 끝에 추가됩니다 .
  • 다음 생산 이 활성화됩니다. 이것이 마지막 프로덕션 인 경우 첫 번째 프로덕션으로 돌아갑니다.

단어 가 비면 시스템이 정지 합니다 .

예 (위키 백과) :

Productions: (010, 000, 1111)
Initial word: 11001

Generation  Production   Word (before)            Word (after)
   0           010           11001             →     1001010       
   1           000            1001010          →      001010000
   2           1111            001010000       →       01010000
   3           010              01010000       →        1010000
   4           000               1010000       →         010000000
   5           1111               010000000    →          10000000
   6           010                 10000000    →           0000000010
   7           000                  0000000010 →            000000010
   8           1111                  000000010 →             00000010
   9           010                    00000010 →              0000010

작업을 수락하기로 선택한 경우 다음을 수행하는 프로그램 또는 기능을 작성해야합니다.

  • 제작물 목록
  • 초기 단어
  • 세대,

그 세대에 단어 를 인쇄하거나 반환합니다 .

예를 들어

cyclic_tag(
      prod=[[0,1,0],[0,0,0],[1,1,1,1]], 
      word=[1,1,0,0,1], 
      gen=4) => [1,0,1,0,0,0,0]

구현 세부 사항 :

  • 알파벳은 중요하지 않습니다. 당신은 사용할 수 있습니다 01, TrueFalse, TNIL,AB, 심지어 10, 또는 어떤 다른 당신은 당신이 일치으로, 가지고 올 수 있습니다. 모든 입력과 출력은 같은 알파벳을 사용해야합니다, 당신은 당신이 사용하고있는 표시해야 0무엇을하고 1.

  • 단어 의 길이는 이론적으로 제한이 없어야합니다. 즉, 최대 단어 길이를 하드 코딩 할 수 없습니다. 메모리가 무한한 이상적인 컴퓨터에서 프로그램을 실행하면 이론적으로 프로그램에서 사용할 수 있어야합니다. (인터프리터 / 컴파일러의 한계를 무시할 수 있습니다.)

  • 주어진 세대에 도달하기 전에 주어진 시스템이 정지하면 빈 단어를 반환하거나 인쇄해야합니다.

  • 빈 프로덕션이 존재하며이를 처리 할 수 ​​있어야합니다. 전체 프로그램을 작성하는 경우 I / O도 처리 할 수 ​​있어야합니다.

편집 : 나는 원래 생성 0을 입력 단어 자체로 만들고 생성 1을 첫 단계의 결과로 만들었습니다. 즉, 나는 당신이 이전 열 을 반환하도록 의도했습니다 . 그러나이 내용을 충분히 명확하게 밝히지 않았으므로 두 가지 옵션을 모두 사용할 것입니다 . 각 세대마다 before 또는 after 열에 값을 반환 할 수 있습니다 . 당신은 당신이를 따르고 있는지 명시해야 열을 .또한 어떤 열을 선택해야하는지 일관성이 있어야합니다.

지금부터 일주일에 가장 작은 코드를 수여합니다 (2014 년 10 월 27 일).


음, 예제의 결과가 정확합니까? 당신이 준 다른 예를 바탕으로, 나는 그 세대 5 ... 생각
FryAmTheEggman

입력을 다른 순서로 가져올 수 있습니까?
Martin Ender

1
@FryAmTheEggman : 맞습니다. '전'열을 의미했습니다. 더 많은 사람들이이 실수를했다면, 나는 어느 쪽을 받아들이도록 나의 질문을 바꿀 것이다. 나는 내가 명확하지 않다는 것을 인정한다.
marinus

@ MartinBüttner : 주문을 지정하는 한 중요하지 않습니다.
marinus

답변:


4

GolfScript (입력 형식 및 허용되는 출력 형식에 따라 17-19 바이트)

18 바이트 :

~.@*<{\1,or(@*+}/`

형식으로 입력을 받아서 형식으로 [1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 4출력합니다 [1 0 1 0 0 0 0]. ( 17 바이트 일 수 있음)` 출력 1010000이 허용되는 경우 마지막 이 없는 ).

온라인 데모

19 바이트 :

~.@*<{\0`or(1&@*+}/

형태로 입력을받습니다 "11001" ["010" "000" "1111"] 4 받습니다.

온라인 데모

해부

~        # Evaluate input: stack: word productions gen
.@*<     # Produce a list of the right number of productions with suitable repetition
{        # For each of those productions:
  \      #   Bring the word to the top
  0`or   #   Ensure that we don't get an error if the word is empty
  (1&    #   Pop the first char from the word and evaluate it
  @*     #   Repeat the production that many times
  +      #   Concatenate 0 or 1 copies of the production to the rest of the word
}/       # Endforeach

반복 및 잘림으로 프로덕션 목록을 생성한다는 아이디어 로 Martin BüttnerCJam 솔루션감사드립니다 .


당신은 당신이 인용하는 CJam 솔루션에 묶여 있으므로 그 답을 선택했습니다. 다른 바이트를 깎으면 다시 생각할 것이다 :)
marinus

@ marinus, 내 대답의 텍스트에서 참조하는 17 바이트 버전을 허용합니까?
피터 테일러

그것을 보지 못했지만 유효 해 보입니다. 좀 더 명확하게 표시해야합니다.
marinus

5

하스켈, 55 53 51

(t:w)%p|t=w++p|0<1=w
x%_=x
e w=(!!).scanl(%)w.cycle

이것은 Trueas 1Falseas를 사용합니다 0. 예제 실행 :

*Main> let t=True ; f=False
*Main> e [t,f,t] [[f,f,f],[t,t,t]] 4
[False,False,False,False,False]

3

CJam, 31 30 28 27 24 18 바이트

{_@*<{\_0a?(@*+}/}

이것은 블록 (펑션에 가장 가까운 것)을 정의합니다. 입력은 다음과 같이 스택에 상주합니다.

[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 9

비슷하게 배열을 남길 것입니다. 01 스택에 s 및 s .

여기에서 테스트하십시오. 입력 한 줄에 첫 번째 줄을 붙여넣고 세 번째 줄에 코드를 붙여 넣고~ 실제로 블록을 평가하려면 를 . 예 :

[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 9
{_@*<{\_0a?(@*+}/}~

출력이 입력과 같은 형식 일 필요가없는 경우

설명:

_@*<{\_0a?(@*+}/
_@               "Duplicate the generation and pull the productions to the top.";
  *<             "Repeat the productions N times and take the first N elements.";
    {         }/ "For each element in that list, run this block.";
     \           "Swap production and current word W.";
      _0a?       "W = (W != []) ? W : [0]. This is to ensure we can unshift an element.";
          (      "Unshift the first 0 or 1 from the word.";
           @     "Rotate the stack, pulling the production to the top.";
            *    "Repeat it 0 or 1 times.";
             +   "Append to the word.";

단어의 최종 상태는 스택에 남아 있습니다.

다시 방문해 주신 Peter Taylor에게 감사드립니다.


1
l~{_,g{('1=@(:Pa+@@P*+}*}*\;28, 여전히 개선의 여지가 (:P있지만 (특히 부분), 점심 시간
Optimizer

@Optimizer 아, 좋은 생각이야. 감사합니다. 그리고 그래, :P나도 짜증나 : D
Martin Ender

l~{_,g{(si@(:Pa+@@P*+}*}*\;: 27 그리고 그것을 :P
Optimizer

_,g_!!그러나 동일한 바이트 로 교체 할 수 있습니다 .
Optimizer

@Optimizer 그때도 잘 사용할 것 _{...}{}?입니다.
Martin Ender

2

Mathematica, 84 80 77 자

f[_,w_,_]=w;f[p_,{x_,y___},n_/;n>0]:=f[RotateLeft@p,Flatten@{y,p~Take~x},n-1]

예:

f[{{0, 1, 0}, {0, 0, 0}, {1, 1, 1, 1}}, {1, 1, 0, 0, 1}, 4]

{1, 0, 1, 0, 0, 0, 0}


2

피스 22

세 개의 인수가 모두 별도의 입력으로 필요합니다.

#Vvw=z+tz*@Q%NlQshz)zq

다음과 같은 인수를 취합니다.

11001
["010","000","1111"]
4

설명:

                        : Implicit: z = input(); Q=eval(input())
#                       : Loop until an exception is thrown
 Vvw               )    : for N in range(eval(input()))
    =z                  : assign to z
      +tz               : the sum of the tail of z and
         *@Q%NlQ        : Q[N%len(Q)] times
                shz     : the numeric value of the first character in z
                    zq  : print z then throw exception

파이썬 2-61 67 91105124

c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w

예쁜 조 기본 답변. 빈 생산이 있다고 가정[[]] .

오전 2시에 골프를 치는 것은 좋지 않은 결정임을 지적한 @xnor에게 감사합니다.

@xnor에게 감사의 말을 전합니다. 저는이 점수의 50 %를 지불해야합니다.

견본:

>>> c([[0,1,0],[0,0,0],[1,1,1,1]],[1,1,0,0,1],4)
[1, 0, 1, 0, 0, 0, 0]

1
람다를 사용하고 작성하는 것이 더 짧 g and w습니다 x. 또한 g*w둘 다 g0이 아니고 w비어 있지 않을 때 진실한 가치를 부여해야 한다고 생각 합니다 .
xnor

또한 내부를 이해하지 못합니다 if x else w. x이 코드는 run 만 실행되기 때문에 항상 사실 이 아니 if x거나 뭔가 빠졌습니까?
xnor

@xnor 확실히, 당신은 전적으로 정확합니다 :)
FryAmTheEggman

1
일부 더와 골프 and/ or트릭 및 회전 p대신 증가의 n:c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w
XNOR

@xnor 감사합니다 :) 또한, 지금 당신이 3 개 변수의 함수를 한 것으로, 나는 ... 나는 Pyth로 번역 생각
FryAmTheEggman

1

자바 스크립트 ES6-88 바이트

f=(p,w,g,n)=>g?w.replace(/(.)(.*)/,(_,a,b)=>f(p,a*1?b+p[(n=n||0)%p.length]:b,g-1,n+1)):w

브라우저에서 팝업 된 Fry의 답변과 매우 유사합니다. (복사 금지, 엄숙히 맹세합니다)

그러나 내가 문자열 / 정규식 경로를 갔을 때 그가 배열 경로를 갔다는 것처럼 보입니다.

넓히는:

f = (p,w,g,n) =>
    g ?
        w.replace( /(.)(.*)/, (_,a,b) =>
            f( p, a*1 ? b + p[(n=n||0)%p.length] : b, g-1, n+1 )
        )
    :
        w

샘플 출력

f(['010','000','1111'],'11001',4)
"1010000"

이제 골프 언어가 들어오고 우리 모두를 학살하는 것을 지켜보십시오. :디


두 예제에 대해 다른 답변을 얻었으므로 실제로 게시물을 삭제했습니다. 그가 세대마다가는 예를 시험해 보셨습니까? 그가 준 전체 통화 예와 비교하면 하나가 떨어져있는 것 같습니다 ...
FryAmTheEggman

그리고하지 걱정을하지, 난 당신이 나를 복사하지 않았다 생각 : P
FryAmTheEggman

@FryAmTheEggman : 광산은 번호가 지정된 세대에 대해 "이전"열을 일관되게 생성합니다. 이것은 OP의 예와 일치하며, "0 세대"는 입력을 처리하지 않고 단순히 입력을 반환하는 것이 논리적으로 보이며 이는이 해석과 일치합니다. 덧붙여서, 나는 해결책이 어떤면에서 엄청나게 유사했기 때문에 "복사"면책 조항을 추가했습니다. 동일한 인수 이름과 동일한 기본 재귀 구조를 사용했으며 동일한 팬텀 네 번째 인수 인을 추가했습니다 n. 좋은 마음? : D
COTO

좋아, 우리 둘 중 하나라도 틀렸다면, 우리 둘 다 틀렸다! 유나이티드
FryAmTheEggman

@FryAmTheEggman : 당신은 Peppe 씨에 대해 틀리지 않았습니다. ;)
COTO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.