읽을 수 없음 , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 바이트
출력은 알파벳 역순 ( z
~ a
)이지만 허용되는 규칙에 따릅니다.
' "" "" "'" "" "" " '" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" ""' "" " '" "" "" "" ""' "" ' "" "" "" "" "" "" "" "" "" "" "" "" "' ""' "" " '" "" ""' "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' ""' "" ' ""' "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' ' "" ' "" "" "'" "" "" "" "" "" "" "" ' "" "'" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" ""' "" "" "" "" "" ' "" "'" "" "" "" "" "" "" "" "" """ '" "" ""' "" ' ""' "" ' "" "" "" ""' "" ' ""' "" "" "" "" "" " '" "" "" "' "" ' "" "" "'" " '" "'" " '" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" '' "" ' "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" " '"" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" ""' "" ' ""' "" ' "" "" "'" " '" "" ""' "" " '" "'" " '" "'" "" "" '' "" ' "" "" "'" " '" "'" " '" "" ""' "" ' ""' "" ' "" "" "" ""' "" ' "" "" ""' ""' "" ' ""' "" ' ""' "" "" " '" "'" "" "" "" "" ' ""' "" ' ""' "" ' "" "" " " '" "" ""' "" ' ""' "" ' "" "" "" ""' "" ' ""' "" "" "" "" "" " '" "" "" "' "" ' "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "" ""' "" ' "" "" "" " '"" ' "" "" "'" " '" "'" " '" "" ""' "" "" " '" "'" "" "" "" " '" "" "" "" "' "" ' "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" " '" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" " "" "" "" "" " '" "'" "" ' "" "" "" ""' "" ' ""' "" "" "" "" "" " '" "" "" "' "" ' "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "" ""' "" ' "" "" "" "' ""' "" ' ""' "" ' ""' "" "" " '" "'" "" "" "" "" ' ""' "" ' ""' "" ' "" "" " " '" "" ""' "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" ""' "" " '" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" " '" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" "'" " '" "'" "" "" " '" "" "" "" "" "" "" "" "" """" ' ""' "" " '" "'" "" "" "" "" " '" "" "" """" ' ""' "" " '" "'" "" "" "" "" " '" "" "" ""
설명
첫째, Unread가 할 수있는 일에 대한 인상을 얻으려면 기본 작업이 있습니다.
- 임의 크기의 정수 셀의 무한 테이프가 있습니다.
- Brainfuck과 같은 메모리 포인터 가 없습니다 . 대신 테이프에서 셀의 위치를 기준으로 셀을 역 참조합니다. 이는 "값 4 번 읽기"또는 "값 # (읽기 값 # 4)"(이중 역 참조)를 읽을 수 있음을 의미합니다.
- 메모리 셀만 읽거나 쓸 수 있습니다 (Brainfuck에서와 같이 직접 증가 / 감소하지는 않음).
- 식 내에서 값을 늘리거나 줄일 수 있습니다. 따라서 메모리 셀을 증가 시키 려면 read , incremental , write 또는 다르게 넣어야
write(x, inc(read(x)))
합니다.
- 0과 0이 아닌 것을 확인할 수있는 while 루프와 3 진 조건이 있습니다.
이 프로그램은 다음과 같이 테이프를 사용합니다. 변수 이름은 나중에 의사 코드에서 사용됩니다. 또한 이것은 첫 번째 버전 (1830 바이트)을 기록합니다. 이후 변경된 사항은 하단의 수정 사항을 참조하십시오.
- 셀 0 : 변수
q
- 셀 1 : 변수
a
, p
,ch
- 셀 2 : 변수
hash
,v
- 셀 3 : 변수
b
,r
- 셀 4 : 변수
aa
,l
- 셀 5 : 10 진수 문자열의 "끝"을 표시하기 위해 0으로 유지
- 셀 6–95 : 10 진수 문자열을 거꾸로 저장
- 셀 96–121 : 사용자
a
(96)에서 z
(121) (문자의 ASCII 코드에서 1을 뺀 것) 에서 공제 될 투표 수를 저장합니다 .
- Cells 4657–7380 : 몇 번의 유권자 / 부자 조합이 발생했는지 기억하십시오. 이 셀에는 4 가지 가능한 값만 있습니다.
0
= 아직 표시되지 않음, -1
= 한 번 표시, -2
= 두 번 표시, -3
= 2보다 큰 횟수
알고리즘은 기본적으로 다음과 같이 진행됩니다.
- 문자의 쌍 계속 읽기
a
와 b
. (a-2)*(a-1)+b-1
문자 a–z의 모든 조합에 대해 고유 한 해시 값을 계산하십시오 .
- 해당 해시 값 (
*hash
) 에서 메모리 셀을 확인하십시오 . 의 경우 -3
사용자는 이미 투표 제거 자격이 있으므로 증가 *(b-1)
합니다. 그렇지 않으면을 줄이십시오 *hash
. 가 있다면 지금 -3
, 사용자는 단지했다 가 세 발생 후 투표 제거를위한 자격, 이렇게 증가 *(b-1)
에 의해 3
.
- 그런 다음 문자를 역순으로 진행하여 (
z
~ a
) 투표가 필요한 항목을 출력합니다. 숫자를 10 진수로 변환하려면 수동 정수를 10으로 나누어야합니다.
모든 것이 명확 해지면, 이것은 프로그램이 의사 코드처럼 보이는 것입니다.
// Read pairs of characters
while (a = read) + 1 {
b = read
// Calculate hash = (a-1)*(a-2)/2 + b-1
// This also sets a = b-1
hash = 0
while --a {
aa = a
while --aa {
++hash
}
}
while --b {
++a
++hash
}
// If this combination has just been seen for the third time,
// increment *a by 3; if more than third time, increment *a by 1
*a = (*hash + 3) ? ((--*hash) + 3 ? *a : (*a+3)) : (*a+1)
}
// Loop through the characters z to a
l = 27
while --l { // l loops from 26 to 1 (not 0)
(v = *(ch = l + 95)) ? { // 'a' is ASCII 97, but cell 96
print (ch+1) // print the votee
// Now we need to turn the number v into decimal.
// p points to where we are storing decimal digits.
p = 5
while v {
// Integer division by 10 (q=quotient, r=remainder)
r = (q = 0)
while v {
--v
(++r - 10) ? 1 : {
r = 0
++q
}
}
// Store digit ASCII character
*(++p) = r + 48 // 48 = '0'
v = q
}
// Now output all the digit ASCII characters in reverse order
while *p {
print *(--p + 1)
}
} : 1
}
편집 1, 1830 → 1796 : while 루프의 반환 값을 한 곳에서 재사용 할 수 있다는 것을 깨달았습니다.
편집 2, 1796 → 1791 : 6–95 셀을 사용하는 대신 10 진수를 음수 셀 (-1 이상)에 저장하면 프로그램이 약간 작습니다. 추가 보너스로, 프로그램은 더 이상 10⁹⁰ 투표로 제한되지 않습니다!
편집 3, 1791 → 1771 : 에 결과를 할당하는 대신 결과를 *(ch = l + 95)
에 v
할당 q
한 다음 v = q
코드를 1777 바이트로 가져 와서 while 조건으로 이동합니다 . 다음의 위치를 교환 q
하고 v
있기 때문에 테이프에 q
이제 1보다 더 일반적이다 v
.
4, 1771 → 1762 편집 : Duh. hash
0 대신 1로 초기화 하면 9 바이트가 짧습니다. 해시 코드는 이제 1 개 이상으로 중요하지 않습니다.
편집 5, 1745 → 1762 : 내가 초기화하는 경우 q
와 r
1 대신 0으로, 좀 뿌려해야 할 -1
바로 그것을 만들 장소에서들, 그리고 모든 상쇄 할 것 - 것을 제외하고 while v { --v; [...] }
루프가 이제 한 적은 반복을 실행해야, while --v { [...] }
26 자 더 짧은 이라고 말하면 됩니다.
6, 1745 → 1736 편집 : 대신을 { r = 1; ++q }
쓸 수 있습니다 q = *((r = 1)+1)+1
. 이것은 q
가변 슬롯 # 2에 있다는 사실에 의존합니다 . 슬롯 # 1에 있으면 더 짧아 지지만 전체 프로그램은 더 길어집니다.
편집 7, 1745 → 1727 : 편집 6을 되돌리고 대신 가장 안쪽 while 루프를 숫자 ASCII 코드를 계산하는 표현식에 인라인하여 1736 바이트로 끝나지만 감소 명령 (9 바이트)을 저장함으로써 절약을 달성했습니다. ) 변화시킴으로써 ((++r) - 11) ? r :
로 (r - 10) ? ++r :
.
편집 8, 1727 → 1626 : 해시 계산을 재 작업했습니다. 이제 하나의 적은 while 루프를 사용합니다. 셀 위치는 이제 실제 ASCII 코드에 있습니다 (더 이상 1이 아닌). 변수가 다른 빈도로 발생하므로 테이프의 다른 위치로 변수를 다시 섞습니다.
편집 9, 1626 → 1606 : 더 미친 인라인. 첫 번째 while 루프의 본문은 이제 다음과 같습니다.
// b = next char
*(b = (hash = read)) = {
// hash = b + (a-1)*(a-2)/2
while (a2 = --a) {
while --a2 {
++hash
}
}
// If this combination has just been seen for the third time,
// increment *b by 3; if more than third time, increment *b by 1
(*hash + 3) ? ((--*hash) + 3 ? *b : (*b+3)) : (*b+1)
}
변수 할당이 거의 완전히 변경되었습니다.
10 → 1577 (1606) 편집 : 나는 그것을 관찰 a
하고 a2
내가 쌍을 수 있다면, 그래서 모두 루프 동안 0으로 감소되어 p
그 중 하나로,하지만, 하지 에 ch
, 나는 초기화 할 필요가 없습니다 것 p
에 0
(29 바이트의 요금으로한다). 나는 교환하여 해당 작업을 수행 할 수 있습니다 밝혀 p
와 r
. 최신 변수 어설 션 (및 코드에서 발생 빈도)은 다음과 같습니다.
0 = v (3) (total 3)
1 = hash (6), r (5), ch (2) (total 13)
2 = b (4), q (5) (total 9)
3 = a (3), p (5) (total 8)
4 = a2 (3), l (4) (total 7)
nanananananananabatman
테스트 케이스의 경우 +1