클라인 토 폴로 글 로트


43

클라인 은 내가 디자인 한 2D 언어로 12 개의 다른 지형 표면에 내장 될 수 있습니다. 명령 행 인수를 변경하여 Klein 프로그램을 다른 표면에서 실행할 수 있습니다.

토폴로지는 명령 포인터가 프로그램 가장자리에서 벗어날 때 명령 포인터의 위치를 ​​결정합니다. 가장자리에서 벗어나면 ip는 일치하는 색상의 가장자리로 점프하고 화살표에 상대적인 위치를 유지합니다. 즉, 포인터는 화살표 머리와의 거리를 유지합니다.

예를 들어 000대부분의 2D 언어에서 사용되는 토폴로지 인 토폴로지는 가장자리에서 벗어날 경우 명령 포인터가 다른 쪽을 감싸도록합니다.

태스크

이 작업은 매우 간단합니다. Klein 프로그램을 작성하면 실행시 실행되는 토폴로지가 출력됩니다. 개별 숫자는 공백으로 구분 될 수 있습니다. (예 0000 0 0모두 허용 출력된다). -A명령 행 플래그 를 사용하거나 무시하도록 선택할 수 있습니다. 명령 행 플래그를 사용하면 비용이 들지 않습니다.

이것은 이므로 가장 짧은 답변이 승자가 될 것입니다.

다음 은 모든 토폴로지를 한 번에 테스트하는 데 사용할 수있는 온라인 테스트 드라이버입니다. 정수 모드에서 실행하려면을 제거하십시오 -A.


18
언어 별 과제에 대한 좋은 예를 보려면 +1하십시오. :)
Martin Ender

1
@StephenS 아니오. 무료로 드릴 것입니다 :)
밀 마법사

1
IP 움직임으로
인해

2
이미지를 수정하십시오 ...
user202729

1
@ JoKing 나는 오랫동안 알고 있었고 그것을 고칠 의미가있었습니다. 나는 현재 이미지를 제거했으며 결국 새로운 이미지를 만드는 데 시간이 걸릴 것입니다. 감사.
밀 마법사

답변:


35

52 48 바이트

./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@

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

테스트 드라이버

설명

클라인에서 IP는 왼쪽 상단에서 오른쪽으로 시작합니다. 프로그램에서 원했던 첫 번째 단계는 첫 번째와 세 번째 비트를 결정하기 위해 프로그램 상단에서 IP를 전송하는 것입니다. IP는 토폴로지에 따라 다음과 같이 프로그램을 다시 입력합니다.

             ^
            I|P
            ./.....
201, 211 -->.......<-- 100, 110
            .......
            .......
            .......
200, 210 -->.......<-- 101, 111
            .......
             ^   ^
             |   |
            000 001
            010 011

내 프로그램이 두 번째 비트 전에 토폴로지의 세 번째 비트를 기록하지만 $끝 전에 이를 사용하여 교환 하기로 결정했습니다. 이를 위해 위에서 설명한 IP 진입 점에서 각 토폴로지의 첫 번째 및 세 번째 비트를 푸시하는 코드를 추가했습니다.

./.....
21...01
.......
.......
.......
20...11
.0...0.

다음으로 1또는 2첫 비트로 또는 토폴로지로 토폴로지에 중점을 두었습니다 . 나는 그것들을 재결합하고 북쪽에 연결되지 않은쪽에 보내 두 번째 비트를 결정할 수 있도록 결정했습니다.

                      ./.....
                      21\./01
                      ..>....--> 200, 201, 210, 211
                      .......
100, 101, 110, 111 <--....<..
                      20/.\11
                      .0...0.
                        ^ ^
                        | |
                        / \
                      110 100
                      111 101
                      210 200
                      211 201

편리하게 이것은 두 번째 비트로 토폴로지를 다시 그룹화하여 스택으로 푸시 할 수있었습니다.

./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.

그 후 나는 두 번째와 세 번째 비트를 교환하고 프로그램을 종료해야했습니다.

./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.

이제 첫 비트 가 1있거나 2첫 번째로 작동 한 토폴로지가 0올바르게 출력 되도록 토폴로지를 만드는 데 집중할 수있었습니다 . 첫 번째 단계는 두 번째 비트를 기반으로 두 그룹으로 분리 될 수 있도록 이들을 재결합하는 것입니다.

                      ./.$...
                      21\./01
                      ..>....<-- 010, 011
                      @......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
                      20//\11
                      .01$00.

