Extrahieren Sie eine Zeichenfolge aus einer bestimmten Zeichenfolge

17

Sie erhalten eine Zeichenfolge und zwei Zeichen. Sie müssen die Zeichenfolge zwischen diesen Zeichen aus der Zeichenfolge drucken.

Eingang

Die Eingabe enthält zunächst eine Zeichenfolge (nicht leer oder null). In der nächsten Zeile werden zwei Zeichen durch ein Leerzeichen getrennt.

Herausforderung

Gibt die Zeichenfolge zwischen den beiden Zeichen zurück

Beispiel

Hello! What's your name?
! ?

sollte die Ausgabe ergeben:

" What's your name"

Regeln

  • Die Zeichenfolge darf nicht länger als 100 Zeichen sein und enthält nur ASCII-Zeichen im Bereich (Leerzeichen) bis ~(Tilde) (Zeichencodes 0x20 bis 0x7E, einschließlich). Siehe ASCII-Tabelle als Referenz.
  • Sie müssen Eingaben von der stdin(oder nächstgelegenen) Alternative nehmen.
  • Die Ausgabe sollte mit Anführungszeichen ( ") umgeben sein.
  • Sie können ein vollständiges Programm oder eine Funktion schreiben, die Eingaben entgegennimmt und die endgültige Zeichenfolge ausgibt
  • Die beiden Zeichen enthalten nur ASCII-Zeichen im Bereich (Leerzeichen) bis ~(Tilde) (Zeichencodes 0x20 bis 0x7E, einschließlich). Siehe ASCII-Tabelle als Referenz.
  • Es kann nicht garantiert werden, dass beide Zeichen in der Zeichenfolge enthalten sind.
  • Wenn eines der Zeichen in der Zeichenfolge nicht gefunden wird, drucken Sie "null".
  • Wenn eines der Zeichen mehrmals in einer Zeichenfolge gefunden wird (es sei denn, beide Zeichen sind identisch), drucken Sie "null".
  • Wenn beide Zeichen dasselbe Zeichen sind, drucken Sie die Zeichenfolge "null".

Testfälle

1)

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

2)

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

3)

abcdefghijklmnopqrstuvwxyz
n k                       --> "lm"

4)

Testing...
e T                       --> ""

5)

Last test-case
  -                       --> "test"

Wertung

Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Byte).

Spikatrix
quelle
3
Können die Zeichen in der Zeichenfolge in umgekehrter Reihenfolge vorkommen? Wenn ja, könnte das einen Testfall gebrauchen.
Martin Ender
1
Was ist, wenn der Teilstring a enthält "? Sollen wir es einfach mit einem anderen Paar Anführungszeichen umgeben und uns nicht darum kümmern?
Jimmy23013
@ MartinBüttner, ja. Siehe bearbeiteten Testfall 3. Vielen Dank, dass Sie mich daran erinnert haben
Spikatrix
@ user23013, Ja. Beispiel Eingabe: one"two-three \n" -Ausgabe: "two"( \nist eine neue Zeile)
Spikatrix
1
Ich bin kein Fan der fummeligen Details über die Marker, die nicht oder nicht mehrfach erscheinen. Ich denke, es würde mehr Spaß machen, das Problem mit stärkeren Garantien für die Eingänge zu lösen.
Xnor

Antworten:

3

CJam, 34 33 32 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Idee

  1. Entfernen Sie das zweite Zeichen aus Zeile 2.

  2. Bilden Sie eine Zeichenfolge, die aus einer einzigen Kopie aller Zeichen besteht, die beide Zeilen gemeinsam haben.

  3. Wiederholen Sie die resultierende Zeichenfolge zweimal und verwerfen Sie die ersten beiden Zeichen.

    Dies führt zu einer zweistelligen Zeichenfolge (wenn die Zeichen in Zeile 2 unterschiedlich sind und beide in Zeile 1 vorkommen) oder zu einer leeren Zeichenfolge.

  4. Ersetzen Sie die Zeichen der resultierenden Zeichenfolge in Zeile 1 durch Zeilenvorschübe.

  5. Teilen Sie die Linie 1 bei Zeilenvorschüben.

    Das zweite Element des resultierenden Arrays ist die gewünschte Zeichenfolge, wenn das Array genau drei Blöcke enthält.

  6. Ersetzen Sie das erste Element des Arrays durch die Zeichenfolge null .

  7. Rufen Sie das zweite Element des Arrays ab, wenn seine Länge 3 beträgt, und das erste, wenn dies nicht der Fall ist.

  8. Stellen Sie ein doppeltes Anführungszeichen voran und hängen Sie es an.

Code

'"       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.
Dennis
quelle
2

CJam, 38 Bytes

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

Zu lang...

Erläuterung

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.
jimmy23013
quelle
2

