指定された文字列から文字列を抽出します


17

文字列と2文字が与えられます。文字列からこれらの文字の間の文字列を印刷する必要があります。

入力

入力には最初に文字列が含まれます(空またはでないnull)。次の行には、スペースで区切られた2つの文字があります。

チャレンジ

2文字の間の文字列を返します

Hello! What's your name?
! ?

結果が出力されるはずです:

" What's your name"

ルール

  • 文字列は100文字以下で、範囲(スペース)から~(チルダ)(文字コード0x20から0x7Eを含む)のASCII文字のみが含まれます。リファレンスについては、ASCIIテーブルを参照してください。
  • stdin(または最も近い代替)から入力を取得する必要があります。
  • 出力はquotes(")で囲む必要があります。
  • 完全なプログラム、または入力を受け取り、最終的な文字列を出力する関数を書くことができます
  • 2つの文字には、範囲(スペース)から~(チルダ)のASCII文字のみが含まれます(文字コード0x20から0x7Eまで)。リファレンスについては、ASCIIテーブルを参照してください。
  • 両方の文字が文字列に含まれるという保証はありません。
  • 文字列に文字が見つからない場合、print "null"
  • 文字列のいずれかの文字が(両方の文字が同じでない限り)文字列で複数回見つかった場合、print "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
部分文字列にaが含まれる場合はどうなり"ますか?別の引用符で囲み、それを気にする必要はありませんか?
jimmy23013

@MartinBüttner、はい。編集したテストケース3を参照してください。そのことを思い出していただきありがとうございます
Spikatrix

@ user23013、はい。例えば入力:one"two-three \n" -出力:"two"\n改行である)
Spikatrix

1
私は、マーカーが何度も表示されない、または表示されないという面倒な詳細のファンではありません。入力に対するより強力な保証があれば、問題を解決するのがより楽しくなると思います。
xnor

回答:


3

CJam、34 33 32バイト

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

CJamインタープリターでオンラインで試してください。

考え

  1. 2行目から2番目の文字を削除します。

  2. 両方の行に共通するすべての文字の単一のコピーで構成される文字列を形成します。

  3. 結果の文字列を2回繰り返し、最初の2文字を破棄します。

    これにより、2文字の文字列(2行目の文字が異なり、両方が1行目にある場合)または空の文字列になります。

  4. 1行目の結果の文字列の文字を改行で置き換えます。

  5. 改行で行1を分割します。

    配列に正確に3つのチャンクが含まれている場合、結果の配列の2番目の要素は目的の文字列になります。

  6. 配列の最初の要素を文字列nullで置き換えます

  7. 長さが3の場合は配列の2番目の要素を取得し、そうでない場合は最初の要素を取得します。

  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に2バイトの節約をありがとう。

オンラインで試す:Pyth Compiler / Executor

説明:

                                     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は機能しません。正確に2つの数字があることも確認する必要があるからです。
ジャクベ

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、わかりました。これはうまくいきましたが、最後のテストケースをテストするにはどうすればよいですか?
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置き換えることができます。これにより、NameErrorが発生します。また、明示的なレスキューなしでさらに数バイトを節約できると思います。raise_y->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

(最後の文字列はテンプレート化されており、コメントを入力するのが困難です)
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)+'"'

ソリューションでは、ほとんどの場合、正規表現を使用して文字列を抽出します。文字がどちらの方向にも一致する可能性があることに対応するため、一致した部分の開始と終了ではどちらの文字も許可されます。実際に一致する文字が異なることを確認すると、同じ文字が2回一致することと、入力内の2つの文字が同じであることが除外されます。

ここで答えを得るためにPythonを使用したのはこれが初めてです。したがって、改善の可能性についてのフィードバックは大歓迎です。特に、print文の条件を短くする方法が必要だと感じています。



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)..'"')

かなりい答え。入力ビットは少し荒いです(2行が必要です。1行目は文字列、2行目はスライス文字)。旗の場所を見つけるのは簡単ですが、他の答えと競うには長すぎます。出力は非常に簡単です。同等の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

オンライン版はないと思いますが、ソースコードは入手可能です。Luaの1:1マッピング(Luaの解釈や翻訳ではない)であるため、Luaコードはideoneでテストできます。
カイルカノス

0

Perl、65

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

これには、入力の2行目に改行文字がないことが必要です。


良くやった。ただし、二重引用符が欠落しているようです。
デニス

@デニス、修正。私は例を誤解しました。
-nutki

1
nullケースの引用符がまだ欠落しています。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.