Estrai una stringa da una determinata stringa


17

Ti vengono dati una stringa e due caratteri. Devi stampare la stringa tra questi caratteri dalla stringa.

Ingresso

L'input conterrà prima una stringa (non vuota o null). Nella riga successiva, ci saranno due caratteri separati da uno spazio.

Sfida

Restituisce la stringa tra i due caratteri

Esempio

Hello! What's your name?
! ?

dovrebbe comportare l'output:

" What's your name"

Regole

  • La stringa non sarà più lunga di 100 caratteri e conterrà solo caratteri ASCII nell'intervallo (spazio) da ~(tilde) (codici carattere da 0x20 a 0x7E, inclusi). Vedere la tabella ASCII per riferimento.
  • Devi prendere input dalla stdin(o alternativa più vicina).
  • L'output deve essere racchiuso tra virgolette ( ").
  • È possibile scrivere un programma completo o una funzione che accetta input e genera la stringa finale
  • I due caratteri conterranno solo caratteri ASCII nell'intervallo (spazio) da ~(tilde) (codici carattere da 0x20 a 0x7E, inclusi). Vedere la tabella ASCII per riferimento.
  • Non vi è alcuna garanzia che entrambi i caratteri saranno nella stringa.
  • Se nella stringa non viene trovato alcun carattere, stampa "null".
  • Se uno qualsiasi dei caratteri viene trovato più di una volta (a meno che entrambi i caratteri siano uguali) in una stringa, stampa "null".
  • Se entrambi i caratteri hanno lo stesso carattere, stampare la stringa "null".

Casi test

1)

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

2)

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

3)

abcdefghijklmnopqrstuvwxyz
n k                       --> "lm"

4)

Testing...
e T                       --> ""

5)

Last test-case
  -                       --> "test"

punteggio

Questo è il golf del codice, quindi vince l'invio più breve (in byte).


3
I caratteri possono apparire nell'ordine opposto nella stringa? In tal caso, potrebbe essere utilizzato un caso di prova.
Martin Ender,

1
Cosa succede se la sottostringa contiene un "? Dovremmo semplicemente circondarlo con un'altra coppia di citazioni e non preoccuparcene?
jimmy23013,

@ MartinBüttner, Sì. Vedi il caso di prova modificato 3. Grazie per
avermelo ricordato

@ user23013, Sì. Esempio di input: one"two-three \n" -output: "two"( \nè una nuova riga)
Spikatrix,

1
Non sono un fan dei dettagli difficili degli indicatori che non appaiono o appaiono più volte. Penso che il problema sarebbe più piacevole da risolvere con maggiori garanzie sugli input.
xnor

Risposte:


3

CJam, 34 33 32 byte

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

Provalo online nell'interprete CJam .

Idea

  1. Rimuovi il secondo carattere dalla riga 2.

  2. Forma una stringa composta da una singola copia di tutti i caratteri che entrambe le linee hanno in comune.

  3. Ripeti due volte la stringa risultante e scarta i suoi primi due caratteri.

    Ciò si traduce in una stringa di due caratteri (se i caratteri della riga 2 sono diversi ed entrambi nella riga 1) o in una stringa vuota.

  4. Sostituisci i caratteri della stringa risultante nella riga 1 con avanzamenti di riga.

  5. Dividi la linea 1 agli avanzamenti di riga.

    Il secondo elemento dell'array risultante sarà la stringa desiderata se l'array contiene esattamente tre blocchi.

  6. Sostituisci il primo elemento dell'array con la stringa null .

  7. Recupera il secondo elemento dell'array se la sua lunghezza è 3 e il primo altrimenti.

  8. Prepara e aggiungi una doppia citazione.

Codice

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

Troppo lungo...

Spiegazione

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

Grazie a @isaacg per i due byte salvati.

Provalo online: Pyth Compiler / Executor

Spiegazione:

                                     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è più corto di [1 1)ed - ... 1è ancora più corto.
isaacg,

@isaacg -...1non funziona, poiché devo anche verificare che ci siano esattamente due numeri.
Jakube,

2
Ho pensato a un modo di 3 caratteri per marca [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)]+'"')

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

Questa è la mia prima risposta qui, quindi suggerimenti e critiche sono molto apprezzate.


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

E per la versione ungolfed

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

Perché non riesco a vedere alcun output quando eseguo il tuo codice qui ?
Spikatrix,

@CoolGuy È una funzione senza nome, quindi è necessario chiamarla così ->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>",?>,?<]La [...]fine è ciò che chiama la funzione.
Blutorange,

@blutorange, Ok. Quel tipo ha funzionato, ma come testare l'ultimo caso di test?
Spikatrix,

@CoolGuy Usa le stringhe normalmente citate:->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

Invece di generare un errore con raise, è possibile sostituire raisecon una variabile non definita come _o y. Questo genera un NameError. Inoltre, penso che potresti salvare qualche altro byte senza un salvataggio esplicito:->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));}

Codice non golfato:

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
}

Provalo qui


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

Idea rubata pesantemente dalla soluzione di @ 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)+'"')


Mi piace soprattutto [a,,b]=, lo userò la prossima volta. Poiché i regex sono una seccatura, ecco una soluzione priva di 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,

(l'ultima stringa è
modellata

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

La soluzione utilizza principalmente un'espressione regolare per estrarre la stringa. Per far sì che le lettere possano corrispondere in entrambe le direzioni, l'inizio e la fine della parte corrispondente consentono entrambe le lettere. La verifica che le lettere effettivamente abbinate siano diverse esclude che la stessa lettera venga trovata due volte, così come le due lettere nell'input siano le stesse.

Questo è il mio primo tentativo di utilizzare Python come risposta qui. Quindi il feedback sui possibili miglioramenti è molto gradito. In particolare, ho la sensazione che ci debba essere un modo per ridurre la condizione nell'istruzione di stampa.


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

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

Risposta piuttosto brutta. Il bit di input è un po 'approssimativo (e richiede due righe, prima con la stringa e la seconda con i caratteri slice). Trovare le posizioni delle bandiere è semplice, ma troppo lungo per competere con altre risposte. L'output è piuttosto semplice. Un programma Lua equivalente sarebbe

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

Esiste un compilatore online che posso testare la versione golfata?
Spikatrix,

Non credo ci sia una versione online, ma il codice sorgente è disponibile . È una mappatura 1: 1 di Lua (non un'interpretazione o una traduzione in Lua), quindi il codice Lua può essere testato su ideone .
Kyle Kanos,

0

Perl, 65 anni

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

Ciò richiede che non vi sia alcun carattere di nuova riga nella seconda riga dell'input.


Bel lavoro. Questo sembra mancare le doppie virgolette però.
Dennis

@Dennis, risolto. Ho frainteso l'esempio.
Nutki,

1
Mancano ancora le virgolette per il nullcaso.
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.