前途和同事


76

曾经幻想创建像#brexit#brangelina这样的很酷的Twitter标签吗?这高尔夫适合你。


编写一个程序,接受两个字符串A和B作为输入,并根据以下算法合并它们:

  1. nA中的元音组数(例如,在位置3和位置5 britain有2个元音组)。 iai
    • 如果n = 1:从第一个元音组位置截断A(例如:bill=> b
    • 如果n> 1:从n-1第n个元音组位置开始截断A (例如:programming=> progrbritain=> br
  2. 删除B开头的所有辅音(jennifer=> ennifer
  3. 连接修改后的A和B

元音是aeiou; 辅音是bcdfghjklmnpqrstvwxyz

输入值

您可以假设输入字符串是小写字母,并且至少包含一个元音和一个辅音。

例子

brad + angelina      => brangelina
britain + exit       => brexit
ben + jennifer       => bennifer
brangelina + exit    => brangelexit
bill + hillary       => billary
angelina + brad      => angelad
programming + puzzle => progruzzle
code + golf          => colf
out + go             => o

65
新的测试用例?donald trump
Stewie Griffin

5
这些本质上是portmanteaus
mbomb007 '16


1
@ETHproductions这似乎产生了许多不同的组合,例如Django + Angular = Djular
Pureferret

什么是“第n-1个元音组位置”
l4m2,18年

Answers:


24

Ruby,44 43 40 +1 = 41字节

+1字节的-p标志。接受STDIN上以空格分隔的输入。
-1字节感谢Martin Ender
-2字节感谢histocrat

sub /([aeiou]+([^aeiou]*)){,2} \g<2>/,""

在线尝试!

GNU sed,39 37 +1 = 38字节

+1字节的-E标志。接受STDIN上以空格分隔的输入。
-1字节感谢Martin Ender

s/([aeiou]+[^aeiou]*){,2} [^aeiou]*//

在线尝试!

不要将其作为单独的答案发布,因为它实际上是相同的解决方案。


好的正则表达式!介意我在JS答案中使用它的一部分吗?
ETHproductions 2013年

当然,发疯。
约旦

3
您可以通过捕获[^aeiou]作为子表达式的内容来使正则表达式更多一些:/([aeiou]+([^aeiou]*)){,2} \g<2>/
histocrat

5
划掉

1
@Anko参见此答案中的 “特殊调用” 。TL; DR:除默认调用外,仅计数字节。Ruby的默认调用为ruby -e "..."。为此ruby -pe "...",它只增加一个字节。
约旦

12

MATL,31个 30字节

t13Y2XJmFwhdl=fql_):)itJmYsg)h

在线尝试

说明

t       % Implicitly grab the input and duplicate it
13Y2    % Push the string literal 'aeiouAEIOU'
XJ      % Store this in clipboard J for later use
m       % Check which characters from the input are vowels (true for vowel)
Fwh     % Prepend FALSE to this logical array
dl=     % Compute the difference and find where we went from not-vowel to vowel
f       % Find the indices of these transitions
q       % Subtract 1 to get the location of the last consonant in each transition
l_)     % Get the next-to-last one of these
:)      % Grab the first string up to this location

% Now for the second component!

it      % Explicitly grab the input and duplicate
J       % Retrieve the string literal 'aeiouAEIOU' from clipboard J
m       % Find where the vowels are (true for vowel)
Ys      % Compute the cumulative sum along the array. The result will be 0
        % for all characters before the first vowel and non-zero after
g)      % Convert to logical and use this as an index so any characters
        % after the first value are retrieved

% Now to combine them

h       % Horizontally concatenate the first and second pieces together
        % Implicitly display the result

1
我总是支持开心的代码
Andras Deak

12

JavaScript(ES6),81 73 72字节

@Jordan节省了8个字节,@ DavidConrad节省了1个字节

a=>b=>a.match(/.*?(?=(?:[aeiou]+[^aeiou]*){1,2}$)/)+b.match(/[aeiou].*/)

即使.match返回一个数组,也array+array将返回一个字符串,其中字符串的内容是串联的(即[0]+[1]return "01")。

测试片段

Jordan出色的Ruby解决方案在JS中为53个字节:

x=>x.replace(/([aeiou]+[^aeiou]*){1,2} [^aeiou]*/,"")

也许可以扔掉比赛位并使用替换?
科纳·奥布莱恩

@ ConorO'Brien有点像在偷乔丹的答案:/
ETHproductions

您从字面上读懂我的想法。,是的,这是真的
康纳尔奥布莱恩

1
柯里(a,b)=>a=>b=>节省1个字节。
戴维·康拉德

7

果冻23 22 字节

eۯcT
ǵḟ‘-ị’
Ç⁸ḣ⁹ÑḢ⁹ṫ

在线试用

怎么样?

eۯcT    - Link 1, vowel indexes: s   e.g. "colouring"
  Øc     - yield vowels, "AEIOUaeiou"
e€       - in for each                     [0,1,0,1,1,0,1,0,0]
    T    - truthy indexes (1-based)        [2,4,5,7]

ǵḟ‘-ị’  - Link 2, n-1th or only vowel group index start - 1: s
 µ       - monadic chain separation
Ç        - call last link (1) as a monad   [2,4,5,7]
   ‘     - increment                       [3,5,6,8]
  ḟ      - filter out                      [2,4,7]
    -    - -1
     ị   - index value                     [4]
               (Jelly is 1-based and has modular indexing,
                so the last but one item is at index -1,
                and when there is only 1 item in the list it is also at index -1)
      ’  - decrement                       [3]

