从给定的字符串中提取一个字符串


17

系统会为您提供一个字符串和两个字符。您必须在字符串中这些字符之间打印字符串。

输入项

输入将首先包含一个字符串(非空或null)。在下一行中,将有两个字符,中间用空格隔开。

挑战

返回两个字符之间的字符串

Hello! What's your name?
! ?

应该导致输出:

" What's your name"

规则

  • 该字符串不得超过100个字符,并且仅包含范围(空格)至~(波浪号)(字符代码0x20至0x7E(包括0x20至0x7E))的ASCII字符。请参阅ASCII表以获取参考。
  • 您必须从stdin(或最接近的替代方法)获取输入。
  • 输出应用引号(")括起来。
  • 您可以编写完整的程序或接受输入并输出最终字符串的函数
  • 这两个字符将仅包含(空格)至~(波浪号)范围内的ASCII字符(字符代码0x20至0x7E(包括0x20至0x7E))。请参阅ASCII表以获取参考。
  • 不能保证两个字符都在字符串中。
  • 如果在字符串中找不到任何字符,请打印"null"
  • 如果在一个字符串中找到多个字符(除非两个字符相同),请打印"null"
  • 如果两个字符都相同,请打印字符串"null"

测试用例

1)

<HTML>code</HTML>
> <                       --> "null"

2)

What's what?
' '                       --> "null"

3)

abcdefghijklmnopqrstuvwxyz
n k                       --> "lm"

4)

Testing...
e T                       --> ""

5)

Last test-case
  -                       --> "test"

计分

这是代码高尔夫球,因此最短的提交(以字节为单位)获胜。


3
字符可以在字符串中以相反的顺序出现吗?如果是这样,那可以使用一个测试用例。
马丁·恩德

1
如果子字符串包含一个"?我们是否应该仅用另一对引号将其括起来而不关心它?
jimmy23013

@MartinBüttner,是的。请参见经过编辑的测试用例3。感谢您提醒我有关此内容
Spikatrix

@ user23013,是的。示例性输入:one"two-three \n" -输出:"two"\n是换行)
Spikatrix

1
我不喜欢标记不出现或多次出现的复杂细节。我认为,通过对输入进行更强有力的保证,可以更轻松地解决该问题。
xnor 2015年

Answers:


3

CJam,34 33 32字节

'"l_l2%&2*2>NerN/0"null"t_,3=='"

CJam解释器中在线尝试。

理念

  1. 从第2行中删除第二个字符。

  2. 形成一个字符串,其中包含两行都相同的所有字符的单个副本。

  3. 重复生成的字符串两次,并丢弃其前两个字符。

    这将导致一个两个字符的字符串(如果第2行中的字符不同并且都出现在第1行中)或一个空字符串。

  4. 用换行符替换第1行中结果字符串的字符。

  5. 在换行符处分割第1行。

    如果数组恰好包含三个块,则结果数组的第二个元素将是所需的字符串。

  6. 用字符串null替换数组的第一个元素。

  7. 如果长度为3,则检索数组的第二个元素,否则返回第一个。

  8. 在双引号之前和之后添加双引号。

'"       e# Push a double quote.
l_       e# Read one line from STDIN. Push a copy.
l2%      e# Read one line from STDIN. Only keep characters at odd indexes.
&        e# Intersect both strings.
2*2>     e# Repeat the intersection twice and discard the first two characters.
Ner      e# Replace the characters of the resulting string with linefeeds.
N/       e# Split the result at linefeeds.
0"null"t e# Replace the first element of the resulting array with "null".
_,3=     e# Push 1 if the length of the array is 3 and 0 otherwise.
=        e# Retrieve the corresponding element from the array.
'"       e# Push a double quote.

2

CJam,38个字节

l:Tl2%f#_W-$2,=2,@f#$~T<>1>"null"?'"_o

太长...

说明

l:T             e# Read a line and store in T.
l2%             e# Read the two characters into a list.
f#              e# Find each character in the list of two characters.
_W-             e# Copy and remove not found results.
$2,=            e# Sort and check if the result is exactly [0 1].
                e# If true:
2,@f#           e# Find 0 and 1 in the original results.
$               e# Sort.
~T<>            e# Get a slice of T between the two positions (left-closed).
1>              e# Remove the first character.
                e# If false:
