培养文化人


24

这个挑战是由文化模因(Men of Culture)引起的

该模因涉及空白部分的原始标题,

啊,我知道你也是一个有文化的人。

使它看起来好像角色在说其他话。

您面临的挑战是编写一个程序,该程序在给定输入的情况下,说明如何将原始句子空白以实现输入字符串。

规则:

  • 使用一个-字符表示一个空白字符。
  • 您不得添加其他字母来获得输入字符串
  • 您可以将字符串比较视为不区分大小写
  • 您可能会忽略字符串比较中的空格
  • 如果不可能进行替换,则输出一个伪造的值。
  • 您也可以用替换多余的空格-,尽管不是必需的。
  • 在可能有多个解决方案的地方,您可以输出其中任何一个。

测试用例:

基本:

模因示例1

Ah, I see you're a well.
> Ah, I see you're a --- -- ------- -- well.

模因范例2

Ah, I see well.
> Ah, I see ------ - --- -- ------- -- well.

边缘情况1:

What did you just say about me, you little
> false

边缘案例2(已编辑):

*no input*
> --- - --- ------ - --- -- ------- -- -----

中间:

模因范例3

Ah, I see you're Orwell.
> Ah, I see you're - --- o- -----r- -- well.

模因范例4

Ah, ymca.
> Ah, - --- y----- - m-- -- c------ a- ----.

模因范例5

Ah, a manual.
> Ah, - --- ------ a man -- -u----- a- --l-.
OR: > Ah, - --- ------ a man -- -u----- a- ---l.

更难:

模因范例6

tea.
> --- - --- ------ - --- -- ---t--e a- ----.

模因范例7

eeeee
> --- - -ee -----e - --- -- ------e -- -e---

TL; DR:给定输入字符串,输出一个字符串,该字符串表示使用“-”表示空白字符应如何修改原始字符串以适合输入字符串。如果无法替换,则输出一个伪造的值。

编码高尔夫,因此以字节为单位的最短编码获胜。

编辑:澄清

  • 忽略字符串比较中的空格意味着您可以在比较字符串之前删除空格。例如,输入Ah, a manualAh , a manual被视为相等。, ' .必须保留其他标点符号。同样对于输出,Ah, a manual等于Ah, amanual

  • 替代冗余空白是指原始标题中存在的空格。您不需要将它们替换为“-”,但是如果替换了网,则可以得到更多的分数。


您的“奥威尔”输出似乎是错误的:您在第一个中将“ f”更改为“ r”。
Draconis '18

2
应该"Ah,<5 SPACES HERE>a manual."产生什么输出?
林恩

3
如果无法替换,则输出一个伪造的值。好吧,强烈建议不要进行输入验证。
暴民埃里克(Erik the Outgolfer)

2
您可能会将字符串比较视为不区分大小写,这是否意味着我们必须将输入视为不区分大小写,或者我们可以在需要的任何情况下都接受输入?另外,通过您可能会忽略字符串比较中的空格,是否表示我们必须忽略空格?什么是“冗余空白”?
暴民埃里克(Erik the Outgolfer)'18年

1
我认为“输入验证”是可以理解的,@ EriktheOutgolfer
Conor O'Brien

Answers:


6

> <>,94字节

"vAh, I see you're a Man of Culture as well.
0/i~ <r
!\:?!^:}=0={:@*:@"-"$?$~}$:@?
<>~i+0)?;>o

在线尝试!

区分大小写,不忽略空格或标点符号,如果输入无效,则输出空字符串。如果您想尝试其他字符串,则只需修改。之后的第一行"v,只要它不包含"或空字节即可。


5

视网膜0.8.2,117字节

