Trích xuất một chuỗi từ một chuỗi nhất định


17

Bạn được cung cấp một chuỗi và hai ký tự. Bạn phải in chuỗi giữa các ký tự này từ chuỗi.

Đầu vào

Đầu vào trước tiên sẽ chứa một chuỗi (không trống hoặc null). Trong dòng tiếp theo, sẽ có hai ký tự cách nhau bởi một khoảng trắng.

Thử thách

Trả về chuỗi giữa hai ký tự

Thí dụ

Hello! What's your name?
! ?

nên dẫn đến kết quả đầu ra:

" What's your name"

Quy tắc

  • Chuỗi sẽ không dài hơn 100 ký tự và sẽ chỉ chứa các ký tự ASCII trong phạm vi (khoảng trắng) đến ~(dấu ngã) (mã ký tự 0x20 đến 0x7E, đã bao gồm). Xem bảng ASCII để tham khảo.
  • Bạn phải lấy đầu vào từ stdin(hoặc thay thế gần nhất).
  • Đầu ra phải được bao quanh bằng dấu ngoặc kép ( ").
  • Bạn có thể viết một chương trình đầy đủ hoặc một hàm lấy đầu vào và xuất chuỗi cuối cùng
  • Hai ký tự sẽ chỉ chứa các ký tự ASCII trong phạm vi (khoảng trắng) đến ~(dấu ngã) (mã ký tự 0x20 đến 0x7E, đã bao gồm). Xem bảng ASCII để tham khảo.
  • Không có gì đảm bảo rằng cả hai ký tự sẽ nằm trong chuỗi.
  • Nếu không tìm thấy bất kỳ ký tự nào trong chuỗi, hãy in "null".
  • Nếu bất kỳ ký tự nào được tìm thấy nhiều hơn một lần (trừ khi cả hai ký tự giống nhau) trong một chuỗi, hãy in "null".
  • Nếu cả hai ký tự là cùng một ký tự, in chuỗi "null".

Các trường hợp thử nghiệm

1)

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

2)

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

3)

abcdefghijklmnopqrstuvwxyz
n k                       --> "lm"

4)

Testing...
e T                       --> ""

5)

Last test-case
  -                       --> "test"

Chấm điểm

Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.


3
Các ký tự có thể xảy ra theo thứ tự ngược lại trong chuỗi? Nếu vậy, có thể sử dụng một trường hợp thử nghiệm.
Martin Ender

1
Nếu chuỗi con chứa a "thì sao? Chúng ta có nên bao quanh nó với một cặp trích dẫn khác và không quan tâm đến điều đó?
jimmy23013

@ MartinBüttner, Vâng. Xem trường hợp kiểm tra đã chỉnh sửa 3. Cảm ơn đã nhắc nhở tôi về điều đó
Spikatrix

@ user23013, Có. Ví dụ đầu vào: one"two-three \n" -đầu ra: "two"( \nlà một dòng mới)
Spikatrix

1
Tôi không phải là người hâm mộ của các chi tiết khó hiểu về các điểm đánh dấu không xuất hiện hoặc xuất hiện nhiều lần. Tôi nghĩ rằng vấn đề sẽ thú vị hơn để giải quyết với sự đảm bảo mạnh mẽ hơn về đầu vào.
xnor

Câu trả lời:


3

CJam, 34 33 32 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Ý tưởng

  1. Xóa ký tự thứ hai khỏi dòng 2.

  2. Tạo thành một chuỗi bao gồm một bản sao duy nhất của tất cả các ký tự mà cả hai dòng có điểm chung.

  3. Lặp lại chuỗi kết quả hai lần và loại bỏ hai ký tự đầu tiên.

    Điều này dẫn đến một chuỗi hai ký tự (nếu các ký tự từ dòng 2 khác nhau và cả hai xảy ra trong dòng 1) hoặc một chuỗi trống.

  4. Thay thế các ký tự của chuỗi kết quả trong dòng 1 bằng nguồn cấp.

  5. Tách dòng 1 tại linefeed.

    Phần tử thứ hai của mảng kết quả sẽ là chuỗi mong muốn nếu mảng chứa chính xác ba khối.

  6. Thay thế phần tử đầu tiên của mảng bằng chuỗi null .

  7. Lấy phần tử thứ hai của mảng nếu độ dài của nó là 3 và ngược lại.

  8. Chuẩn bị và nối một trích dẫn kép.

'"       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 byte

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

Quá lâu...

Giải trình

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

