이 과제는 읽기 불가능한 사용자에게 적합합니다.
이것의 첫 번째 버전은 3379 바이트로, 내가 얼마나 골프를했는지에 대한 아이디어를 제공합니다.
프로그램은 챌린지에 설명 된대로 정확하게 입력을받습니다 : 공백으로 구분 된 단어 목록 (숫자 및 문장 부호를 포함 할 수도 있음), 공백 및 최소 4 이상의 정수 (작은 숫자는 무한 루프를 생성 함) .
' "" "" ""' "" "" "" "" ' "" "" ""' "" "" "" "" " '" "'" "" "" "" "" "" "" "" " '" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" " '" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" ""' "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" " '" ""' "" "" "" "" " '" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" " ' "" "" "" "" " '" ""' "" ' "" "" "" ""' "" "" " '" "" "" "" "" "" "" "" "" "" " " '" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" ""' "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" ""' "" "" """ "" "" "" "" "" ' "" "'" "" "" "" "" " '" "'" " '" "" "" "" ""' "" "" "" ' "" ' "" "" "'" " '" "'" " '" "" "" "" "" ""' "" "" "" "" "" "" "" "" ' "" "" " " '" "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" "" "" "" " '" "'" "" "" ""' ""' "" ' ""' "" ' ""' "" "" " '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" " '" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "' '"" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" "" ' "" "" "" "" "" "" ""' "" "" "" "" ' "" "" "" "" "" "" "" "" "" " "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ''"" "" "" "" "" ' "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" ' "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" ' "" "" "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" ""' "" ' "" "'" ' "" "" "" "'" " '" "'" " '" "'" "" "" " '" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"' "" ' ""' "" "" " '" "'" " '" "'" "" "" "" "" "" ' "" "" "" "" " '" "" ""' "" ' ""' "" ' "" "" "'" " '" "'" " '" "" "" "" "" "" "" "" "" "' '"" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" ""' " '" "" "" "" "" "" ""' "" ' ""' "" "" "" "" "" "" "" "" "" '' "" "" "" "" " '" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" " "" "" "" "" "" ' "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" """ ' "'" " '" "'" " '" "'" "" "" "" " '" "'" " '" "" "" "" "" ""' "" "" "" ' "" ' "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "" ""' "" ' "" "" "" " ' "" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" ' "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' ""' "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "'"" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "'" "" "" "" "" "" "" ""
설명
프로그램이 입력을 처리하는 방법을 안내합니다 thyme horseradish peppermint 10
. 예상 출력은 thyme,\nhorser...,\npeppermint
입니다.
먼저 셀 # 7에서 시작하여 전체 입력을 읽지 만 공백이 0이되도록 모든 문자에서 32를 뺍니다.

