首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AoCG2021第18天:剥条

AoCG2021第18天:剥条
EN

Code Golf用户
提问于 2021-12-18 00:12:16
回答 6查看 368关注 0票数 10

Code 2021的出现事件的一部分。有关详细信息,请参阅链接的元帖子。

故事继续从2018年第3天

但你不是布布勒,你是莱克斯!是啊我知道。

经过很长一段时间的混乱,精灵们终于就如何裁剪织物达成了一致。不幸的是,第二天,他们想出了如何利用剩菜-做一个超长的礼物包装带。好吧,如果它能缩小圣诞老人,它也能缩小礼物.

该条的描述是一个ODCF字符串,它恰好是Elvish (完全不是这个精灵)中“上下左右”的第一个字母。将织物分成1cm×1cm正方形单元格,在中间的某个位置选择一个起始单元,然后根据描述四处移动以声明条带。

因此,如果字符串是OOCOFFFDD,您将得到这个条带,从X开始:

代码语言:javascript
复制
OFFF
CO.D
.O.D
.X..

..。除了精灵给你的那条是自相交的,所以它根本不起作用(1平方厘米的布料部分不能神奇地变成2平方厘米--这是物理的,至少在圣诞老人到来之前是这样)。

给定字符串OOCOFFFDDCCCD?是条形自相交的位置:

代码语言:javascript
复制
OFFF
CO.D
C?CD
DX..

为了避免?单元格成为问题,可以通过两种方式获取它的子字符串(给定字符串的一个连续部分):OOCOFFFDDC (删除最后3个字符)和COFFFDDCCCD (删除前两个字符),

代码语言:javascript
复制
OFFF
CO.D
.OCD
.X..

OFFF
CX.D
CCCD
D...

在这两个方案和所有其他备选方案中,上述两个选项中的后者是最长的。

给定一个非空的ODCF字符串,确定其最长子字符串的长度,从中可以生成有效(非自交)条。假设剩余的fabric足够大,足以覆盖输入的任何有效子字符串。

适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。

测试用例

代码语言:javascript
复制
C -> 1
ODD -> 2 (DD)
OOCOFFFDD -> 9 (whole input)
OOCOFFFDDCCCD -> 11 (whole input minus first 2)
OOOFFDCCCDFFFDCOOO -> 12 (minus first 3 and last 3)
EN

回答 6

Code Golf用户

发布于 2021-12-18 06:01:27

木炭,32字节

代码语言:javascript
复制
FLθ«F✂θιF¬℅KK✳⊗⌕FOCκ¹ψ⊞υLKA⎚»I⌈υ

在网上试试!链接是详细的代码版本。解释:

代码语言:javascript
复制
FLθ«

在每个后缀上循环。

代码语言:javascript
复制
F✂θι

循环遍历后缀中的字符。

代码语言:javascript
复制
F¬℅KK

如果脱衣舞条与自己相交就停止。

代码语言:javascript
复制
✳⊗⌕FOCκ¹

将当前单元格标记为条带的一部分,然后移动到下一个单元格应该在的位置。

代码语言:javascript
复制
ψ

确保最后的单元格不是条带的一部分。这将删除错误的单元格,如果条子自相交,但只有计数重要。

代码语言:javascript
复制
⊞υLKA

记录标记为条带一部分的单元格数。

代码语言:javascript
复制

清除画布,为下一个后缀做好准备或输出结果。

代码语言:javascript
复制
»I⌈υ

输出找到的最大可能的条形长度。

票数 3
EN

Code Golf用户

发布于 2021-12-18 00:15:17

帕里/GP,98字节

代码语言:javascript
复制
s->vecmax([vecmin([#[1|k<-[j..p=#s+a=0],p*=a+=I^(Vecsmall(s)[k]%69)]+j-i|j<-[i..#s]])|i<-[1..#s]])

在网上试试!

票数 2
EN

Code Golf用户

发布于 2021-12-18 11:40:38

生锈,150个字节

代码语言:javascript
复制
|i:&str|i.bytes().scan((vec![],[0,0]),|(v,p),c|{v.push(*p);p[c as usize%23&1]+=1-c as i64%2*2;while v.contains(&p){v.remove(0);};Some(v.len())}).max()

在网上试试!

未高尔夫球:

代码语言:javascript
复制
|i: &str| {
    i.bytes()
        .scan((vec![], [0, 0]), |(v, p), c| {
            v.push(*p);
            p[c as usize % 23 & 1] += 1 - c as i64 % 2 * 2;
            while v.contains(&p) {
                v.remove(0);
            }
            Some(v.len())
        })
        .max()
}
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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