Bình thường, 37 36 34 byte

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

Cảm ơn @isaacg cho hai byte lưu.

Dùng thử trực tuyến: Trình biên dịch / thực thi Pyth

Giải trình:

                                     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]1ngắn hơn [1 1)- ... 1vẫn ngắn hơn.
isaacg

@isaacg -...1không hoạt động, vì tôi cũng cần kiểm tra xem có đúng hai số không.
Jakube

2
Tôi chỉ nghĩ về một cách 3 ký tự để thực hiện [1 1): jT9.
isaacg

2

Python 3, 149 byte

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)]+'"')

Phiên bản Ungolfed:

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

Đây là câu trả lời đầu tiên của tôi ở đây, vì vậy lời khuyên và lời phê bình được đánh giá cao.


2

Hồng ngọc, 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]}

Và đối với phiên bản không có người nhận

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

Tại sao tôi không thể thấy bất kỳ đầu ra nào khi tôi chạy mã của bạn ở đây ?
Spikatrix

@CoolGuy Đây là một chức năng vô danh, vì vậy bạn cần phải gọi nó như thế này ->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>",?>,?<]Những [...]lúc kết thúc là những gì gọi hàm.
blutorange

@blutorange, Ok. Đó là loại công việc, nhưng làm thế nào để tôi kiểm tra trường hợp thử nghiệm cuối cùng?
Spikatrix

@CoolGuy Sử dụng các chuỗi được trích dẫn thông thường:->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

Thay vì đưa ra một lỗi với raise, bạn có thể thay thế raisebằng một biến không xác định, chẳng hạn như _hoặc y. Điều này làm tăng một NameError. Ngoài ra, tôi nghĩ rằng bạn có thể lưu thêm một vài byte mà không cần giải cứu rõ ràng:->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 byte

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

Mã bị đánh cắp:

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
}

Kiểm tra nó ở đây


1

Python 3, 172 byte

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 byte

Ý tưởng bị đánh cắp rất nhiều từ giải pháp của @ 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)+'"')


Tôi thích nhất [a,,b]=, tôi sẽ sử dụng nó lần sau. Vì regex là một rắc rối, đây là một giải pháp miễn phí regex:[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

(chuỗi cuối cùng được tạo khuôn mẫu, khó đưa ra nhận xét)
edc65

1

Python, 161 byte

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

Giải pháp chủ yếu chỉ sử dụng một biểu thức thông thường để trích xuất chuỗi. Để phù hợp với việc các chữ cái có thể khớp theo một trong hai hướng, phần đầu và phần cuối của phần trùng khớp cho phép một chữ cái. Kiểm tra xem các chữ cái thực sự khớp với nhau có loại trừ cùng một chữ cái được ghép hai lần không, cũng như hai chữ cái trong đầu vào giống nhau.

Đây là nỗ lực đầu tiên của tôi trong việc sử dụng Python cho câu trả lời ở đây. Vì vậy, phản hồi về những cải tiến có thể là rất đáng hoan nghênh. Tôi đặc biệt có cảm giác rằng phải có một cách để làm cho điều kiện trong câu lệnh in ngắn hơn.


1

Python 3, 155 byte

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]+'"')

Dùng thử trực tuyến


1

golflua, 132 byte

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

Câu trả lời khá xấu xí. Bit đầu vào hơi thô (và yêu cầu hai dòng, đầu tiên là chuỗi & thứ hai với các ký tự lát). Tìm vị trí của các lá cờ là đơn giản, nhưng chỉ quá lâu để cạnh tranh với các câu trả lời khác. Đầu ra khá dễ dàng. Một chương trình Lua tương đương sẽ là

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

Có trình biên dịch trực tuyến nào mà tôi có thể kiểm tra phiên bản chơi gôn không?
Spikatrix

Tôi không tin có phiên bản trực tuyến, nhưng mã nguồn có sẵn . Đó là ánh xạ Lua 1: 1 (không phải là phiên dịch hay dịch sang Lua), vì vậy mã Lua có thể được kiểm tra tại ideone .
Kyle Kanos

0

Perl, 65

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

Điều này đòi hỏi không có ký tự dòng mới ở dòng thứ hai của đầu vào.


Công việc tốt. Điều này dường như là thiếu các dấu ngoặc kép mặc dù.
Dennis

@Dennis, đã sửa. Tôi đã hiểu nhầm ví dụ.
nutki

1
Nó vẫn còn thiếu các trích dẫn cho nullvụ án.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.