"null"          e# The string "null".
?               e# End if.
'"_o            e# Append a quote and output another quote at the beginning.

2

Pyth,37 36 34字节

p?"null"njT9m/zd{J%2wt:z.uSmxzdJNN

感谢@isaacg节省了两个字节。

在线尝试:Pyth编译器/执行器

说明:

                                     implicit: z = first input line
                    w                second input line
                  %2                 only use every 2nd char
                 J                   and store in J
                {J                   set(J), gets rid of duplicates
            m/zd                     count the number of appearances of each char
        njT1                         != [1, 1] ([1,1] is 10 in base 9)
 ?      njT1m/zd{J%2w                ... if [1,1] != number of appearances else ...
  "null"                               string "null"
                           mxzdJ     find the index for each char
                          S          sort the indices
                      :z.u           take the substring of z using these indices
                     t               remove the first char

p                               NN  print '"' + ... + '"'

*2]1比短[1 1),并且- ... 1还短。
isaacg

@isaacg -...1不起作用,因为我还需要检查是否确实有两个数字。
2015年

2
我只是想一种3个字符的方式[1 1)jT9
isaacg

2

Python 3,149个字节

s,i=input(),input();a,b=s.find(i[0]),s.find(i[2]);print('"'+('null',[s[a+1:b],s[b+1:a]][b<a])[(s.count(i[0])==s.count(i[2])==1)*(a!=b)*(a*b>-1)]+'"')

非高尔夫版本:

string, chars = input(), input()
a, b = string.find(chars[0]), string.find(chars[2])

    if string.count(chars[0]) == string.count(chars[2]) == 1 and a!=b and a*b>-1:
        if b<a:
            print('"' + string[b+1:a] + '"')
        else:
            print('"' + string[a+1:b] + '"')
else:
    print('"null"')

这是我在这里的第一个答案,因此非常感谢技巧和批评。


2

红宝石,108 95 94

->s,f,l{a,b=[f,l].map{|u|(f==l||s.count(u)>1)&&abort('"null"');s.index u}.minmax;p s[a+1...b]}

对于非高尔夫版本

def between(string, first, last)
    left, right = [first, last].map do |substring|
        abort('"null"') if first == last || string.count(substring) != 1
        string.index(substring)
    end.minmax
    p string[left + 1 ... right]
end

为什么在这里运行您的代码时为什么看不到任何输出?
Spikatrix

@CoolGuy这是一个未命名的功能,所以你需要调用它->s,f,l{begin a,b=[f,l].map{|u|raise if f==l||s.count(u)>1;s.index u}.minmax;p s[a+1...b];rescue;p'null'end}["<html>test</html>",?>,?<][...]在到底是什么调用函数。
blutorange

@blutorange,好。这样的工作正常,但是如何测试最后一个测试用例?
Spikatrix

@CoolGuy使用通常带引号的字符串:->s,f,l{begin a,b=[f,l].map{|u|raise if f==l||s.count(u)>1;s.index u}.minmax;p s[a+1...b];rescue;p'null'end}["Last test-case"," ","-"]
blutorange

raise您可以raise用未定义的变量(例如_或)代替,而不用引发错误y。这将引发NameError。另外,我认为您可以在不进行明确救援的情况下节省更多字节:->s,f,l{a,b=[f,l].map{|u|(f==l||s.count(u)!=1)&&p('null')&&exit;s.index u}.minmax;p s[a+1...b]}
blutorange

1

C,192字节

f(){char b[101],c,d,*p,*t;scanf("%[^\n]%*c%c%*c%c",b,&c,&d);p=strchr(b,c);t=strchr(b,d);c==d||!p||!t||strchr(p+1,c)||strchr(t+1,d)?puts("\"null\""):printf("\"%s\"",p<t?(*t=0,p+1):(*p=0,t+1));}

取消程式码:

f()
{
    char b[101],c,d,*p,*t; //Variables

    scanf("%[^\n]%*c%c%*c%c",b,&c,&d); //Scan input

    p=strchr(b,c);
    t=strchr(b,d); //Find occurrence of characters

    c==d         ||  //If both characters are the same
    !p           ||  //If no occurrence of first character found
    !t           ||  //If no occurrence of second character found
    strchr(p+1,c)||  //If two occurrence of first character found
    strchr(t+1,d) ?  //If two occurrence of second character found
    puts("\"null\"") //Print "null"
                  :  //else
    printf("\"%s\"",p<t?(*t=0,p+1):(*p=0,t+1)); //print the string
}

在这里测试


1

Python 3,172个字节

x=input()
a=input()
a,b=a[0],a[2]
if(a!=b)&(x.count(b)==x.count(a)==1):
 if x.index(a)>x.index(b):q=a;a=b;b=q
 print('"'+x.split(a)[1].split(b)[0]+'"')
else:print('"null"')

1

Javascript(ES6),125 123字节

想法从@ edc65的解决方案中严重失窃。

[a,,b]=(p=prompt)(s=p()),[,c,d,e,,f]=s.split(RegExp('(['+(a+b).replace(/\W/g,'\\$&')+'])'))
p('"'+(!e||f||c==e?null:d)+'"')


我最喜欢[a,,b]=,下次再用。由于正则表达式很麻烦,因此这里提供了无正则表达式的解决方案:[a,,b]=(P=prompt)(s=P()), P((s=s.split(a)).length==2& (s=[].concat(...s.map(s=>s.split(b)))).length==3 ?``"${s[1]}"``:null)
edc65 2015年

(最后一个字符串已模板化,很难在注释中添加)
edc65

1

Python,161字节

import re,sys
s,p=sys.stdin
m=re.match('[^%s]*([%s])([^%s]*)([%s])[^%s]*$'%((p[0]+p[2],)*5),s)
if m:g=m.group
print'"null"'if not m or g(1)==g(3)else'"'+g(2)+'"'

该解决方案通常只使用正则表达式来提取字符串。为了适应字母可以在任一方向上匹配的情况,匹配部分的开始和结尾允许使用任意一个字母。检查实际匹配的字母是否不同会排除相同的字母被匹配两次,以及输入中的两个字母是否相同。

这是我第一次尝试使用Python回答问题。因此,欢迎就可能的改进提供反馈。我特别有一种感觉,必须有一种方法可以使打印语句中的条件更短。


1

Python 3,155个字节

s,n,a,b=[input(),'null']+list(input())[::2];q,w=[s.find(a),s.find(b)];print('"'+{0>1:n,0<1:s[min(q,w)+1:max(q,w)],a==b:n}[s.count(a)==s.count(b)==1]+'"')

在线尝试


1

golflua,132个字节

L=I.r()I,J=I.r():m("(.) (.)")i=L:f(I)j=L:f(J)K,c=L:g(I,'')_,b=K:g(J,'')?i>j i,j=j,i$w((i==j|c+b!=2)&'"null"'|'"'..L:s(i+1,j-1)..'"')

答案很丑。输入位有点粗糙(需要两行,第一行是字符串,第二行是slice字符)。查找标记的位置很简单,但是太长了,无法与其他答案竞争。输出非常简单。一个等效的Lua程序是

Line1 = io.read()
Line2 = io.read()
I,J = Line2:match("(.) (.)")     -- boobs return the char flags
i = Line1:find(I)                -- find location of flags
j = Line1:find(J)
K,c = Line1:gsub(I,'')           -- replace flag w/ empty & store in K
_,b = K:gsub(J,'')               -- taking K ensures single flags fail
if i > j then i,j=j,i end        -- ensure we start low to high
if i==j or not (c+b == 2) then   -- if i & j are the same or not 2 counts, fail
   print('"null"')
else                             -- print the string otherwise
   print('"'..Line1:sub(i+1,j-1)..'"')
end

有没有可以测试高尔夫版本的在线编译器?
Spikatrix 2015年

我不相信有在线版本,但是源代码可用。它是Lua的1:1映射(不是Lua的解释或翻译),因此可以在ideone上测试Lua代码。
凯尔·卡诺斯

0

Perl,65岁

#!perl -p0
$.*=s/\Q$1/
/g while s/ ?(.)\z//;/
(.*)
/;$_=$.-1?null:"\"$1\""

这要求输入的第二行中没有换行符。


不错的工作。但是,这似乎缺少双引号。
丹尼斯

@丹尼斯,固定的。我误解了这个例子。
2015年

1
它仍然缺少null此案的引号。
丹尼斯
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.