Belirli bir dizeden dize ayıklama


17

Size bir dize ve iki karakter verilir. Dizeden bu karakterler arasındaki dizeyi yazdırmanız gerekir.

Giriş

Giriş önce bir dize içerir (boş değil veya null). Bir sonraki satırda, boşlukla ayrılmış iki karakter olacaktır.

Meydan okuma

İki karakter arasındaki dizeyi döndür

Misal

Hello! What's your name?
! ?

çıktı ile sonuçlanmalıdır:

" What's your name"

kurallar

  • Dize 100 karakterden uzun olmayacak ve yalnızca (boşluk) ila ~(yaklaşık işareti) aralığında ASCII karakterleri içerecektir (0x20 ila 0x7E karakter kodları dahil). Referans için ASCII tablosuna bakınız .
  • Girdiyi stdin(veya en yakın alternatifi) almalısınız .
  • Çıktı tırnak ( ") ile çevrelenmelidir .
  • Tam bir program veya giriş alan ve son dizeyi çıktılayan bir işlev yazabilirsiniz
  • İki karakter yalnızca ASCII karakterlerini (boşluk) ila ~(yaklaşık işareti) (0x20 ila 0x7E karakter kodları dahil) içerecektir . Referans için ASCII tablosuna bakınız .
  • Her iki karakterin de dizede olacağının garantisi yoktur.
  • Dizede karakterlerden herhangi biri bulunmazsa, yazdırın "null".
  • Karakterlerden herhangi biri bir dizede birden çok kez bulunursa (her iki karakter de aynı değilse), yazdırın "null".
  • Her iki karakter de aynı karakterdeyse, dizeyi yazdırın "null".

Test Durumları

1)

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

2)

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

3)

abcdefghijklmnopqrstuvwxyz
n k                       --> "lm"

4)

Testing...
e T                       --> ""

5)

Last test-case
  -                       --> "test"

puanlama

Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.


3
Karakterler dizede zıt sırada olabilir mi? Öyleyse, bu bir test senaryosu kullanabilir.
Martin Ender

1
Alt dize bir içerirse ne olur "? Sadece başka bir çift tırnak işareti içine almalı mıyız?
jimmy23013

@ MartinBüttner, Evet. Düzenlenmiş test örneği 3'e bakın. Bana bunu hatırlattığınız için teşekkür ederiz
Spikatrix

@ user23013, Evet. Örnek girdi: one"two-three \n" -çıktı: "two"( \nyeni bir
satırdır

1
Birden fazla kez görünmeyen veya görünmeyen belirteçlerle ilgili ayrıntıların hayranı değilim. Sorunun girdiler üzerinde daha güçlü garantilerle çözülmesinin daha keyifli olacağını düşünüyorum.
xnor

Yanıtlar:


3

CJam, 34 33 32 bayt

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

CJam yorumlayıcısında çevrimiçi deneyin .

Fikir

  1. İkinci karakteri 2. satırdan kaldırın.

  2. Her iki satırın ortak olduğu tüm karakterlerin tek bir kopyasından oluşan bir dize oluşturun.

  3. Elde edilen dizeyi iki kez tekrarlayın ve ilk iki karakterini atın.

    Bu, iki karakterli bir dize (satır 2'deki karakterler farklıysa ve her ikisi de satır 1'de olursa) veya boş bir dize ile sonuçlanır.

  4. Satır 1'deki sonuç dizesinin karakterlerini satır beslemeleriyle değiştirin.

  5. Satır 1'i satır beslemelerinde ayırın.

    Dizi tam olarak üç parça içeriyorsa, sonuçta elde edilen dizinin ikinci öğesi istenen dize olur.

  6. Dizinin ilk öğesini null dizesiyle değiştirin .

  7. Uzunluğu 3, aksi takdirde dizinin ikinci elemanını alın.

  8. Başına çift tırnak işareti ekleyin.

kod

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

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

Çok uzun...

açıklama

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 bayt

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

@İsaacg için iki bayt tasarruf için teşekkürler.

Çevrimiçi deneyin: Pyth Derleyici / Yönetici

Açıklama:

                                     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]1daha kısadır [1 1)ve - ... 1daha kısadır.
isaacg

@isaacg -...1çalışmıyor, çünkü tam olarak iki sayı olup olmadığını da kontrol etmem gerekiyor.
Jakube

2
Sadece marka bir 3 karakter yol buldum [1 1): jT9.
isaacg

2

Python 3, 149 bayt

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

Ungolfed Sürümü:

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

Bu benim ilk cevabım, bu yüzden ipuçları ve eleştiriler çok takdir ediliyor.


2

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

Ve ungolfed versiyonu için

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

Kodunuzu burada çalıştırdığımda neden çıktı göremiyorum ?
Spikatrix

Böyle demen gerekiyor bu yüzden, o isimsiz fonksiyonudur @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>",?>,?<]The [...]end işlevini çağırır şeydir de.
blutorange

@blutorange, tamam. Bu tür çalıştı, ama son test senaryosunu nasıl test edebilirim?
Spikatrix

@CoolGuy Normalde alıntılanan dizeleri kullanın:->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

İle bir hata oluşturmak raiseyerine veya raisegibi tanımsız bir değişkenle değiştirebilirsiniz . Bu bir NameError oluşturur. Ayrıca, açık bir kurtarma olmadan birkaç bayt tasarruf edebileceğinizi düşünüyorum:_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 bayt

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

Kod çözülmemiş kod:

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
}

Burada test edin


1

Python 3, 172 bayt

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 bayt

Fikir @ edc65'in çözümünden büyük ölçüde çalındı.

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


Ben daha çok [a,,b]=, bir dahaki sefere kullanacağım gibi. Normal ifadeler bir güçlük olduğundan, burada normal [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)
ifadesiz bir

(son dize şablonludur, yorum eklemek zordur)
edc65

1

Python, 161 bayt

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

Çözüm çoğunlukla dizeyi ayıklamak için normal bir ifade kullanır. Harflerin her iki yönde eşleşebilmesi için, eşleşen parçanın başlangıcı ve bitişi her iki harfe de izin verir. Farklı olarak eşleşen harflerin aynı harfin iki kez eşleştiğini ve girişteki iki harfin aynı olduğunu hariç tutması.

Bu, Python'u burada cevaplamak için ilk denemem. Bu yüzden olası iyileştirmeler hakkında geri bildirim almak çok hoş. Özellikle basılı ifadede durumu kısaltmanın bir yolu olması gerektiğini hissediyorum.


1

Python 3, 155 bayt

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

Çevrimiçi deneyin


1

golflua, 132 bayt

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

Oldukça çirkin bir cevap. Giriş biti biraz pürüzlüdür (ve önce dize, ikincisi dilim karakterleriyle iki satır gerektirir). Bayrakların yerlerini bulmak basittir, ancak diğer cevaplarla rekabet etmek için çok uzun. Çıktı oldukça kolaydır. Eşdeğer bir Lua programı

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

Is there any online compiler which I can test the golfed version?
Spikatrix

I don't believe there's an online version, but the source code is available. It is a 1:1 mapping of Lua (not an interpretation or translation to Lua), so the Lua code can be tested at ideone.
Kyle Kanos

0

Perl, 65

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

This requires there is no newline character at in the second line of the input.


Nice job. This seems to be missing the double quotes though.
Dennis

@Dennis, fixed. I misunderstood the example.
nutki

1
It's still missing the quotes for the null case.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.