십자형 타일은 사각형의 종류입니다 두 개의 입력을 갖는 기능 블록으로 , 하나는 상단에서 하나는 왼쪽에서 하나는 오른쪽에 하나는 아래쪽에 하나의 출력이 있습니다. 각 출력은 두 입력의 개별 기능입니다.
예를 들어, #
일반 타일을 나타내고, 우측 출력은 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
이 아이디어를 본격적인 프로그래밍 언어로 확장하는 것에 대해 논의하고 싶다면 이 대화방으로 오십시오 .