Pyth, 37 36 34 Bytes

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

Danke an @isaacg für die zwei Bytes sparen.

Probieren Sie es online aus: Pyth Compiler / Executor

Erläuterung:

                                     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 '"' + ... + '"'
Jakube
quelle
*2]1ist kürzer als [1 1)und - ... 1ist noch kürzer.
isaacg
@isaacg -...1funktioniert nicht, da ich auch überprüfen muss, ob es genau zwei Zahlen gibt.
Jakube
2
Ich dachte nur von einer 3 - Zeichen Art und Weise zu machen [1 1): jT9.
isaacg
2

Python 3, 149 Bytes

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 Version:

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

Dies ist meine erste Antwort hier, daher sind Tipps und Kritik sehr willkommen.

TheSidekick
quelle
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]}

Und für die ungolfed version

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
Dylan Frese
quelle
Warum kann ich keine Ausgabe sehen, wenn ich Ihren Code hier ausführe ?
Spikatrix
@CoolGuy Es ist eine unbenannte Funktion, daher müssen Sie sie folgendermaßen aufrufen: ->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>",?>,?<]Am [...]Ende wird die Funktion aufgerufen .
blutorange
@ Blutorange, Ok. Das hat funktioniert, aber wie teste ich den letzten Testfall?
Spikatrix
@CoolGuy Verwenden Sie normal zitierte Zeichenfolgen:->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
Anstatt einen Fehler mit auszulösen raise auszulösen, können Sie ihn durch raiseeine undefinierte Variable wie _oder ersetzen y. Dies löst einen NameError aus. Außerdem denke ich, dass Sie ohne eine explizite Rettung ein paar weitere Bytes sparen könnten:->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 Bytes

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-Code:

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
}

Teste es hier

Spikatrix
quelle
1

Python 3, 172 Bytes

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"')
Tim
quelle
1

Javascript ( ES6 ), 125 123 Bytes

Die Idee wurde schwer von der @ edc65-Lösung gestohlen.

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

nderscore
quelle
Ich mag es meistens [a,,b]=, ich werde es beim nächsten Mal verwenden. Da reguläre Ausdrücke ein Ärger sind, gibt es hier eine Lösung ohne [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)
reguläre Ausdrücke
(Die letzte Zeichenfolge ist mit Vorlagen versehen, es ist schwierig, einen Kommentar
einzutragen.
1

Python, 161 Bytes

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

Die Lösung verwendet meist nur einen regulären Ausdruck, um die Zeichenfolge zu extrahieren. Um zu berücksichtigen, dass die Buchstaben in beide Richtungen übereinstimmen können, lassen Anfang und Ende des übereinstimmenden Teils beide Buchstaben zu. Wenn Sie überprüfen, ob die tatsächlich übereinstimmenden Buchstaben unterschiedlich sind, wird ausgeschlossen, dass derselbe Buchstabe zweimal übereinstimmt und dass die beiden Buchstaben in der Eingabe identisch sind.

Dies ist mein erster Versuch, hier mit Python eine Antwort zu finden. Feedback zu möglichen Verbesserungen ist daher sehr willkommen. Ich habe insbesondere das Gefühl, dass es eine Möglichkeit geben muss, die Bedingung in der print-Anweisung zu verkürzen.

Reto Koradi
quelle
1

Python 3, 155 Bytes

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

Probieren Sie es online aus

OrangeHat
quelle
1

Golflua, 132 Bytes

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

Ziemlich hässliche Antwort. Das Eingabebit ist etwas grob (und erfordert zwei Zeilen, erstens mit der Zeichenfolge und zweitens mit den Slice-Zeichen). Das Auffinden der Positionen der Flaggen ist einfach, aber zu lang, um mit anderen Antworten mithalten zu können. Die Ausgabe ist ziemlich einfach. Ein gleichwertiges Lua-Programm wäre

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
Kyle Kanos
quelle
Gibt es einen Online-Compiler, mit dem ich die Golfversion testen kann?
Spikatrix
Ich glaube nicht, dass es eine Online-Version gibt, aber der Quellcode ist verfügbar . Es handelt sich um eine 1: 1-Zuordnung von Lua (keine Interpretation oder Übersetzung in Lua), sodass der Lua-Code bei ideone getestet werden kann .
Kyle Kanos
0

Perl, 65

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

Dies setzt voraus, dass sich in der zweiten Zeile der Eingabe kein Zeilenumbruchzeichen befindet.

nutki
quelle
Gut gemacht. Dies scheint jedoch die doppelten Anführungszeichen zu fehlen.
Dennis
@ Tennis, behoben. Ich habe das Beispiel falsch verstanden.
Nutki
1
Es fehlen immer noch die Anführungszeichen für den nullFall.
Dennis