주어진 문자열에서 문자열을 추출


17

문자열과 두 문자가 제공됩니다. 문자열에서이 문자들 사이에 문자열을 인쇄해야합니다.

입력

입력에는 먼저 문자열이 포함됩니다 (비어 있지 않거나 null). 다음 줄에는 공백으로 구분 된 두 문자가 있습니다.

도전

두 문자 사이의 문자열을 반환

Hello! What's your name?
! ?

출력이 발생해야합니다.

" What's your name"

규칙

  • 문자열은 100자를 초과하지 않으며 (공백) ~ ~(물결표) 범위의 ASCII 문자 만 포함합니다 (문자 코드 0x20 ~ 0x7E 포함). 보기 ASCII 테이블을 참조.
  • stdin(또는 가장 가까운 대안) 에서 입력을 받아야합니다 .
  • 출력은 인용 부호 ( ") 로 묶어야합니다 .
  • 전체 프로그램 또는 입력을 받아 최종 문자열을 출력하는 함수를 작성할 수 있습니다.
  • 두 문자는 (공백) ~ ~(물결표) 범위의 ASCII 문자 만 포함합니다 (문자 코드 0x20 ~ 0x7E 포함). 보기 ASCII 테이블을 참조.
  • 두 문자가 모두 문자열에 있다고 보장 할 수 없습니다.
  • 문자열에 문자가 없으면 인쇄하십시오 "null".
  • 문자열에서 문자가 두 번 이상 발견되면 (두 문자가 동일하지 않은 경우) print를 인쇄하십시오 "null".
  • 두 문자가 모두 같은 문자이면 문자열을 인쇄하십시오 "null".

테스트 사례

1)

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

2)

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

삼)

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" -output : "two"( \n은 개행 문자)
Spikatrix

1
나는 마커가 여러 번 나타나지 않거나 나타나지 않는 것에 대해 어리석은 세부 사항을 좋아하지 않습니다. 입력에 대한 강력한 보증으로 문제를 해결하는 것이 더 즐거울 것이라고 생각합니다.
xnor

답변:


3

CJam, 34 33 32 바이트

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

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

  1. 2 행에서 두 번째 문자를 제거하십시오.

  2. 두 줄이 공통으로 갖는 모든 문자의 단일 사본으로 구성된 문자열을 형성하십시오.

  3. 결과 문자열을 두 번 반복하고 처음 두 문자를 버립니다.

    결과적으로 2 문자열 (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

2 바이트 절약을위한 @isaacg 덕분입니다.

온라인 사용해보기 : 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 16:19에

@isaacg -...1는 작동하지 않습니다. 왜냐하면 정확히 두 개의 숫자가 있는지 확인해야하기 때문입니다.
Jakube

2
난 그냥 메이크업에 3 문자 방법을 생각 [1 1): jT9.
isaacg 16:19에

2

파이썬 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]}

그리고 ungolfed 버전

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));}

Ungolfed 코드 :

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

파이썬 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

자바 스크립트 ( 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

파이썬, 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

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

아주 못생긴 대답. 입력 비트는 약간 거칠다 (첫 번째는 문자열이 있고 두 번째는 슬라이스 문자가 있음). 깃발의 위치를 ​​찾는 것은 간단하지만 다른 답변과 경쟁하기에는 너무 길다. 출력은 매우 쉽습니다. 동등한 루아 프로그램은

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 에서 테스트 할 수 있습니다 .
Kyle Kanos

0

펄, 65

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

입력의 두 번째 줄에 줄 바꿈 문자가 없어야합니다.


좋은 작업. 그래도 큰 따옴표가없는 것 같습니다.
데니스

@ 데니스, 고정. 나는 그 예를 오해했다.
nutki

1
여전히 null사례에 대한 인용문이 누락되었습니다 .
데니스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.