^.
¶Ah, I see you're a Man of Culture as well.¶$&
{+i`¶(\W|(\w))(.*¶)(?(2)\W*\2)
$1¶$3
}1`¶\w
-¶
.*¶.*¶.*\w.*|¶.*¶.*

在线尝试!通过区分大小写可以节省1个字节。通过返回--, - --- ---'-- - --- -- ------- -- ----.空输入可以节省3个字节。说明:

^.
¶Ah, I see you're a Man of Culture as well.¶$&

将所需的文本放在输入的前面。

{+i`¶(\W|(\w))(.*¶)(?(2)\W*\2)
$1¶$3

从所需的文本到结果尽可能多的字符。如果字符是字母,则还需要匹配输入中的下一个字母,然后将其删除。

}1`¶\w
-¶

如果输入中没有匹配的字母,请将其更改为a,-然后重试。

.*¶.*¶.*\w.*|¶.*¶.*

如果输入中仍有字母,请删除所有内容,否则删除输入的其余部分。


5

果冻58 55 48 45字节

“¬²Ẉ,ȷCIbƝɼeỴƤ/ɓIŒ;ṫṚS⁶_ŀỤ ṂB⁾÷ƈ»Ḣ”-1ị⁼ɗ?@€xṆ

在线尝试!


更具可读性的版本:

“Ah, I see you're a man of culture as well.”Ḣ”-1ị⁼ɗ?@€xṆ

字符串压缩分解:

Ah, I{short: see}{short: you}'re a{short: man} of{long: culture} as{short: we}ll.

3

Python 2中126个 114字节

i=input()
r=''
for c in"Ah, I see you're a man of culture as well.":x=c==i[:1];r+=c*x or'-';i=i[x:]
print(i=='')*r

在线尝试!


Python 2中108个 106字节

输入是字符列表。

lambda i:''.join(c==`i`[2:3]and i.pop(0)or'-'for c in"Ah, I see you're a man of culture as well.")*(i==[])

在线尝试!


难道(i=='')不是(i<' ')(使用选项卡,最低可打印字符)?
乔纳森·弗雷希

@JonathanFrech这是可能的,但是都是7个字节
ovs

好吧,您在这里有个要点...
Jonathan Frech

2

JavaScript(Node.js)122120字节

x=>"Ah, I see you're a Man of Culture as well.".replace(/./g,c=>c>' '?/^(.)\1/i.test(c+x)?(x=x.slice(1).trim``,c):'-':c)

在线尝试!

说明:

x =>                 // It takes in 'x' as parameter for function a string
    "Ah, I see you're a Man of Culture as well.". // What the actual is 
            .replace(                             // Now we are gonna replace 
                    /./g,     // selects everything 
                    c =>      // lambda function with param c
                        c > ' ' ?                 
                        /^(.)\1/i.test(           // does it all
                            c + x ) ?            // checks if there is a match
                            (x=x.slice(1). // returns everything from 1 to end in an array
                                trim`` ,   // removes whitespaces
                            c : '-' : c)   // and done

可以进一步减少,但也用'-'替换空格。如果可以接受的话

JavaScript(Node.js),112字节

x=>"Ah, I see you're a Man of Culture as well.".replace(/./g,c=>/^(.)\1/i.test(c+x)?(x=x.slice(1).trim``,c):'-')

在线尝试!

进一步简化,仅将给定字符串之后的空格替换为“-”。

JavaScript(Node.js),105字节

x=>"Ah, I see you're a Man of Culture as well.".replace(/./g,c=>/^(.)\1/i.test(c+x)?(x=x.slice(1),c):'-')

在线尝试!


1
不要通过What did you just say about me, you little
l4m2

我没有为What did you just say about me, you little测试用例的代码获得正确的输出。您的程序产生的--- - --- ------ - --- -- ------- -- w----输出不是挑战规范所要求的。
0'


2

Brain-Flak764600字节

(((<>)))([]((((((([][][]()){}[]){})[][]){}))[[]()])[][]())([[]](([][](([][]){})[]){}())[[]])(([()()][]([[]]([()]([[]](((([()][][][])[]){}[]())[])[]))()()()))[[]])((([[][][]]((([](([()()()][]){})){})(()()()()){}())[[]])[]){})((((()((([][]){}())((()()()){}){})[[][][]]))){}{}())((()(((([]()()()())())){}{}()())[[][]]){}[])(([(()()()){}](((((()()()()){}[]))){}{}))((()()){}()){})(([()][][]([()()()][])))(((([][][]())[([]()()){}()])[]())[[]])([[]]((([]()())(()()()()){}){})()()()){([{}]<>({})){(<{}(((((()()()()())){}{})){}{})>)}{}(<({}<(<()>)<>{({}<>)<>}>{})>)<>{({}<>)<>}{}<>}{}<>{{{}}<>}<>{({}<>)<>}<>

在线尝试!

得益于Jo King的巨大改进,特别是在弦结构方面,还对主体进行了一些逻辑上的调整。他的解释

它区分大小写(因此“啊,我看你是奥威尔。”不匹配,但是“啊,我看你是奥威尔。”匹配),输入中的空格不会被忽略,原始字符串中不匹配的空格是转换为-。据我了解,所有这些都是有效的选择。

说明:

(476 bytes of much improved stack manipulation) #Push string

{ #While string
  ([{}]<>({})) #Check whether the top characters are equal
  {(<{}(((((()()()()())){}{})){}{})>)}{}  #If characters are not equal, push - on top of input
  (<({}<(<()>)<>{({}<>)<>}>{})>)<>{({}<>)<>}{}<>  #Take top of input (either - or matched char) and add to output
}{}
<>{{{}}<>} #Pop both stacks if input is left over
<>{({}<>)<>}<> #Reverse output

您知道,之前有一个问题可以帮助自动为Brain-Flak生成任意测试。我自己提交的内容(经过一些修改)可以将文本减少到506字节
Jo King

经过一些其他改进,我将总数减少到604个字节
Jo King



@JoKing,您似乎非常擅长改善我的Brain-Flak
Kamil Drakari,

2

Haskell中182个 174 172 171 170 169字节

import Data.Char
t=toLower
a!b=(b:)<$>a
""%l=Just$'-'<$l
l@(a:b)%(c:d)|t a==t c=b%d!c|1>0=l%d!'-'
_%_=mempty
(%"Ah, I see you're a man of culture as well.").concat.words

在线尝试!

取消高尔夫:

import Data.Char

template = "Ah, I see you're a man of culture as well."

-- strip spaces
preprocess :: String -> String
preprocess = filter (/=' ')

-- case-insensitive character comparison
a#b = (toLower a) == (toLower b)

strike' :: String -> String -> Maybe String
strike' "" "" = Just ""  -- base case
strike' _ "" = Nothing   -- chars are exhausted, impossible to convert
strike' "" rem = Just $ '-' <$ rem  -- full match, strike rest of chars
strike' cur@(x:xs) (r:rs)
    | x # r     =   (r:) <$> strike' xs rs  -- character matches; pop a char
    | otherwise = ('-':) <$> strike' cur rs -- no match; strike char, don't pop

strike :: String -> Maybe String
strike xs = strike' (preprocess xs) template

1

Prolog(SWI),109字节

[]+[]+[].
I+[B|X]+[C|O]:-(I=[B|J],B=C;I=J,C=45),J+X+O.
I-O:-I+`Ah, I see you're a man of culture as well.`+O.

在线尝试!

区分大小写和空格。的-/2谓词是与第一个参数是所述输入字符串,第二个参数是输出字符串主谓词。


0

JavaScript(Node.js),103个字节

s=>!s[i=0,r="Ah, I see you're a man of culture as well.".replace(/./g,c=>c==s[i]&&++i||c-1?c:'-'),i]&&r

在线尝试!

区分大小写。


0

Pyth,78字节SBCS

V." y°äz µÿéiSs¾ýØC[ócõ!ó5§n"=b.x@zZkIqbN=+kN=hZ.?=+k\-))I<Zlz!z.?k

测试套件
代码中存在不可打印的字符,请参见链接以获取正确的版本。
区分大小写,不忽略空格。


0

Perl -F 5,192个字节

@q="Ah, I see you're a man of culture as well."=~/./g;while($x=shift@F){$x=~/\w/||next;while($_=shift@q){push@r,/\W/?$_:/\Q$x/i?$_:'-';$r[-1]=~/\w/i&&last}@q||last}say!$x&&@r,map/\w/?'-':$_,@q

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.