第三弦


45

给定两个字符串,输出第三个字符串,该字符串不等于两个输入中的任何一个,但与两个输入中的任何一个具有相同的长度(以字符为单位)。保证至少有一个有效输出。

测试用例

引用测试用例以表明它们是字符串。输出是许多可能之一。

input, input -> output

"test", "test" -> "tttt"
"do", "don't" -> "dnut_"
"ye s", "yes" -> "fals"
"yes", "yes" -> "noo"
"maybe", "mayue" -> "false"
"false", "false" -> "truee"
"false", "true" -> "fatr"
"1", "" -> "0"
"", "t" -> "s"
"", "abcabc" -> "testst"
"abcdefghijklmnopqrstuvwxyz", "aaaaaaaaaaaaaaaaaaaaaaaaaa" -> "zbcdefghijklmnopqrstuvwxya"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" -> "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"

规则

  • 您可以选择输入域,但是它必须至少由可打印的ASCII组成,并且输出域必须与输入域相同。
  • 输入长度可以相同或不同。
  • 输出必须以1的概率有效;也就是说,您可能会生成一个随机字符串,直到一个有效为止(理论上,您可能会无限循环),但是您不能只输出一个随机字符串并希望它是有效的。请注意,这意味着您的输出不必是确定性的。
  • 允许自动尾随换行符,但它们不会计入输出的长度。
  • 由于有关内存错误的问题,它必须在60秒内工作,输入长度为6。一个可行的方法,理论上适用于更长的字符串,这是可以的,但是现代计算机上输入长度的“内存错误” 4是无效的。

这是,因此最短答案以字节为单位。


14
这似乎是该站点上又一个有趣的新问题类别,对人类来说很容易,对计算机来说却很困难。因为计算机不善于发散思维!这让我想起了海绵宝宝那集,他整夜整夜都在写一篇关于不要停下来做什么的论文。
geokavel

2
我了解输出域可以是输入域的子集,是吗?
路易斯·门多

2
好问题!我喜欢。
isaacg

2
@Quelklef不,这与两个输入没有什么不同。
与Orjan约翰森

3
我建议将“”,“ 1”添加为测试用例,因为我刚刚意识到我的回答对此没有用,即使它适用于所有提供的测试用例
Slow loris

Answers:



14

Haskell,43个字节

x!y=[s|s<-(<$max x y)<$>"abc",s/=x,s/=y]!!0

采用最大(按字典顺序)字符串,我们知道它是非空的;使用;将所有字符替换为“ a”,“ b”和“ c”之一<$。并返回两者都不是的第一个。我认为这类似于Neil的木炭答案和/或geokavel的CJam答案

(我潜伏了一段时间,但这是我第一次在此站点上回答;嗨!)


9

Brainfuck,97个字节

+>+[-,[>>,]<<[<<]>]>>[>]<<<[<]>[<+>>[-<+<+>>][>]<[->+<]<[-]>>>++<[<]>[.>>]>[>>]]>[+[>]+[<]>[.>>]]

在线运行代码(请注意,必须在右下角选择“动态内存”)

很棒的挑战!我以为这很琐碎,但最终却非常困难。我一直回过头来,因为我觉得应该有一些优雅的20字节BF解决方案。在这一点上,我很高兴我(貌似)在BF中完全使用了它。

输入被视为str1+ \0+ str2,其中字符串是连续的非零1字节字符。

返回(first str1 + first str2) or (first str1 + 1) or 2。这个算法是由出色的@ØrjanJohansen(大概)基于我(破碎的)原始算法想到的。

评论:

# Let (Kn) be the nth character of K
# Let (^) designate the pointer
# Let F be the first string inputted
# Let S be the second string inputted

+>+[-  # Twice do
,[>>,]  # Input string (characters separated by 1)
<<[<<]>  # Go to left of beginning of string
]>  # End on first character of second string
# If second string is null we will end one too far to the left
>[>]<<<[<]>  # If first string is null we will end there too
# We will use this to do flow control

