과제 1 개, 2075 (최적)
이것은 추론에 큰 오류가 있거나 테스트가 짜증나 지 않는 한 최적의 값이어야합니다.
가장 먼저. 99로 표현할 수있는 7 개의 다른 숫자 (mod 128) 만 있습니다. 7 이상의 9의 모든 값은 같은 숫자 71로 평가됩니다. (10 ^ 8 mod 128 == 0, 10 ^ 9 mod 128 == 0, ...)
4 개의 값 중 하나를 짝수로 표현할 수있는 경우이 숫자를 출력하는 것보다 최적의 솔루션이됩니다.
그렇지 않으면 하나의 할당 문으로 번호에 도달하고 (99로 할당) 99를 인쇄하려고 시도합니다.이 방법으로 최대 프로그램 크기는 22 자입니다. 분명히 Goto를 사용하는 것은 그 이상을 필요로합니다. 하나의 할당 솔루션이 이길 수있는 유일한 가능성은 두 가지 할당이있는 솔루션입니다. 나는 이것을 테스트하고 (오류없이 코드를 작성하면 상당히 지저분하다) ASCII 문자에 대한 해결책을 찾지 못했습니다.
따라서 최적의 솔루션을 찾기 위해서는 4 개의 직접 숫자와 1- 할당 방식 만 확인하면 충분합니다. 다음 Python (2 및 3 호환) 프로그램은 모든 프로그램을 생성하고 해당 길이를 합산합니다. 간단한 IDA * 접근 방식을 사용합니다.
from itertools import count
def nines_to_dec(nines):
return ((10**nines - 1) // 9) % 128
def shortest_representation(ascii_value):
# try simple output,
# max code length is 8, (8 nines == 10 nines == 12 nines == ...)
# if this works, than this is the shortest representation
for nines in range(2, 9, 2):
if nines_to_dec(nines) == ascii_value:
return "9" * nines
# otherwise try one assignment
for length in count(1):
result = assignment(ascii_value, length, [])
if result:
return "99 " + result + "\n99"
def assignment(value, left, nines_list):
if left == 0:
eval_numbers = [nines_to_dec(nines) for nines in nines_list]
if (sum(eval_numbers[::2]) - sum(eval_numbers[1::2])) % 128 == value:
return " ".join("9" * nines for nines in nines_list)
else:
return False
for nines in range(1, 8):
left2 = left - nines - 1 # -1 for space
if left2 >= 0:
result = assignment(value, left2, nines_list + [nines])
if result:
return result
return False
lengths = []
for i in range(128):
program =shortest_representation(i)
lengths.append(len(program))
print("ASCII-value: {}, ASCII-char: {}".format(i, chr(i)))
print(program)
print(sorted(lengths))
print(sum(lengths))
출력 형식은 다음과 같습니다.
....
ASCII-value: 65, ASCII-char: A
99 9 999999 9999999
99
ASCII-value: 66, ASCII-char: B
99 9 99 9999 99
99
ASCII-value: 67, ASCII-char: C
99 9 99 9 99 9999
99
....
http://pastebin.com/bKXLAArq 에서 전체 출력을 찾을 수 있습니다.
프로그램이 가장 짧은 문자 (2 문자)는 vertical tab - 11
프로그램 길이가 2이고 프로그램이 가장 긴 문자 (22 문자)는 bell - 7
및 A - 65
입니다.
모든 프로그램의 합계는 2075입니다.
그리고 저는 tmartin 의 k / q 인터프리터를 사용했습니다 . 나는 다른 것들 (Python, Perl, CJam)과 상당히 어려움을 겪습니다. 그것이 내 잘못인지 확실하지 않습니다.