読み取り不可、1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577バイト
出力はアルファベットの逆順(z
to 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
。
- この後、文字を逆順(
z
to 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:ダウ。hash
0ではなく1に初期化すると、9バイト短くなります。ハッシュコードはもう1つになりましたが、問題ではありません。
編集5、1762→1745:私は初期化した場合q
やr
1ではなく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 。