読み取り不可、1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577バイト
出力はアルファベットの逆順(zto a)ですが、許容されると思われる規則に従っています。
'"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" " "'" "'" "" "" "" "" "'" ""' "" "" "" "" "" "" "" "" "" "" '"" "" ""' " "'" "'" "" "" "'" "" "" "'" "" "" '"" "'" "" "" "" "" "" "" "" '""'""' "" "'" "" "" "" "" "" "" ""' "" '""' "" "'" "" "" "" "'" "" "" "" " '""' "" '""' "" "'" "" "" "" "" "'" "'" "" "" "" "" "" "" "" "" "" "' "" '""' "" '"" "" "" "'" "" "" "" '"" "'" "" "" "" "" "" '""' "" '"" "" "" "" "" "" "" '"" "'" "" "" "" "'" "" "" "'" "" "" "" '"" "'" " "" "" "" "" "" "" '""' "" "'" "'" "'" "'" "" "" "" "" "" "" "" "" '" "" "" "" "" "" "" '"" "" "" "'" "'" ""' "" "" "" "" "'" "'" "'" ""'" "'" "" "" '""' "" '""' "" '""' "" '""' "" "" "'" "'" "'" "" ""' "" '""' "" "" "'" "'" "'" "" ""' "" '""' "" "'" "" ""' "" "" "'" "' ' "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "'"" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" " '"" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'""' "" "" "'" "" ""' "" '""' "" '""' "" '""' "" '"" "" "'" "'" "'" "'" "'" "" "" '""' "" '""' "" '""' "" '""' "" "" "'" "'" "'" "" ""' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" " '"" '""' "" '""' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "" "" ""' "" "" "" "" "" "'"' "" "" "" "'" ""' "" "" "" "" '"" "" "" "" "" "" " "" '"" "" "" ""' "" "'" "" "" ""' "" '"" "" "" "'" "" "" "'" ""' """" "" '"" "" ""' "" "'" "" "" "'" "" "" "'" "'" "'" ""' "" "" "" "''" "" "" "" "" "" "" '"" "" "" "" "" "'" "'" "" "" "" "" "'" "'" "'" "' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'""' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "' "'" "'" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" ""' "" "'" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "'" "" "" "" ' "" "'" "" "" "" "" ""' "" '"" "" ""' "" "" "" "'" "'" "" '"" "" ""'"" "'" "" '"" "" "'" "" "" "" '""' "" '"" "'" '"" "" "" "'" "" "" "" " "'" "" "" "" ""' "" '"" "'" "'" "" "" ""' "" '""' "" """ '""' "" "'" "'" "" "" "" '""' "" '"" """ '""' "" "'" "'" "" "" "" '""' "" '"" "
説明
まず、Unreadableでできることの印象を得るために、基本的な操作を次に示します。
- 任意のサイズの整数セルの無限のテープがあります
- Brainfuckのようなメモリポインタはありません。代わりに、テープ上の位置によってセルを間接参照します。これは、「値#4を読み取る」または「値#(値4を読み取る)」を読み取ることができることを意味します(二重参照)。
- メモリセルの読み取りまたは書き込みのみが可能です(Brainfuckのように直接インクリメント/デクリメントすることはできません)。
- 式内で値をインクリメント/デクリメントできます。したがって、メモリセルをインクリメントするには、read、increment、write、または別にputする必要があります
write(x, inc(read(x)))。
- 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)を保存します。
- セル4657〜7380:どの投票者/投票者の組み合わせに何回遭遇したかを覚えておいてください。これらの細胞は、唯一の4つの可能な値があります。
0まだ見ていない=、-1一度見=、-2二度見する=、-3= 2倍以上の任意の数より多く見。
アルゴリズムは基本的に次のように進みます。
- 文字
aとのペアを読み続けbます。ハッシュ値を計算します(a-2)*(a-1)+b-1。これは、文字a〜zのすべての組み合わせに対して一意です。
- そのハッシュ値(
*hash)のメモリセルを確認します。の場合-3、ユーザーは投票の削除の対象になっているため、をインクリメントします*(b-1)。それ以外の場合は、デクリメントします*hash。それはだ場合は、今 -3、ユーザーはただいるなる 3つの出現後に投票除去の対象なので、増分*(b-1)によって3。
- この後、文字を逆順(
zto 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ループの戻り値を1箇所で再利用できることを認識しました。
編集 2、1796 →1791:セル6〜95を使用する代わりに、負の数のセルに小数桁を格納すると(–1以降)、プログラムはわずかに小さくなります。追加ボーナスとして、プログラムは10票に制限されなくなりました!
編集3、1791→1771:*(ch = l + 95) to の結果を割り当てる代わりにv、今度はそれを割り当ててから、while条件にq割り当てv = qを移動し、コードを1777バイトにします。その後の位置を交換qし、vので、テープにq今よりも1より一般的ですv。
編集 4、1771 →1762:ダウ。hash0ではなく1に初期化すると、9バイト短くなります。ハッシュコードはもう1つになりましたが、問題ではありません。
編集5、1762→1745:私は初期化した場合qやr1ではなく0に、私はいくつかの振りかけるしなければならない-1場所でのが右のそれを作るために、そしてすべて相殺するようだ-ことを除いてwhile v { --v; [...] }、ループが今1回の少ない反復を実行する必要があります、これwhile --v { [...] }は26文字短いということでできます。
編集6、1745→1736:の代わりに{ r = 1; ++q }、と書くことができますq = *((r = 1)+1)+1。これqは、可変スロット#2 にあるという事実に依存しています。スロット#1にある場合、これはさらに短くなりますが、プログラム全体は全体的に長くなります。
編集 7、1745 →1727:編集6を元に戻し、代わりに数字のASCIIコードを計算する式に最も内側のwhileループをインライン化することで保存を達成しました。 )に変更((++r) - 11) ? r :し(r - 10) ? ++r :ます。
編集 8、1727 →1626:ハッシュ計算を修正しました。現在は、whileループが1つ少なくなっています。セルの位置は、実際の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 。