[  # Only run if both strings were non null

# Tape:    S0 ' F0 ' S1 ' F1 ' S2 ' F2 ' etc
#          ^

<+>>  # Let F0* = F0 (plus) 1  (is 1 as of now; F0 will be added later)
[-<+<+>>] # Let A = S0 (plus) F0
# A may or may not be zero
# F0* may or may not be zero
# Tape:    F0* ' A ' 0  ' S1 ' F1 ' etc
#                ^

[>]<[->+<]  # Let B = A or F0*
# B may or may not be zero
<[-]>>  # Clear F0*
# Tape:     0 ' B ' 0 ' S1 ' F1 ' etc    (if A was zero)
#               ^
# OR        0 ' 0 ' B ' s1 ' F1 ' etc    (if A was nonzero)
#                   ^

# Let C = B or 2
# C will be guaranteed nonzero and unique from S0 and F0
>++<[<]>  # Create C
[.>>]  # Print (using S or F; does not matter)

>[>>]  # End on a zero cells with zero cells all to the right
# This is necessary for the coming functionality
# also as to not loop
]  # End non null block

# Now we consider if one of the strings was null
# Tape:    0 ' E0 ' 0 ' E1 ' etc    (if one string was null)
#          ^
# Tape:    0 '  0 ' 0 '  0 ' etc    (if neither string was null)
#          ^
# Where E is F or S (we don't care)

>[  # Execute only if one string was null

+  # Let A = E0 (plus) 1
# A may or many not be zero
# Tape: 0 ' A ' 0 ' E1 ' etc
#           ^

[>]+[<]>  # Let B = A or 1
# B is guaranteed nonzero and != E0
# Tape: 0 ' B ' ? ' E1 ' 0 ' E2 ' etc
#           ^

[.>>]  # Print

# End on zero cell as not to loop
]  # End null block

您的“事实”是错误的,例如a=2b=1。您需要添加而不是减去。
与Orjan约翰森

我认为您可以S通过>在开头添加一个空位问题来解决此空问题,然后[<]>在最左边的字节上进行操作S-如果该位非零,则不执行任何操作,否则将切换字符串。
与Orjan约翰森

@ØrjanJohansen哦,您是对的,它可以相等b。但是不是a
Quelklef

@ØrjanJohansen啊,看来行得通!好想法!
Quelklef

@ØrjanJohansen跟进这个事实:因为!= a只有这样,如果我打印S/0, S/1, ...而不是打印S/0, F/1, ...就可以了。
Quelklef

6

果冻,8 字节

żḟ@€ØAZḢ

在线尝试!

怎么样?

żḟ@€ØAZḢ - Link: list of characters, a; list of characters, b
ż        - zip a and b
    ØA   - uppercase alphabet
 ḟ@€     - filter discard for €ach (swap @rguments)
      Z  - transpose the result
       Ḣ - head

它返回B TIO
Jonathan Allan

无论如何,算法都不应该,不确定您做了什么。
乔纳森·艾伦

请不要介意我的大脑显然搞小动作,因为我没有看到任何X在那里...
埃里克Outgolfer

5

Python 3中62个 47 57 54 51字节

编辑: -5字节感谢@ Mr.Xcoder

编辑: +10字节修复错误

编辑: -3字节感谢@betaveros

编辑: -3字节通过使用max代替pop

lambda x,y:max({*"abc"}-{x[:1],y[:1]})+max(x,y)[1:]

在线尝试!


{"a","b","c"}==> {*"abc"}57个字节
Xcoder先生17年

(x[1:]or y[1:])==> max(x,y)[1:]
betaveros

或者(x or y)[1:],我认为您只需要避免使用空字符串。
betaveros

顺便说一句,很可惜Python 2没有加星标的设置文字,因为我真的很想{*"abc"}打入{*`id`}……
betaveros

*len(x or y)代替保存1 +max(x,y)[1:]
Chas Brown

4

