J言語には、定数を指定するための非常に愚かな構文があります。特に、1つのクールな機能、つまり任意のベースで記述できる機能に焦点を当てたいと思います。
任意の数字と英数字の文字列を記述XbY
するX
とY
、JはY
ベースX
番号として解釈されます。ここで0
through 9
は通常の意味を持ち、throughは10〜35 a
をz
表します。
そして、私がX
数字を言うとき、私は数字を意味します。この質問の目的のためにX
、正の整数に制限しますが、Jでは、負の数、分数、複素数など何でも使用できます。
奇妙な事はことであるあなただけの0から35までの数字を使用することができ、使用可能な記号のあなたのコレクションが構成されているので、お使いのベース-どんな数字としてのみ 0-9とAZの。
問題
この方法を使用して、2,933,774,030,998のようなゴルフマジックナンバーを支援するプログラムが必要です。まあ、大丈夫、そんなに大きくないかもしれません、私はあなたに簡単に行きます。そう...
あなたの仕事は(通常大きい)進数を取るプログラムまたは機能記述することです
N
1及び4,294,967,295(= 2との間に32の形の最短表現入力として-1)、及び出力/戻りXbY
、X
正の整数であるとY
されています英数字(0〜9およびa〜z、大文字と小文字を区別しない)で構成Y
され、X
等しいと解釈される文字列N
。すべての表現
XbY
表現の長さがの桁数以上である場合、代わりにN
出力しN
ます。他のすべての関係では、最短表現の空でないサブセットを出力できます。
これはコードゴルフですので、短いほど良いです。
テストケース
Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
5 | 5
|
10000000 | 79bkmom 82bibhi 85bgo75 99bauua 577buld
| 620bq9k 999baka
|
10000030 | 85bgo7z
|
10000031 | 10000031
|
12345678 | 76bs9va 79bp3cw 82bmw54 86bjzky 641buui
|
34307000 | 99bzzzz
|
34307001 | 34307001
|
1557626714 | 84bvo07e 87brgzpt 99bglush 420blaze
|
1892332260 | 35bzzzzzz 36bvan8x0 37brapre5 38bnxkbfe 40bij7rqk
| 41bgdrm7f 42bek5su0 45bablf30 49b6ycriz 56b3onmfs
| 57b38f9gx 62b244244 69b1expkf 71b13xbj3
|
2147483647 | 36bzik0zj 38br3y91l 39bnvabca 42bgi5of1 48b8kq3qv
(= 2^31-1) | 53b578t6k 63b2akka1 1022b2cof 1023b2661 10922bio7
| 16382b8wv 16383b8g7 32764b2gv 32765b2ch 32766b287
| 32767b241
|
2147483648 | 512bg000 8192bw00
|
4294967295 | 45bnchvmu 60b5vo6sf 71b2r1708 84b12mxf3 112brx8iv
(= 2^32-1) | 126bh5aa3 254b18owf 255b14640 1023b4cc3 13107bpa0
| 16383bgwf 21844b9of 21845b960 32765b4oz 32766b4gf
| 32767b483 65530b1cz 65531b1ao 65532b18f 65533b168
| 65534b143 65535b120
表現が数値と等しいかどうかわからない場合は、Try It OnlineのようなJインタープリターを使用できます。入力するだけでstdout 0":87brgzpt
、Jは吐き出します1557626714
。この問題は大文字と小文字を区別しませんが、Jは小文字のみを受け入れることに注意してください。
おそらく役立つ理論
- すべてのため
N
未満10,000,000、小数表現は、他のような短いようであり、したがってのみ許容される出力です。何かを保存するには、新しいベースで少なくとも4桁短くする必要があり、ベースが99より大きい場合はさらに短くする必要があります。 - の平方根の天井までのベースをチェックするだけで十分です
N
。任意の大きなベースの場合はB、N
ベースの中で最も二桁になりますBあなたは、有効な最初の数字と何かが周りにあり得るでしょう、初めてので、B ≈N
/ 35。ただし、そのサイズでは、常に少なくとも10進表現と同じ大きさになるため、試しても意味がありません。それを念頭に置いて、ceil(sqrt(この問題を解決するためにあなたに尋ねる最大数))= 65536。 - 36未満のベースに表現がある場合、ベース36の表現は少なくとも同じくらい短くなります。したがって、36未満の
35bzzzzzz
基数で誤って短い解を心配する必要はありません。たとえば、1,892,332,260 の表現では、その基数に通常とは異なる数字を使用します36bvan8x0
が、長さは同じです。