J语言的语法非常笨拙,无法指定常量。我想特别关注一个很酷的功能:以任意基础编写的能力。
如果编写XbY
用于X
任何数量和Y
字母数字的任意字符串,则J将解释Y
作为基础X
数,其中0
通过9
具有其通常的含义,a
通过z
通过35表示10。
当我说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和az,不区分大小写),并Y
以baseX
equals 解释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
如果您不确定某个表示形式是否等于某个数字,则可以使用任何J解释器,例如Try It Online上的解释器。只需输入,stdout 0":87brgzpt
J就会吐出来1557626714
。请注意,即使此问题不区分大小写,J也只接受小写字母。
一些可能有用的理论
- 对于所有
N
小于10,000,000的数据,十进制表示形式与其他任何形式的表示形式一样短,因此是唯一可接受的输出。要保存任何内容,您需要在新的基数中至少短四位,如果基数大于99,则至少四位。 - 只需检查基数,直到的平方根的上限即可
N
。对于任何较大的基地乙,N
将在基地最两位数乙,所以第一次你会得到一个有效的第一个数字是什么在左右乙 ≈N
/ 35。但是以这种大小,您将始终至少与小数表示形式一样大,因此尝试没有任何意义。请记住,ceil(sqrt(我会问您最大的数字来解决这个问题))= 65536。 - 如果基数小于36的任何表示形式,则基数36的表示形式将至少短。因此,您不必担心基数小于36的情况下意外地短解决方案。例如,
35bzzzzzz
1,892,332,260 的表示使用该基数的不寻常数字,但36bvan8x0
长度相同。