首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >它在罗马有多久?

它在罗马有多久?
EN

Code Golf用户
提问于 2022-04-19 10:01:01
回答 14查看 4.1K关注 0票数 19

或Fix美国犬舍俱乐部的数据库

正如最近的马特·帕克的视频报道的那样,美国犬类俱乐部允许每个品种的37只狗被分配相同的名称(来源),因为对罗马数字长度的数据库限制。

给定一个整数,您的任务是输出它的罗马表示的长度。

规则

  • 您的输入将是1-3899范围内的整数。
  • 使用标准减法 (so 4=IV9=IX95=XCV99=XCIX)执行对罗马的转换。
  • 这是密码-高尔夫,通常的规则适用。

测试-用例

代码语言:javascript
复制
input  output
1      1
2      2
3      3
4      2
5      1
6      2
9      2
10     1
37     6
38     7
95     3
99     4
288    10
2022   6
3089   9
3899   11
EN

回答 14

Code Golf用户

发布于 2022-04-19 10:41:32

JavaScript (ES6),37字节

代码语言:javascript
复制
f=n=>n&&+"0123212342"[n%10]+f(n/10|0)

在网上试试!

怎么做?

在标准减法表示法中,数字的长度对于单位、几十个、数百个和数千个(最多3000)是相同的。所以我们可以递归地计算总长度。

代码语言:javascript
复制
   | units | tens | 100's | 1000's | length
---+-------+------+-------+--------+--------
 0 | -     | -    | -     | -      |   0
 1 | I     | X    | C     | M      |   1
 2 | II    | XX   | CC    | MM     |   2
 3 | III   | XXX  | CCC   | MMM    |   3
 4 | IV    | XL   | CD    |        |   2
 5 | V     | L    | D     |        |   1
 6 | VI    | LX   | DC    |        |   2
 7 | VII   | LXX  | DCC   |        |   3
 8 | VIII  | LXXX | DCCC  |        |   4
 9 | IX    | XC   | CM    |        |   2

JavaScript (ES6),40字节

这是试图找到一个简短的公式,而不是查找表。但它还是更长。

代码语言:javascript
复制
f=n=>n&&f(n/10|0)+(30%(n%=10)&171/n^n%4)

在网上试试!

36字节

如果我们可以把输入作为数字列表,那么它就会变得更短:

代码语言:javascript
复制
a=>a.map(n=>t+=30%n&171/n^n%4,t=0)|t

在网上试试!

票数 13
EN

Code Golf用户

发布于 2022-04-19 10:04:04

维沙尔,3字节

代码语言:javascript
复制
øṘL

在网上试试!

我喜欢这种东西有内置功能的时候。

解释了

代码语言:javascript
复制
øṘL
øṘ  # Convert input to Roman numerals
  L # and return the length of that.
票数 10
EN

Code Golf用户

发布于 2022-04-19 23:54:12

Python 2,41字节

分别使用计算每个十进制数字长度的@Arnauld的想法x**a%b%5表单中的神奇哈希似乎运行得很好。

代码语言:javascript
复制
f=lambda n:n and(n%10)**24%8684%5+f(n/10)

在网上试试!

其他魔法:

代码语言:javascript
复制
lambda n:sum(7125144/ord(c)%5for c in`n`)   # 41
f=lambda n:n and(n%5+n/5%2>>n%5/4)+f(n/10)  # 42 (has actual strategy)

Python 2,41字节

或者,同样的长度,但谁不喜欢小魔法hash

代码语言:javascript
复制
lambda n:sum(hash(c+'WQDE')%5for c in`n`)

在网上试试!

下面的小C脚本查找所有可能的4字节长后缀作为散列的种子,大约需要1秒钟才能完成。有趣的是,在12个有效的解决方案中,'WQDE'是唯一一个具有所有大写字符的解决方案。如果你想一想,这种情况发生的机会只有26^4/127^4 ~ 0.176%

代码语言:javascript
复制
// https://github.com/python/cpython/blob/v2.7/Objects/stringobject.c#L1263

#include <stdio.h>
#include <time.h>

int py_mod(long long x, int m) { int ret = x % m; return ret >= 0 ? ret : ret + m; }

const long long h[10] = {6144036912055440, 6272037681056595, 6400038450057750, 6528039219058905, 6656039988060060, 6784040757061215, 6912041526062370, 7040042295063525, 7168043064064680, 7296043833065835};
long long h0[10], h1[10], h2[10];

int main() {
    clock_t sclock = clock();
    for (int c0 = 1; c0 < 128; c0++) {
        for (int i0 = 0; i0 < 10; i0++) h0[i0] = (h[i0] ^ c0) * 1000003;
        for (int c1 = 1; c1 < 128; c1++) {
            for (int i1 = 0; i1 < 10; i1++) h1[i1] = (h0[i1] ^ c1) * 1000003;
            for (int c2 = 1; c2 < 128; c2++) {
                for (int i2 = 0; i2 < 10; i2++) h2[i2] = (h1[i2] ^ c2) * 1000003 ^ 5;
                for (int c3 = 1; c3 < 128; c3++) {
                    if (py_mod(h2[0] ^ c3, 5) != 0) continue;
                    if (py_mod(h2[1] ^ c3, 5) != 1) continue;
                    if (py_mod(h2[2] ^ c3, 5) != 2) continue;
                    if (py_mod(h2[3] ^ c3, 5) != 3) continue;
                    if (py_mod(h2[4] ^ c3, 5) != 2) continue;
                    if (py_mod(h2[5] ^ c3, 5) != 1) continue;
                    if (py_mod(h2[6] ^ c3, 5) != 2) continue;
                    if (py_mod(h2[7] ^ c3, 5) != 3) continue;
                    if (py_mod(h2[8] ^ c3, 5) != 4) continue;
                    if (py_mod(h2[9] ^ c3, 5) != 2) continue;
                    printf("found: (%d,%d,%d,%d) [%c%c%c%c]\n",
                        c0, c1, c2, c3, c0, c1, c2, c3);
                }
            }
        }
    }
    printf("Time elapsed: %.3fs\n", (double) (clock() - sclock) / CLOCKS_PER_SEC);
    return 0;
}
票数 7
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/246360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档