Ekstrak string dari string yang diberikan


17

Anda diberi string dan dua karakter. Anda harus mencetak string di antara karakter-karakter ini dari string.

Memasukkan

Input pertama-tama akan berisi string (tidak kosong atau null). Di baris berikutnya, akan ada dua karakter yang dipisahkan oleh spasi.

Tantangan

Kembalikan string antara dua karakter

Contoh

Hello! What's your name?
! ?

harus menghasilkan output:

" What's your name"

Aturan

  • String tidak akan lebih dari 100 karakter dan hanya akan berisi karakter ASCII dalam rentang (spasi) hingga ~(tilde) (kode karakter 0x20 hingga 0x7E, inklusif). Lihat tabel ASCII untuk referensi.
  • Anda harus mengambil input dari stdin(atau alternatif terdekat).
  • Outputnya harus dikelilingi dengan tanda kutip ( ").
  • Anda dapat menulis program lengkap, atau fungsi yang mengambil input, dan mengeluarkan string terakhir
  • Kedua karakter hanya akan berisi karakter ASCII dalam rentang (spasi) hingga ~(tilde) (kode karakter 0x20 hingga 0x7E, inklusif). Lihat tabel ASCII untuk referensi.
  • Tidak ada jaminan bahwa kedua karakter akan berada di string.
  • Jika salah satu karakter tidak ditemukan dalam string, cetak "null" .
  • Jika salah satu karakter ditemukan lebih dari satu kali (kecuali kedua karakter sama) dalam sebuah string, cetak "null".
  • Jika kedua karakter adalah karakter yang sama, cetak string "null".

Uji Kasus

1)

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

2)

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

3)

abcdefghijklmnopqrstuvwxyz
n k                       --> "lm"

4)

Testing...
e T                       --> ""

5)

Last test-case
  -                       --> "test"

Mencetak gol

Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.


3
Bisakah karakter muncul dalam urutan yang berlawanan dalam string? Jika demikian, itu bisa menggunakan test case.
Martin Ender

1
Bagaimana jika substring berisi a "? Haruskah kita mengelilinginya dengan sepasang kutipan lain dan tidak peduli tentang itu?
jimmy23013

@ MartinBĂĽttner, Ya. Lihat test case yang sudah diedit 3. Terima kasih telah mengingatkan saya tentang hal itu
Spikatrix

@ user23013, Ya. Input contoh: one"two-three \n" -output: "two"( \nadalah baris baru)
Spikatrix

1
Saya bukan penggemar detail fiddly tentang spidol yang tidak muncul atau muncul beberapa kali. Saya pikir masalahnya akan lebih menyenangkan untuk diselesaikan dengan jaminan yang lebih kuat pada input.
xnor

Jawaban:


3

CJam, 34 33 32 byte

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

Cobalah online di juru bahasa CJam .

Ide

  1. Hapus karakter kedua dari baris 2.

  2. Bentuk string yang terdiri dari satu salinan dari semua karakter yang memiliki kedua garis yang sama

  3. Ulangi string yang dihasilkan dua kali dan buang dua karakter pertama.

    Ini menghasilkan string dua karakter (jika karakter dari baris 2 berbeda dan keduanya muncul di baris 1) atau string kosong.

  4. Ganti karakter string yang dihasilkan di baris 1 dengan baris baris.

  5. Membagi baris 1 di baris baris.

    Elemen kedua array yang dihasilkan akan menjadi string yang diinginkan jika array mengandung tepat tiga potongan.

  6. Ganti elemen pertama array dengan string null .

  7. Ambil elemen kedua array jika panjangnya 3 dan yang pertama sebaliknya.

  8. Tambahkan dan tambahkan penawaran ganda.

Kode

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

Terlalu panjang...

Penjelasan

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 byte

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

Berkat @isaacg untuk menghemat dua byte.

Cobalah secara online: Pyth Compiler / Executor

Penjelasan:

                                     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]1lebih pendek dari [1 1), dan - ... 1masih lebih pendek.
isaacg

@isaacg -...1tidak berfungsi, karena saya juga perlu memeriksa bahwa ada dua angka.
Jakube

2
Aku hanya memikirkan cara 3 karakter untuk make [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)]+'"')

Versi Tidak Serigala:

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

Ini adalah jawaban pertama saya di sini, jadi tip dan kritik sangat dihargai.


2

Ruby, 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]}

Dan untuk versi yang tidak diserang

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

Mengapa saya tidak bisa melihat keluaran apa pun ketika saya menjalankan kode Anda di sini ?
Spikatrix

@ CoolGuy Ini adalah fungsi yang tidak disebutkan namanya, jadi Anda harus memanggilnya seperti ini ->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>",?>,?<]. [...]Pada akhirnya adalah apa yang memanggil fungsi.
blutorange

@blutorange, Ok. Semacam itu berhasil, tetapi bagaimana saya menguji test case terakhir?
Spikatrix

@CoolGuy Gunakan string yang biasanya dikutip:->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

Alih-alih meningkatkan kesalahan dengan raise, Anda dapat mengganti raisedengan variabel yang tidak ditentukan seperti _atau y. Ini menimbulkan NameError. Juga, saya pikir Anda bisa menyimpan beberapa byte lagi tanpa penyelamatan eksplisit:->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));}

Kode tidak dikunci:

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
}

Uji di sini


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

Ide sangat dicuri dari solusi @ 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)+'"')


Saya lebih suka [a,,b]=, saya akan menggunakannya lain kali. Karena regex merepotkan, berikut adalah solusi gratis 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

(string terakhir adalah templated, sulit untuk dimasukkan ke dalam komentar)
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)+'"'

Solusinya kebanyakan hanya menggunakan ekspresi reguler untuk mengekstrak string. Untuk mengakomodasi bahwa huruf-huruf tersebut dapat cocok dengan kedua arah, awal dan akhir bagian yang cocok memungkinkan salah satu huruf. Memeriksa bahwa huruf-huruf yang benar-benar cocok dengan yang berbeda mengecualikan huruf yang sama dicocokkan dua kali, serta dua huruf dalam input sama.

Ini adalah upaya pertama saya menggunakan Python untuk mendapat jawaban di sini. Jadi umpan balik tentang kemungkinan perbaikan sangat disambut. Saya khususnya merasa bahwa harus ada cara untuk membuat kondisi dalam pernyataan cetak lebih pendek.


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

Cobalah online


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

Jawabannya cukup jelek. Bit input agak kasar (dan membutuhkan dua baris, pertama dengan string & kedua dengan karakter slice). Menemukan lokasi bendera sangat mudah, tetapi terlalu lama untuk bersaing dengan jawaban lain. Outputnya cukup mudah. Program Lua yang setara adalah

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

Apakah ada kompiler online yang dapat saya uji versi golfnya?
Spikatrix

Saya tidak percaya ada versi online, tetapi kode sumbernya tersedia . Ini adalah pemetaan 1: 1 Lua (bukan interpretasi atau terjemahan ke Lua), sehingga kode Lua dapat diuji di ideone .
Kyle Kanos

0

Perl, 65

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

Ini mengharuskan tidak ada karakter baris baru di pada baris kedua input.


Pekerjaan yang baik. Ini tampaknya tidak memiliki tanda kutip ganda.
Dennis

@ Dennis, diperbaiki. Saya salah paham contohnya.
nutki

1
Masih ada tanda kutip untuk nullkasus ini.
Dennis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.