木炭,22字节

FEα×ι⌈⟦LθLη⟧¿¬№⟦θη⟧ιPι

在线尝试!链接是详细版本的代码。生成所有大写字符的字符串,这些字符串重复到较长的输入长度,并套印所有未出现在输入中的字符。换句话说,ZZZ...除非是输入之一,否则输出通常是,YYY...除非是其他输入,否则它就是XXX...


4

Mathematica,111个字节

(c=Characters;a=#2;While[f=Alphabet[]~RandomChoice~Length@#;f==#||f==c@a]&[#&@@c@{##}~MaximalBy~Length];""<>f)&


在线尝试(使用ctrl + v粘贴代码,将输入放在末尾,然后按shift + Enter)

输入

[“考验我”]

thanx @不是用于检查和打高尔夫球的树 -21个字节


如何再次在线测试?
斯蒂芬

添加了链接+信息
J42161217

@Jenny_mathy如果第一个字符串为空字符串,似乎会失败
Halvard Hummel

2
@HalvardHummel固定!
J42161217

1
@Notatree已修复。如果您认为“轻松打高尔夫球”是
拒绝投票

4

Perl 6的38 30个字节

{(1 x.max.comb...*∉$_).tail}

在线尝试!

匿名代码块,将输入作为两个字符串的列表,并从输入中返回的第一个数字1111...以非空的1s形式返回。

说明:

{                          }   # Anonymous code block
  1 x.max.comb                 # String multiply 1 by the size of the non-empty string
              ...              # Create a sequence increasing by 1
                 *∉$_          # Until the number is not in the input
 (                   ).tail    # And take the last number

增量器是bigint类型,还是对于足够大的字符串会溢出?
GammaFunction

1
@GammaFunction在Perl 6中,默认数字类型是Int,它具有无限的精度
Jo King

不错哦。我本打算使它适应Zsh,但long long不幸的是它使用了。
GammaFunction

:可以通过仅取第一的00,而不是计数和序列修剪6个字节..,111 ...,22 .. tio.run/...
菲尔ħ

@PhilH好主意!我通过遵循顺序概念将其缩短了一些时间
Jo King

4

Zsh51 47 37 36字节

-4通过使用内置阵列字节argv-10通过使用前缀移除,字节RC_EXPAND_PARAM-1通过内联括号扩展字节。

<<<${${${:-{1..3}${^@#?}}:|argv}[1]}

在线尝试!

首先,这是一个了不起的挑战,在着陆之前,我经历了很多想法。

<<<${${${:-{1..3}${^@#?}}:|argv}[1]}
       ${:-             }            # empty fallback
                 ${ @#?}             # remove first character from each parameter
                 ${^@  }             # enable brace expansion (set -P)
           {1..3}${^@#?}             # expand to 1foo 2foo 3foo 1bar 2bar 3bar
     ${                  :|argv}     # Set difference with 'argv'
   ${                           [1]} # The first found element
<<<                                  # print to stdout

@*不是标识符,所以${ :|@}${ :|*}不能正常工作,因此使用的${ :|argv}

该方法最多可以处理93个输入,并找到唯一的94个。只需将其替换为{1..3}最大可能范围{~..!}

Zsh48 47字节*

for ((;$#i<${#${1:-$2}}||$@[(I)$i];i++)):
<<<$i

在线尝试!

JoKing的Perl 6提交提供了全新的方法,但是由于整数大小的限制,该方法不适用于大字符串(n> 20)。$@[(I)$i]是对最大索引的反向数组查找,如果在命令行参数中未找到$ i,它将输出零(在算术扩展中错误)。


3

MATL,12字节

c"1Y2@X-1)&h

输入是包含可打印ASCII字符的字符串的单元格数组。输出由字母组成'ABC',因此属于输入域。

在线尝试!

说明

输出与最长的输入字符串一样长。它的第n个字符是第一个字母'ABC',不同于两个输入字符串的第n个字符。

c        % Concatenate the two strings vertically. If one is shorter it is
         % right-padded with spaces. Gives a 2-row character matrix
"        % For each column
  1Y2    %   Push the string 'ABC...Z' (the upper-case letters)
  @      %   Push current column
  X-     %   Set difference
  1)     %   Get first character
  &h     %   Horizontally concatenate the results so far
         % End (implicit). Display stack (implicit)

3

Haskell,56 52 48字节

x#y|_:t<-max x y=[c:t|c<-"abc",c:t/=x,c:t/=y]!!0

在线尝试!

更换的最大与两个输入串的第一个字符ab以及c与选择第一个是从两个输入串不同。



3

ES6,54个字节

a=>b=>(a[0]+b[0]|0?'a':9-(a[0]^b[0]))+(a||b).substr(1)

欢迎来到PPCG :)
Shaggy

3

Pyth,7 8字节

hC-LG.T

1字节感谢Jakube

测试套件

我们使用.T保留长度的转置而不是C截断转置的方式,以便它可用于一个字符串为空的输入。

给定两个字符串作为元组,我们对它们进行转置(.T),然后通过将低位字母中的字符减去来映射字符对或单个字符的映射-LG,然后使用来对未使用字符的字符串列表进行转置C,然后返回第一个这样的字符串h。对于每个位置,它由第一个字母组成,该字母按字母顺序排列,不在任何一个字符串中。



2

Ruby,56个字节

->a,b{a,b=b,a if a<b;a[0]=([?a,?b,?c]-[a[0],b[0]])[0];a}

2

Pyth23 22字节

+.)-.{<G3.{,<Q1<KE1t|K

在这里尝试!

Pyth,22个字节

+eS-.{<G3.{,<Q1<KE1t|K

测试套件!


说明

+.)-.{<G3.{,<Q1<KE1t|K  - Full program.
      <G3               - Yields the String "abc"; Alphabet[:3].
    .{                  - Set formed by the above.
         .{,<Q1<KE1     - Set formed by input_1[:1] and input_2[:1]
   -                    - Set subtraction.
 .)                     - Pop the last element.
+                       - Append.
                   t|K  - input_1[1:] or input_2[1:], relying on the result of Logical OR.

2

Perl 5,82 79字节

sub{$_=$_[0];$_=$_[1]||$_ if/^(xz*)?$/;s/[^z]/z/||s/./y/;$_ eq$_[1]&&s/./x/;$_}

将输入作为两个单独的参数并返回第三个字符串。

该子例程尝试产生一个与第一个字符串非常相似的字符串,但是第一个非z字符用a代替z。然后,如果发现输入中的一个实际上是全数字的序列,则可以根据需要通过用y或替换第一个字符来处理特殊情况。xz


2

Perl 5、68个字节

sub{$_="a"x length $_[0]||$_[1];$_++while $_ eq$_[0]||$_ eq$_[1];$_}

说明:

  • 以(字母“ a”的字符串与第一个字符串一样长)或第二个字符串(如果为假,即零长度)开头
  • 不断增加直到它与第一和第二个都不同

从“ a”开始是为了避免增加到Perl延长字符串的位置;只有两个字符串以避免与它相同,它不会溢出。

执行:

perl -e '$s = ' -E 'sub{$_="a"x length $_[0]||$_[1];$_++while $_ eq$_[0]||$_ eq$_[1];$_}' -E ';say $s->("z", "true")'

1
我认为如果第一个字符串为空,这将失败。
与Orjan约翰森

非常正确!固定。
Ed

2

C(gcc)70 65岁 73 67 61个字节

该函数需要提供的字符串是可变的(即数组或动态分配)。

f(a,b)char*a,*b;{a=*a?a:b;*a=*a>70?33:99;*a+=*a==*b;puts(a);}

在线尝试!

适用于标准ASCII范围

说明:

a=*a?a:b           // If a is empty, point to b instead
*a=*a>70?33:99     // Choose a different value for the 1st character of a,
                   // while giving enough space to increment it without 
                   // going back to its previous value
*a+=*a==*b         // Increment the 1st character of a if the arbitrary
                   // chosen value is equal to the value of the 1st 
                   // character of b
puts(a)            // Outputs a

1
我不确定是否可以给它提供一个符合规则的一致输入域。如果*a==255*b==0呢?
与Orjan约翰森

你是对的。已修复,费用为8个字节。
scottinet

那里。我不能让这种解决方案具有与Java相同的字节数!:-)
scottinet

如果您不限于可打印的ASCII,则可以使用一位数字。
与Orjan约翰森

除非我误解了,否则将违反这一挑战规则。
scottinet

2

R,89 67字节

@Giuseppe保存9个字节,@ user2390246保存13个字节

功能

function(x,y)sub("^.",letters[!letters%in%substr(c(x,y),1,1)][1],x)

演示

# define function
f <- function(x,y)sub("^.",letters[!letters%in%substr(c(x,y),1,1)][1],x)

# test cases
f("test","test")
[1] "aest"
f("do","don't")
[1] "ao"
f("ye s","yes")
[1] "ae s"
f("maybe","mayue")
[1] "aaybe"
f("false","false")
[1] "aalse"
f("false","true")
[1] "aalse"
f("1","")
[1] "a"
f("art","bug")
[1] "crt"

1
您可以将xy放在同一substr命令中。此外,花括号return也没有必要:function(x,y)sub("^.",letters[!letters%in%substr(c(x,y),1,1)][1],x)
user2390246 '17

1
return因为这是一个函数,所以您可以摆脱它,而由于它是一个衬里,您可以摆脱括号。
朱塞佩

射击,我刚刚意识到f("","1")yields "",它等于第一个输入...也许应该将其添加为另一个测试用例
慢loris

2

Java 8,119字节

Lambda(咖喱)从String到Lambda从StringString。分配给Function<String, Function<String, String>>

s->t->{String r=s.length()>t.length()?s:t;while((s+t).contains(r))r=r.substring(1)+(char)(Math.random()*128);return r;}

在线试用

非高尔夫λ

s ->
    t -> {
        String r = s.length() > t.length() ? s : t;
        while ((s + t).contains(r))
            r = r.substring(1) + (char) (Math.random() * 128);
        return r;
    }

此解决方案将随机ASCII字符旋转到更长的字符串中,直到满足所需条件为止。输入为UTF-8,输出为ASCII。

我不知道Unicode的详细细节,但是对我来说,当附加项附加char前面的代码点以形成单个代码单元时,此解决方案可能会失败,这似乎是可行的。如果对此有更多了解的人可以验证这一点,那么我将输入域更改为ASCII。

Java 8,126字节

与上述相同。

s->t->{String r;for(byte[]o=(s.length()>t.length()?s:t).getBytes();(s+t).contains(r=new String(o));o[0]%=128)o[0]++;return r;}

在线试用

非高尔夫λ

s ->
    t -> {
        String r;
        for (
            byte[] o = (s.length() > t.length() ? s : t).getBytes();
            (s + t).contains(r = new String(o));
            o[0] %= 128
        )
            o[0]++;
        return r;
    }

这将增加较长字符串的第一个字节,并以ASCII换行,直到满足所需条件为止。输入和输出是ASCII字符串。


1
根据第三个测试用例的输出,它将输出长度为三的字符串:在线尝试!
斯蒂芬,

啊废话 现在,我将不得不学习Unicode的工作原理,以便在不增加字节数的情况下解决此问题……
Jakob


2

Bash,115个 .. 77个字节

将第一个(非空)输入字符串的第一个char替换为1,2,3,直到未找到匹配的输入。在线尝试!

-9,-12,-9,-8字节全部归功于GammaFunction

x="${1:-$2}"
for s in {1..3}"${x:1}"
{ [[ $s = @($1|$2) ]]||break;}
echo "$s"

(与原始版本相比有很大的改进...


1
好方法!您可以在最后一行使用=||,并使用${x:-empty_fallback}删除起始三元。此外,对于尾随空格,确实需要在结尾回波上加上引号。强制性TIO
GammaFunction


1
我喜欢您要使用的功能shift可以将我的方法分为两种不同的方法
GammaFunction




1

Japt,17个字节

;B¬£ñl g1 çXÃkU v

将字母重复A-Z到较长输入的长度,删除输入中的值,并获得数组中的第一项。

在线尝试!

旧解决方案,18字节

;@!UøX}a@ñl g1 çBö

在线尝试!

从字母表中选择一个随机字符,并将其重复到较长的输入字符串的长度,直到输入中不存在该字符为止。


失败["abcdefghijklmnopqrstuvwxyz", "AAAAAAAAAAAAAAAAAAAAAAAAAA"]。多次运行时,它返回了"AAAAAAAAAAAAAAAAAAAAAAAAAA"(就像我的Pyth回答一样,直到我解决了)
Xcoder先生17年

对于[“ D”,“”],失败。如果您运行几次,将得到“ D”字样
J42161217 '17

谢谢,我发现有些情况我没有经过测试。固定为仅+1个字节。
贾斯汀·马里纳

Ì应该可以代替g1 保存2个字节(在2个元素array g1=中gJ),但是使用Ì时似乎存在一个错误;
毛茸茸的

@Shaggy是的,我认为原因J不再-1是因为将其;更改为,。这就是为什么我1首先使用它的原因。
贾斯汀·马里纳

1

Python 3,74 73字节

-1字节感谢Step Hen

def f(x,y,i=1):
 while i*10<10**len(x or y)or str(i)in x+y:i*=2
 print(i)

打印长度与非零长度的第一个输入相同长度的最小整数。


将字节保存i为默认函数参数:def f(x,y,i=1):。我认为您可以节省另一个字节,while10*i但我不确定。
斯蒂芬,

您可以替换 while i*10<10**len(x or y)or str(i)in x+ywhile i<10**~-len(x or y)or str(i)in x+y72个字节
Xcoder先生,17年

:你还可以使用递归来保存字节f=lambda x,y,i=1:(i<10**~-len(x or y)or str(i)in x+y)and f(x,y,i*2)or i71个字节
Xcoder先生

1

Python 2,77个字节

a=input()
b=ord(a[0][0])+1
if b==ord(a[1][0]):b+=1
print unichr(b)+a[0][1:-1]

我认为它具有一定的潜力。这个想法是,它将1添加到第一个字符串的第一个字符中,然后检查其他输入的第一个字符是否相同。

**请注意,^不能处理0个长度的字符串,因此在此长度下它实际上并不起作用。

这是长度为0的超长解决方案

146字节

a=input()
def c(i):print unichr(ord(a[i][0])+1)+a[i][1:];exit();
for x in range(2):if len(a[x-1])<1:c(x)
if a[0]==a[1]:c(1)
print a[1][0]+a[0][1:]

任何改进将不胜感激!


1

CJam,31 30 23字节

q~:A:e>,3,sf*{A\f=:+!}=

将可打印的ASCII作为输入。输出与输入字符串之一长度相同的0、1或2字符串。逻辑是其中一个不能是任何一个输入字符串!

在线尝试

q~:A    e# Store input array as var 'A'
:e>,    e# Take the length of the lexicographically greater string in the input array
3,s     e# Generate "012"
f*      e# Repeat each number as many times as the longer string length, yielding something like ["000","111","222"]
{       e# Search array of number strings for first that returns true for this function
A\f=    e# Map each string in the input array to whether it equals the current number string (0,1)
:+!     e# Add up the array of bits and take the logical not. This returns true iff both array values were not equal to the current number string.
}=      e# Return the first number string that returns true.

任何人都只有在数组中的两个位均为假(NOR)时才对如何返回真有任何想法?目前,我正在做:+!
geokavel

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.