명백한 이유로, 이것은 실행 포인터 ( 여기서 p , 셀 # 0에 저장 됨)를 끝에 둡니다 . 우리는 마지막 루프를 찾기 위해 하나의 while 루프를 사용하는데, 이는 출력의 너비를 정의하는 숫자의 시작 부분입니다 (이 예제에서는 셀 # 36).
이제 숫자를 해독하려고합니다 (즉, 십진수에서 변환). 최종 결과는 셀 t 와 r 모두에 있습니다 . 우리는 그들이 0에서 시작한다는 사실에 의존합니다.
숫자의 모든 숫자에 대해 다음을 수행하십시오.
- t 를 -15로 설정하십시오 .
- while 루프에서는 r (현재까지의 결과 포함)을 -1로 줄입니다 (정확히 r 반복이 필요 하기 때문에 while 루프의 조건으로 확인되기 전에 감소가 발생하므로 0으로 감소하면 반복 횟수가 줄어 듭니다) 각 반복에 대해 10을 t에 더하십시오 . 이제 t 는 이전 결과에서 15를 뺀 15를 포함합니다.
- 다시 while 루프에서 * p 를 0으로 줄이고 반복 할 때마다 1을 t에 더하십시오 . 이 t 에 지금까지 올바른 중간 결과가 포함 된 후 : ASCII 코드 48–57
'0'
을 '9'
갖는 문자 , 32의 초기 뺄셈 후에는 16–25이므로 실제로 15–24를 t에 더하면 −15로 취소됩니다. 우리는 그것을 이전으로 설정했습니다. 또한 후속 코드가 단어 목록의 끝을 인식 할 수 있도록 숫자 문자를 포함하는 데 사용 된 셀을 0으로 만드는 것이 중요합니다.
- 다음 반복에서 r 에서 찾을 수 있도록 r 을 새로운 중간 결과로 설정하십시오 . ( t를 다시 읽을 필요는 없습니다. * p 는 0이 될 수 없으므로 적어도 한 번 실행되었으므로 이전 while 루프의 마지막 값만 사용할 수 있습니다.)
마지막으로, 우리 는 방금 계산 한 숫자를 단항으로 변환하기 위해 또 다른 간단한 while 루프 ( t 를 카운터로 감소 )를 사용합니다. 셀 # 0에서 왼쪽으로 1의 문자열을 저장합니다. 이 세포 # 1이 (우리의 실행 포인터는 사실에 의존 q는 ) 읽을 수있는 루프 그런 반면 있기 때문에 우리는 하나 적은 1 초를 얻을 0에서 밖으로 시작한다 :

이 후에는 r 의 값이 더 이상 필요하지 않으므로 해당 셀을 다른 용도로 재사용합니다. 포인터 p 와 q를 재설정하고 나중에 필요한 ASCII 코드의 문자로 일부 셀을 초기화합니다. 또한 나중에 사용할 c 와 s로 레이블을 지정 했으며 s 가 0에서 시작 한다는 사실에 의존 합니다.

잠깐만 요 셀 # 0이 빨간색으로 표시되는 이유는 무엇입니까? ... 음, 이것은 비열한 속임수를 강조하기위한 것입니다. 1을 너무 적게 출력한다는 것을 기억하십니까? 비결은 셀 # 0을이를 "확장"으로 사용하여 수정하는 것입니다. 이것은 우리가 p 가 0이 될 수 없다는 것을 알고 있기 때문에 작동 합니다. 이런 식으로, 빨간 블록의 너비는 10 셀이며 정확히 우리가 원하는 수입니다. 또한 0 대신 q 를 1 로 초기화 할 수 있도록 9자를 저장 합니다.
이제 단어를 통과하고 모두 출력하는 while 루프를 시작합니다.
1 단계 : 다음 단어가 현재 줄에 맞는지 알아 봅니다. 우리는 단순히 이동하여이 작업을 수행 할 페이지를 오른쪽에 Q 때까지 잠시 루프 왼쪽 p는 다음 간격을 명중 :

이제 p가 에 바로 단어의, 우리는이 경우 확인하여 목록의 마지막 단어를인지 여부를 확인하실 수 있습니다 * (P + 1) 제로이다. 우리는 또한 나중에 다시 필요할 것이기 때문에 그 값 (이 예에서는“양 고추 냉이”에서 32를 뺀“h” 이므로 32 임)을 c에 저장 합니다. 이 경우 0이 아니므로 단어와 함께 쉼표를 출력해야하므로 단어가 한 글자 더 깁니다. q를 한 번 더 줄임으로써 이것을 고려하십시오 . 마지막으로, 다른 while 루프를 사용하여 p 를 단어의 시작 부분으로 다시 이동 하십시오.

q 가 0이 아닌 값을 가리 키기 때문에 단어가 현재 줄에 들어가는 것을 알았으므로 다음 과 같이하면됩니다.
- p 를 단어 앞으로 다시 이동 하여 각 문자를 인쇄하십시오 (32 개의 모든 ASCII 코드가 32로 해제되어 있기 때문에 32를 더함).
- c 가 0이 아닌 경우 셀 # 5의 값을 사용하여 쉼표를 인쇄하십시오.
- s 를 0이 아닌 값으로 설정 하여 다음 반복에 더 이상 줄의 시작 부분에 있지 않으므로 다음 단어 앞에 공백 문자를 출력해야 함을 나타냅니다. (우리는이 인쇄 문의 반환 값을 다시 사용하는데, 이는 쉼표에 44입니다.)
지금까지 출력 : thyme,
그런 다음 큰 루프의 다음 반복이 시작됩니다. 이전과 마찬가지로 왼쪽에서 오른쪽으로 단어를 이동할 때 q 를 줄임으로써 다음 단어가 나머지 줄에 맞는지 확인합니다 . 하는 것으로 q는 여전히 -5 우리는 이미 현재 행에 인쇄 얼마나 많은 문자를 추적 이전 반복에서. s 가 0이 아니기 때문에“와사비”의 문자, 쉼표에 대한 문자, 1을 더한 문자를 세고 나면 공백도 출력해야 함을 나타내 므로 q 는 1의 블록 끝을 초과합니다.

이제 q 는 제로 셀을 가리 킵니다. 즉, "양 고추 냉이"는 현재 라인에 맞지 않습니다. 우리가 지금하는 것은 s 가 0이 아닌지에 달려 있습니다. 우리의 경우에는 다음 줄로 줄 바꿈해야합니다. 우리가해야 할 일은 :
- 개행 인쇄 (셀 # 3 사용)
- q를 다시 1로 설정
- s 를 0으로 설정
지금까지 출력 : thyme,\n

다음 반복에서 p 는 이전과 같은 위치에 있으므로 동일한 단어를 다시 볼 것입니다. 이전과 마찬가지로 "양 고추 냉이"의 문자 수를 세고이 단어 뒤에 다른 단어가 있음을 발견하면 c 를 다시 80으로 설정 하고 쉼표의 q 를 줄인 다음 p 를 단어의 시작 부분으로 되감습니다 .

이전 반복에서와 같이 q 는 0 인 셀에서 끝나기 때문에 "양 고추 냉이"는 여전히 적합하지 않습니다 . 그러나 이번에는 s 가 0이므로 마지막 시간과 다른 작업을 수행합니다. 단어, 3 개의 점 및 쉼표 중 일부를 출력해야합니다. 너비는 10이므로 단어의 6자를 출력해야합니다. 다음과 같은 경우에 우리가 어디에서 끝나는 지 봅시다.
- 1의 빨간 블록의 시작을 찾으십시오. 우리는 q 가 그것의 왼쪽에 있어야 한다는 것을 알기 때문에 올바르게 진행함으로써 이것을 할 수 있습니다 .
- 쉼표를 출력해야하는 경우 q를 한 번 더 증가시킵니다 ( c ≠ 0).
테이프는 이제 다음과 같습니다.

나는 여기에 6 세포의 범위를 표시했습니다. 보시다시피 q = -1 까지 문자를 출력해야합니다 . 이것은 확인하기에 코드 효율적입니다 (기본적으로 while ((++q)+1) { ... }
). 그래서:
- q 가 -1에 도달 할 때까지 해당 문자 (32보다 더하기 때문에 모든 ASCII 코드가 32로 해제되므로)를 인쇄하십시오 . p 는“양 고추 냉이”라는 단어의 중간에있는 셀 19에있을 것입니다.
- 세 개의 점을 인쇄하십시오. print 명령은 자체 인수를 반환하므로 코드 효율적으로 중첩 할 수 있습니다 (본질적으로
print(print(print('.')))
). 셀 # 5에서 ASCII 값을 가져와 2를 더하여 점의 ASCII 코드를 얻습니다.
- p 를 단어의 끝으로 이동 하십시오. 우리는 단어의 끝에 도달 할 수 없다는 것을 알고 있기 때문에 (단어가 너무 길어서 점에 맞추기 위해 적어도 3자를 제거해야했기 때문에)이 루프에는 적어도 하나의 반복이 있으므로 while 루프의 본문이 점의 ASCII 값을 계산 한 다음 while 루프의 반환 값을 인쇄 함수에 전달하도록하는 코드가 더 짧습니다.
- c 가 0이 아닌 경우 쉼표를 인쇄하십시오 .
이 모든 후, 우리는 또한 셀라 인 3을 사용하여 줄 바꿈을 인쇄하고 q 를 1로 다시 설정 합니다. 또한 이미 0 인 경우에도 s 를 0으로 설정할 수 있습니다 . 다음 줄 ( s 가 0이 아닌 경우)이므로 코드 반복을 피하기 위해 s 를 검사하는 조건부 이후에 수행합니다 .
지금까지 출력 : thyme,\nhorser...,\n
하나의 반복 만 남았습니다. 이번에는 단어의 글자를 세면 다음과 같이 나타납니다.

이번에는 p 뒤에 아무것도 없기 때문에 “쉼표 없음”을 나타 내기 위해 c 를 0으로 설정했기 때문에 q 를 더 이상 줄이지 않습니다 . q는 이제 0이 아닌 셀을 가리 키 므로 단어가 적합하다는 것을 알고 있으므로 이번에는 c 가 0 이라는 점을 제외하고 첫 번째 반복과 동일한 코드가 실행 되므로 단순히 쉼표를 인쇄하지 않습니다.
산출: thyme,\nhorser...,\npeppermint
이 연습에서는 코드가 실제로 공백을 인쇄하는 경우를 포함하지 않았지만 지금은 명확해야한다고 생각합니다. 코드에서 단어가 적합하고 ( * q ≠ 0) s 가 0 이 아닌 경우 단어 앞에 공백을 출력합니다.