Ç⁸ḣ⁹ÑḢ⁹ṫ - Main link: a, b                      e.g. "colouring", "pencils"
Ç        - call last link (2) as a monad with a      [3]
 ⁸       - link's left argument, a
  ḣ      - head a[:y]                                "col"
   ⁹  ⁹  - link's right argument, b
    Ñ    - call next link (1) as a monad                          [2,5]
     Ḣ   - pop head                                               [2]
       ṫ - tail b[y-1:]                                           "encils"
         - implicit print                            "colencils"

精美的解释!
Pureferret

5

PowerShell v2 +,76个字节

param($n,$m)($n-replace'([aeiou]+[^aeiou]*){1,2}$')+($m-replace'^[^aeiou]*')

显然,这是一个流行的正则表达式... ;-)

使用-replace运算符提取适当的片段,然后将结果字符串连接在一起。在第一个$上添加a 以确保我们拉出字符串的结尾,^在第二个上添加a 以确保我们拉出字符串的前面。


4

视网膜,35字节

([aeiou]+[^aeiou]*){1,2} [^aeiou]*

在线尝试!(第一行启用换行分隔的测试套件。)

只需删除第一行中所有正则表达式的匹配项即可。


1
有计划增加元音和非元音类吗?;-)
ETHproductions 2016年

@ETHproductions如果我不愿意实现自己的regex风格(或者至少将它标记化,以便可以将其转换为.NET regex),请确定!:P
马丁·恩德

Ruby可以进行模式反向引用(可以匹配不同字符序列的相同模式)。这些在这里很有用。例如,/^((\(\g<1>\))*)$/在Ruby中,匹配的括号由匹配。
John Dvorak

1
@JanDvorak太糟糕了Retina是用.NET编写的,是吗?;)我确实考虑过将它与github.com/ltrzesniewski/pcre-net捆绑在一起,以便您可以切换口味,但是还没有解决,而且其他一些功能也越来越依赖于.NET特定的匹配行为。
马丁·恩德

1
是时候放弃.net特定行为并用Ruby重写所有内容了?Ruby还是更好:-)
John Dvorak

4

肉桂胶,23个字节

0000000: 64d3 884e 4ccd cc2f 8dd5 8e8e 8330 b434  d..NL../.....0.4
0000010: b108 d92b c0d9 00                        ...+...

在线尝试。

说明

这会解压缩为d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*,从而d删除与该正则表达式匹配的所有内容。(请注意,d([aeiou]+[^aeiou]*){,2} [^aeiou]*由于缺少重复的压缩元素,约旦的高尔夫球手会压缩到24个字节。)


d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*更短吗?
ETHproductions 2016年

@ETHproductions我尝试过,它是相同的字节数:(
意大利面条

3

PHP,95字节

$t="aeiou]";echo($p=preg_filter)("#([$t+[^$t*){1,2}$#","",$argv[1]).$p("#^[^$t*#","",$argv[2]);

使用preg_match而不是preg_filter 110字节

$t="aeiou]";($p=preg_match)("#(.*?)([$t+[^$t*){1,2}$#",$argv[1],$m);$p("#[$t.*#",$argv[2],$n);echo$m[1].$n[0];

1
您可以使用+代替{1,2}
泰特斯(Titus)

@Titus更重要的是消除1例的错误,现在我可以尝试高尔夫球下来
约尔格Hülsermann

使用$v=aeiou;保存3个。
泰特斯(Titus)2016年

@Titus我有相同的想法,但有一点点变化。谢谢你
约尔格Hülsermann


2

Perl 5,39个字节

38,加1 -pe代替-e

s/([aeiou]+[^aeiou]*){1,2} [^aeiou]*//

帽子小费。


与链接到内部的sed答案相同,但我们也可以在Perl中使用它。
msh210 '16

2

Python 2,139字节

n=lambda a,b:a[:a.index(([l for l in[[l,"!"][i!=0and a[i-1]in v]for i,l in enumerate(a)]if l in v]*2)[-2])]+b[sorted([(b+v).index(c)for c in v])[0]:]

这个很难。

在repl.it上查看


2

Lithp,65个字节

#X::((replace X (regex "([aeiou]+[^aeiou]*){1,2} [^aeiou]*") ""))

在我的Lisp-ish函数式编程语言中,这基本上是上述JavaScript答案的一部分。

用法示例:

(
    % Note, you can define this as a function, or assign it to a variable
    % and use the call function instead.
    (def f #X::((replace X (regex "([aeiou]+[^aeiou]*){1,2} [^aeiou]*") "")))
    (print (f "programming puzzle"))
)

尚无在线翻译。我会尽快提供的。没什么困难,我的语言是用JavaScript编写的。

相反,此难题解决方案被实现为我的语言的一个有效示例。可以使用以下命令运行它:

node run.js l_src/progruzzle-colf.lithp

2

Haskell,111108字节

v x=elem x"aeiou"
d=dropWhile
e=d v
k=d$not.v
r=reverse
f a|c<-e.k.e.k$a,""/=c=c|1<3=e.k$a
a!b=(r.f.r)a++k b

这个非正则表达式解决方案的时间比预期的要长。不管怎样,Ideone。



1

Japt,18个字节

r/\v+\V*){1,2} \V*

在线尝试!

短JS解决方案的直接端口,而后者又是约旦Ruby解决方案的端口。

这个怎么运作

Ur/\v+\V*){1,2} \V*/

Ur    Replace on the input...
/\v+\V*){1,2} \V*/  this regex with empty string.
      \v == [AEIOUaeiou], \V == [^AEIOUaeiou], `g` flag is on by default in Japt
      so the uncompressed regex is roughly /([aeiou]+[^aeiou]*){1,2} [^aeiou]*/g.
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.