แยกสตริงออกจากสตริงที่กำหนด


17

คุณได้รับสตริงและอักขระสองตัว คุณต้องพิมพ์สตริงระหว่างอักขระเหล่านี้จากสตริง

อินพุต

ข้อมูลที่ป้อนก่อนจะมีสตริง (ไม่เว้นว่างหรือnull) ในบรรทัดถัดไปจะมีอักขระสองตัวคั่นด้วยช่องว่าง

ท้าทาย

ส่งคืนสตริงระหว่างอักขระสองตัว

ตัวอย่าง

Hello! What's your name?
! ?

ควรส่งผลให้ผลลัพธ์:

" What's your name"

กฎระเบียบ

  • สตริงจะต้องไม่ยาวเกิน 100 ตัวอักษรและจะมีเฉพาะอักขระ ASCII ในช่วง(เว้นวรรค) ถึง~(ตัวหนอน) (รหัสตัวอักษร 0x20 ถึง 0x7E รวมอยู่ด้วย) ดูตาราง ASCIIสำหรับการอ้างอิง
  • คุณต้องรับข้อมูลจากstdin(หรือตัวเลือกอื่นที่ใกล้เคียงที่สุด)
  • เอาต์พุตควรล้อมรอบด้วยเครื่องหมายคำพูด ( ")
  • คุณสามารถเขียนโปรแกรมแบบเต็มหรือฟังก์ชั่นที่รับอินพุตและส่งออกสตริงสุดท้าย
  • อักขระสองตัวจะมีอักขระ ASCII อยู่ในช่วงเท่านั้น (เว้นวรรค) ถึง~(ตัวหนอน) (รหัสอักขระ 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
ตัวละครสามารถเกิดขึ้นในลำดับที่ตรงกันข้ามในสตริง? ถ้าเป็นเช่นนั้นสามารถใช้กรณีทดสอบ
Martin Ender

1
เกิดอะไรขึ้นถ้าสตริงย่อยมี"? เราควรจะล้อมมันด้วยเครื่องหมายคำพูดคู่อื่นและไม่สนใจเรื่องนั้นเหรอ?
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. จัดรูปแบบสตริงที่ประกอบด้วยสำเนาเดียวของอักขระทั้งหมดที่ทั้งสองบรรทัดมีร่วมกัน

  3. ทำซ้ำสตริงผลลัพธ์สองครั้งและทิ้งอักขระสองตัวแรก

    สิ่งนี้ส่งผลให้สตริงสองตัวละคร (ถ้าตัวละครจากบรรทัด 2 แตกต่างกันและทั้งคู่เกิดขึ้นในบรรทัดที่ 1) หรือสตริงว่าง

  4. แทนที่อักขระของสตริงผลลัพธ์ในบรรทัด 1 ด้วย linefeeds

  5. แยกสาย 1 ที่ linefeeds

    องค์ประกอบที่สองของอาร์เรย์ที่ได้จะเป็นสตริงที่ต้องการหากอาร์เรย์มีองค์ประกอบสามส่วน

  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 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ไม่ทำงานเนื่องจากฉันต้องตรวจสอบว่ามีตัวเลขสองตัวเหมือนกัน
Jakube

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]=ฉันจะใช้มันในครั้งต่อไป เนื่องจาก regex เป็นเรื่องยุ่งยากนี่เป็นวิธีแก้ปัญหาฟรีของ 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

(สตริงสุดท้ายคือเทมเพลตและยากที่จะใส่ความคิดเห็น)
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

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

คำตอบที่น่าเกลียดมาก บิตอินพุตค่อนข้างหยาบ (และต้องมีสองบรรทัดก่อนด้วยสตริง & วินาทีที่มีอักขระส่วนแบ่ง) การค้นหาตำแหน่งของธงถือเป็นเรื่องตรงไปตรงมา แต่ใช้เวลานานเกินไปในการแข่งขันกับคำตอบอื่น ๆ ผลผลิตค่อนข้างง่าย โปรแกรม 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

มีคอมไพเลอร์ออนไลน์ที่ฉันสามารถทดสอบเวอร์ชัน golfed ได้หรือไม่?
Spikatrix

ฉันไม่เชื่อว่ามีเวอร์ชันออนไลน์ แต่เป็น รหัสที่มาใช้ได้ มันเป็น 1: 1 การทำแผนที่ของ Lua (ไม่ใช่การตีความหรือแปล Lua) ดังนั้นรหัส Lua สามารถทดสอบได้ที่ideone
Kyle Kanos

0

Perl, 65

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

สิ่งนี้ต้องการไม่มีอักขระขึ้นบรรทัดใหม่ในบรรทัดที่สองของอินพุต


งานที่ดี. ดูเหมือนว่าจะไม่มีเครื่องหมายคำพูดคู่
เดนนิส

@Dennis, แก้ไขแล้ว ฉันเข้าใจผิดตัวอย่าง
nutki

1
มันยังคงหายไปคำพูดสำหรับnullกรณี
เดนนิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.