编写一个程序,将2个字符串作为输入,并返回最长的公共前缀。这是code-golf,所以最短字节的答案会获胜。
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
global
和GLOSSARY
return glo
或''
?
编写一个程序,将2个字符串作为输入,并返回最长的公共前缀。这是code-golf,所以最短字节的答案会获胜。
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
global
和GLOSSARY
return glo
或''
?
Answers:
e@F._MQ
感谢@isaacg关闭1个字节
接受带引号且逗号分隔的输入,例如"abc", "acc"
。当结果为空字符串时,将退出错误(但将stdout留空)。如果那是不可接受的,则添加2个字节用于#e@F._MQq
e@F._MQ : implicit Q = eval(input)
._MQ : Map the prefix operator onto both inputs
@F : Fold the setwise intersection operator over those lists
e : Take the last such element, the prefixes are always made from shortest
: to longest, so this always gives the longest matching prefix
e|@F._M.z]k
。
#...q
要少一个字节,我将在完整代码中进行编辑,我想这很令人困惑
"abc", "def"
,你可以使用Q
,而不是.z
#include<iostream>
int i;main(){std::string s,t;std::cin>>s>>t;for(;s[i]==t[i];std::cout<<s[i++]);}
从中读取两个字符串stdin
,从其中一个字符串中打印当前位置的字符,而当前位置的字符等于另一字符串中相同位置的字符。
感谢Zereges节省了一个字节。
for
声明的一种美丽而可怕的使用……
int i
在全局空间中创建来保存一个字节(这样它将被初始化为0)
l_q.-{}#<
这将读取两行以Unix样式的行结尾的字符串,即<string>\n<string>\n
。
感谢-1字节的@MartinBüttner和-2字节的@ jimmy23013!
在CJam解释器中在线尝试。
l_ e# Read a line (w/o trailing LF) from STDIN and push a copy.
q e# Read another line from STDIN (with trailing LF).
e# The trailing linefeed makes sure that the lines are not equal.
.- e# Perform vectorized character subtraction. This yields 0 for equal
e# characters, a non-zero value for two different characters, and the
e# characters themselves (truthy) for the tail of the longer string.
{}# e# Find the index of the first truthy element.
< e# Keep that many characters from the first string.
l_q.-
。
我非常努力...;(
设置x为(显示对话框““默认答案”“)的文本返回 设置返回到(显示对话框““默认答案”“)的文本 设置为1 设置为“” 在x的项n = a的项n时重复 将o设置为o&x的项目n 将n设置为n + 1 结束 Ø
我想看到的AppleScript能如何退出这个功能,并且人是它没有内置字符串比较。
tell app "System Events" to <something>
。这是有趣的,看看它是如何与这种东西的交易,虽然。@ kirbyfan64sos
using System.Linq;class a{static void Main(string[]a){a[0].Take(a[1].Length).TakeWhile((t,i)=>a[1][i]==t).ToList().ForEach(System.Console.Write);}}
我知道这并不十分竞争。我只是想看看它会是什么样子。
编辑:感谢Ash Burlakzenko,Berend和Dennis_E
using System.*
吗?
.ForEach(x=>Console.Write(x))
可以缩短为.ForEach(Console.Write)
using System.Collections.Generic;
是不必要的。通过删除中的空格来减少一个字节string[] a
。
Contains
没有必要。2-您可以通过删除using System;
并说出System.Console.Write;
3- 来节省一些字节。3-由于此错误,此代码对于输入“ aab”,“ aaab”返回错误的结果(“ a”)IndexOf
。我能想到的最短修补程序是使用a[0].Take(a[1].Length)
147个字节长:“使用System.Linq; class a {静态void Main(string [] a){a [0] .Take(a [1] .Length).TakeWhile ((c,i)=> a [1] [i] == c).ToList()。ForEach(System.Console.Write);}}“
(lambda(a b)(subseq a 0(mismatch a b)))
接受两个字符串参数,确定它们之间不同的索引i,然后返回从0到i的子字符串。
19个字节,再加上1个-E
标志,而不是-e
:
say<>=~/^(.*).* \1/
这是从Digital Trauma的sed答案中无耻复制的。它假定输入是几个单词,两个单词之间没有空格(或第一个单词之前),并且它们之间有一个空格。
更新:
不建议使用thisSuitIsBlack-pe
,以节省字节(谢谢!):
($_)=/^(.*).* \1/
然后,Luk Storms建议使用-nE
以下方法来保存另一个字节(谢谢!):
say/^(.*).* \1/
(我数-E
为一个字节而不是标准的-e
,但-n
还是-p
两个。我的印象是,这是SOP在这里。)
多亏了FryAmTheEggman,节省了31个字节。DSM节省了8条。
r=''
for x,y in zip(input(),input()):
if x==y:r+=x
else:break
print(r)
zip
什么?:D
input()
S IN的zip
并保存a
和b
约束力。
def f(w):[print(end=c[c!=d])for c,d in zip(*w)]
该函数接受w
两个单词的列表,并在错误终止之前打印公共前缀。
Python 3的print
功能使您可以使用彼此齐平的字符串来打印字符串print(end=c)
(感谢Sp3000使用这种较短的语法节省了3个字节)。这会反复从单词中取出两个字母,然后打印第一个字母。索引c[c!=d]
产生界外错误,其中c!=d
当遇到两个不相等的字母时终止执行。
一个显式的for循环比列表理解长一个char:
def f(w):
for c,d in zip(*w):print(end=c[c!=d])
print(end=c[c!=d])
?
print
为可选参数,这意味着只能使用end参数来调用它,并且其中可能包含字符串。总的来说,这是一个非常有用的技巧。你应该给个小费。
使用与kirbyfan64sos相同的想法。不幸的是,尽管马丁声称最终的“匹配”模式将具有一种打印捕获组的方式,但尚未实现。否则,(.*).* \1
可以将其与2个字节一起用于一些尚不存在的配置字符串选项。
(.*).* \1.*
$1
每行将放入其自己的文件,每个其他文件增加1个字节。或者,在带有-s
标志的单个文件中运行。
\1
确保两个词都以相同的前缀开头。因此,无论多么贪婪(.*)
,\1
都是一样的。
{(+/&\=/(&/#:'x)#'x)#*x}
找到每个字符串的最小长度。((&/#:'x)
)。将每个字符串修剪到该长度(#'x
)。然后比较,涂抹和求和结果序列:
=/("globaa";"glossa")
1 1 1 0 0 1
&\=/("globaa";"glossa")
1 1 1 0 0 0
+/&\=/("globaa";"glossa")
3
最后,从提供的字符串(#*x
)的第一个中提取那么多字符。
实际上:
f: {(+/&\=/(&/#:'x)#'x)#*x};
f'(("global";"glossary")
("department";"depart")
("glove";"dove")
("aaa";"aaaaa")
("identical";"identical")
("aca";"aba"))
("glo"
"depart"
()
"aaa"
"identical"
,"a")
f(a,b)=(c="";for(i,j)=zip(a,b) i!=j?break:(c*=string(i))end;c)
取消高尔夫:
function f(a::AbstractString, b::AbstractString)
# Initialize an output string
c = ""
# Iterate over the pairs of characters in a and b,
# truncated to the shorter of the two lengths
for (i, j) in zip(a, b)
if i == j
# If they match, append to the output string
c *= string(i)
else
# Otherwise stop everything!
break
end
end
return c
end
由于xnor,解决了一个问题(付出了14字节的巨额费用)!
main(int c,char *a[]){for(char *x=a[1],*y=a[2];*x==*y++;putchar(*x++));}
与此答案类似,但更短且符合规范(从stdin输入)。
#include<stdio.h>
,这对于程序进行编译是必需的。
main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59字节)。
定义一个接受2个字符串作为输入,输出到命令窗口的函数
function t(a,b);a(1:find([diff(char(a,b)) 1],1)-1)
此解决方案适用于任何字符串,输出
ans =
Empty string: 1-by-0
如果没有给出匹配。
可以使用脚本而不是函数(使用局部变量a,b)(-16字节)来打高尔夫球。
所以得到34个字节
a(1:find([diff(char(a,b)) 1],1)-1)
函数样式(似乎是公认的样式)产生
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
(感谢@Stewie Griffin)
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
。=)
我想出了两个基于STDIN的值,它们基于Perl 5的答案。
lines~~/(.*).*' '$0/;say ~$0
lines~~/:s(.*).* $0/;say ~$0
第一个在输入之间恰好需要一个空格,而另一个在输入之间至少需要一个空格字符。
这比我尝试从命令行获取值的第一件事要短得多。
say [~] map ->($a,$b){$a eq$b&&$a||last},[Z] @*ARGS».comb # 58 bytes
甚至是lambda版本:
{[~] map ->($a,$b){$a eq$b&&$a||last},[Z] @_».comb} # 52 bytes
尽管这很容易调整,以使其接受任意数量的输入字符串,但仅需一次敲击。
{[~] map ->@b {([eq] @b)&&@b[0]||last},[Z] @_».comb} # 53 bytes
# ┗━┛ ┗━━━━━━━┛ ┗━━━┛
my &common-prefix = {[~] map ->@b {([eq] @b)&&@b[0]||last},[Z] @_».comb}
say common-prefix <department depart>; # "depart"
say common-prefix; # ""
say common-prefix <department depart depot deprecated dependant>; # "dep"
# This code does not work directly with a single argument, so you have
# to give it an itemized List or Array, containing a single element.
say common-prefix $('department',); # "department"
# another option would be to replace `@_` with `(@_,)`
Japt是Ja vaScri pt的缩写。口译员
Um$(X,Y)=>$A&&X==VgY ?X:A=P
(字符串进入输入框,如下所示: "global" "glossary"
)
此代码与以下JS完全等效:
A=10;(U,V)=>U.split``.map((X,Y)=>A&&X==V[Y]?X:A="").join``
我还没有实现匿名功能,这就是$...$
它的用途:在切换到JS时,美元符号之间的任何内容都保持不变。添加函数后,此21字节的代码就足够了:
UmXY{A&&X==VgY ?X:A=P
在实现更多功能之后,理想情况下将为18个字节:
UmXY{AxX=VgY ?X:AP
建议欢迎!
因此事实证明,该程序在现代Japt中只有15个字节:
¡A©X¥VgY ?X:A=P
y!=XdYpf)
(-2字节,感谢Giuseppe)
y % implicitly input the two strings, then duplicate the
% first one into the stack again
% stack: ['department' 'deported' 'department']
! % transpose the last string into a column vector
= % broadcast equality check - gives back a matrix comparing
% every letter in first input with the letters in the second
Xd % diagonal of the matrix - comparison result of each letter with
% only corresponding letter in the other string
% stack: ['department' [1; 1; 1; 0; 1; 1; 0; 0;]]
Yp % cumulative product (so only initial sequence of 1s remains
% 1s, others become 0)
% stack: ['department' [1; 1; 1; 0; 0; 0; 0; 0;]]
f % find the indices of the 1s
) % index at those elements so we get those letters out
% (implicit) convert to string and display
y
想法非常好,我尝试过使用类似Initial的方法,iti
而不是1Gw
,但是没有想到要使用y
。
for a,b in zip(*input()):print(1/0if a!=b else a),
输入被视为两个字符串:
"global", "glossary"
输出是每个字符后跟一个空格;希望这不是问题。但是,如果是这样,我将编辑答案。
g l o
"global" , "glossary"
(两个单独的字符串)给出的。字母后面还有多少其他答案?@ThomasKwa
print(exit()if a!=b else a,end='')
样 我不知道这是否行得通,但可能会
并不壮观,但能胜任:
$a=$argv;while($a[1][$i]==$a[2][$i])echo$a[1][$i++];
接受两个命令行参数:
php prefix.php department depart
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
-另一个仅PHP7的解决方案(最好我提供@ 50个字节)<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
-确保您的编辑器处于ascii模式,重要的~ÿ
是不要将其转换为unicode。
"aca", "aba"
。