먼저 1두 번째 비트로 이러한 토폴로지에 중점을 두었습니다 . IP는 토폴로지에서 이미 2첫 번째 비트로 사용 된 회선에 있었기 때문에 문제가되었습니다 . 해당 줄에 둘 이상의 명령을 맞추기가 까다로울 수 있으므로 (명령을 사용하여 단일 명령을 건너 뛸 수 있음 !) 전체 공간이 부족한 경우 IP를 해당 줄에서 리디렉션하고 기존 1명령을 재사용하기로 결정했습니다. 두 번째 비트를 누르십시오.

./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.

이제 1두 번째 비트로 토폴로지에 대해해야 할 일은 두 번째 및 세 번째 비트의 순서를 수정하고 종료하는 것이 었습니다.

       ^
       |
 ./.$..$
 21\./01
 ..>..!\
 @......
 .<..<<.
 20//\11
 @01$00@
 ^     ^
 |     |
011   010

마지막으로 0두 번째 비트로 토폴로지를 유지했습니다 . 프로그램에 남은 공간이 많지 않아 맨 위 줄에 가장 큰 사용되지 않은 공간이 있으므로 토폴로지의 IP를 0두 번째 비트로 리디렉션했습니다 .

./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@

나는 여전히 0두 번째 비트 를 푸시 하고 두 번째 및 세 번째 비트의 순서를 수정하고 프로그램을 종료해야했습니다. 다행히도 기존 $명령어 를 재사용 할 수 있었으므로 0@명령어는 나머지 공간에 맞출 수있었습니다.

./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@

마지막으로 줄 끝에서 노프를 제거하여 최종 프로그램을 얻을 수 있습니다.



15

44 41 40 38 37 바이트

\\1.>2
/0./
@./$(\
$>0!>
11$/10
$.@.1

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

테스트 드라이버.

6 x 6 정사각형을 사용합니다. 누군가가 8 x 8 정사각형으로 얻을 수있는 가장 짧은 것은 누군가가 그것을 개선하려고한다면 38 바이트 입니다.

설명:

첫 번째 패스 스루 코드 중 하나는 접두사 0및 의 첫 두 숫자를 인코딩합니다 1. 의 경우 2세 번째 숫자를 인코딩 한 다음 첫 번째 숫자를 인코딩합니다.

     201  200
     211  210
       |  |
       v  v
   -> \\1.>2
 IP<- /../..  <- 000, 001
      ...$..
      .>0...
      .1..10  <- 010, 011
      ....1.
       ^  ^
       |  |
     100  110
     101  111

그런 다음 세 번째 에지를 통해 IP를 전달하여 최종 수를 결정합니다. 우리는 IP를 동일한 접두사와 결합합니다.

     201  200
     211  210
       |  |
       v  v
   -> \\1.>2  -> 0,2 or 1,2
 IP<- /../..  <- 000, 001
      ...$..
      .>0!>.  -> 1
      .1./10  <- 010, 011
      ....1.
       ^ |^
       | v|
       | 0|
     100  110
     101  111

의 경우 01접두사, 둘은 세 번째 숫자를 결정하는 상단 가장자리를 나와.

     201  200
     211  210
       |  |
       |10|
       vvvv
   -> \\1.>2  -> 2
 IP<- /0./..  <- 000, 001
      @./$..
      .>0!>.  -> 1
      .1./10  <- 010, 011
      ....1.
       ^ |^
       | v|
       | 0|
     100  110
     101  111

의 경우 2접두사는 IPS는 하단 모서리에서 모서리를 나와.

     201  200
     211  210
       |  |
       |10|
       vvvv
   -> \\1.>2  -> 2
 IP<- /0./..  <- 000, 001
      @./$(\
      $>0!>.  -> 1
      11$/10  <- 010, 011
      $.@.1.
      ^^ |^^
      || v||
      1| 0|0
     100  110
     101  111

두 가장자리는 첫 번째와 세 번째 숫자를 바꾸고 두 번째 숫자를 밀고 세 번째 숫자와 바꾸어 올바른 순서를 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.