십자형 타일은 사각형의 종류입니다 두 개의 입력을 갖는 기능 블록으로 , 하나는 상단에서 하나는 왼쪽에서 하나는 오른쪽에 하나는 아래쪽에 하나의 출력이 있습니다. 각 출력은 두 입력의 개별 기능입니다.
예를 들어, #일반 타일을 나타내고, 우측 출력은 R함수 f의 입력은 T과 L, 상기 저부의 출력은 B다른 함수 g의 T과 L:
T
L#R R = f(T, L)
B B = g(T, L)
(두 개의 함수가 있기 때문에 타일을 "duo"라고하고 두 함수 가 두 개의 인수를 갖기 때문에 "dyadic"이라고합니다. 합니다.)
그런 다음 타일을 그리드에 함께 구성 할 수 있습니다. 한 타일의 출력은 인접한 타일의 입력으로 직접 이동합니다. 예를 들어, 왼쪽의 오른쪽 출력은 오른쪽 #의 왼쪽 입력으로갑니다 #.
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
특정 기능을 가진 두 개의 이중 체 타일 세트가 주어지면 복잡하고 잠재적으로 유용한 구성을 만들 수 있다고 상상할 수 있습니다.
이 과제 에서는 모든 입력 및 출력이 단일 비트 이진수 (0 또는 1) 인 기존의 10 가지 논리 기반 십이 음표 타일 에만 관심이 있습니다. 각 타일 유형을 나타 내기 위해 별도의 ASCII 문자를 사용합니다.
타일 문자 및 해당 입력 / 출력 관계는 다음과 같습니다.
( T상단 입력, L왼쪽 입력, R오른쪽 출력, B하단 출력)
- 0 :
0또는(공백) →R = 0,B = 0 - 하나 :
1→R = 1,B = 1 - 십자가 :
+→R = L,B = T - 거울 :
\→R = T,B = L - 상단 만 :
U→R = T,B = T - 왼쪽 만 :
)→R = L,B = L - 아님 :
!→R = not L,B = not T - 그리고 :
&→R = L and T,B = L and T - 또는 :
|→R = L or T,B = L or T - Xor :
^→R = L xor T,B = L xor T
도전
0 1+\U)!&|^10 가지 논리 기반 십이 음표 타일을 사용하여 만든 "회로"를 나타내는 문자의 사각형 격자를 취하는 프로그램 또는 함수를 작성하십시오 . 또한 두 개의 문자열에 걸릴 필요가 0의와 1의; 하나는 왼쪽 입력 열이고 다른 하나는 상단 입력 행입니다. 프로그램 / 기능은 하단 출력 행과 오른쪽 출력 열을 인쇄 / 반환해야합니다 ( 0및1 의).
예를 들어이 그리드에서
+++
+++
모든 입력은 그리드를 가로 질러 출력으로 똑바로 흐릅니다.
ABC
D+++D
E+++E
ABC
그래서의 입력 010/가 01출력했을 010/ 01:
010
0+++0
1+++1
010
프로그램의 정확한 결과는 다음 [bottom output row]\n[right output column]과 [bottom output row]/[right output column]같습니다.
010
01
또는
010/01
함수를 작성한 경우 두 문자열을 튜플 또는 목록으로 반환하거나 여전히 인쇄 할 수 있습니다.
세부
- 명령 행, 텍스트 파일, sdtin, 함수 arg와 같이 합리적인 방식으로 세 개의 입력을 문자열로 사용하십시오 (주문 그리드, 맨 위 행, 왼쪽 열).
- 입력 행과 열 길이가 그리드 치수와 일치하고
0의 및1. - 격자는 올바른 문자 (
0 1+\U)!&|^)를 사용해야합니다 . 그 기억0과같은 일을 의미한다.
테스트 사례
(I / O를 top/ left→ bottom/ 로 읽습니다 right.)
낸드 :
&!
00/ 0→ 01/ 1
00/ 1→ 01/ 1
10/ 0→ 01/ 1
10/ 1→ 11/0
모든 것 :
1111
1\+\
1+\+
1\+\
모든 입력은 1111/ 가되어야합니다 1111.
Nand에서 Xor : (후행 공백 열 참고)
\)+\
U&!&
+! !
\&!&
!
00000/ 00000→ 00000/ 00000
00000/ 10000→ 00010/ 00000
10000/ 00000→ 00010/ 00000
10000/ 10000→ 00000/00000
지그재그 :
+++\00000000
000\!!!!\000
00000000\+++
왼쪽 입력의 첫 번째 비트는 오른쪽 출력의 마지막 비트가됩니다. 다른 모든 것입니다 0.
000000000000/ 000→ 000000000000/ 000
000000000000/ 100→ 000000000000/001
번식:
)))
UUU
U+U
U+U
UUU
왼쪽 입력의 첫 번째 비트는 모든 출력으로갑니다.
000/ 00000→ 000/ 00000
000/ 10000→ 111/11111
모든 1 × 1 그리드 테스트 사례의 pastebin이 있습니다.
채점
보너스 : 어떤 멋진 "회로"를 만들 수 있습니까?
추신 : 인터넷 검색 "이중 체 타일"을 귀찮게하지 마십시오. 나는 어제 그것들을 만들었습니다 .D
이 아이디어를 본격적인 프로그래밍 언어로 확장하는 것에 대해 논의하고 싶다면 이 대화방으로 오십시오 .