Se non avessi mai provato a scrivere un codice palindromico prima, sapresti quante parentesi tendono ad ostacolarti. ()()
non è un palindromo, anche se sembra che dovrebbe essere, mentre ())(
e ()(
sono entrambi palindromici ed entrambi molto stupidi. Non sarebbe conveniente se fosse il contrario?
Una stringa è convenientemente palindromica se è uguale alla stringa derivata quando al suo rovescio sono capovolte tutte le parentesi ( ()
), parentesi ( []
) e parentesi graffe ( {}
). Nessun altro personaggio è speciale e richiede il lancio. (a <>
volte sono accoppiati ma spesso non così vengono esclusi).
Il tuo compito è quello di scrivere, nella tua lingua, un programma (prendendo input su STDIN) o una funzione (prendendo un singolo argomento stringa) che (a) dia un valore vero coerente * quando il suo argomento è convenientemente palindromico e un falso diverso, coerente altrimenti, e (b) è di per sé convenientemente palindromico.
Ad esempio, i seguenti input sono comodamente palindromici:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
E i seguenti non sono:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Non è possibile fare affidamento su alcuno stato esterno (nome file specifico, struttura di directory, input di altri utenti, accesso Web, ecc.) Ad eccezione dei flag di interprete / compilatore.
Inoltre, non è possibile utilizzare "il trucco dei commenti" in cui commentare o rendere inutilizzato un pezzo di codice sfruttando le funzionalità di commento della propria lingua. Ad esempio, non sono consentiti tutti i seguenti elementi, poiché contengono parti non funzionali che possono essere rimosse o distrutte in modo sicuro (a scapito della perdita della palindromicità):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Ovviamente questo potrebbe non coprire tutti questi casi, ma lo spirito della sfida qui non è quello di usare commenti e codice ** non analizzato per ottenere la palindrosità, facendo invece uso delle parentesi e parentesi corrette. Ti sto guardando, LISP, Brainfuck.
Questo è un codice-golf , quindi vince il codice più corto, ma sono gradite tutte le lunghezze di codice.
* Per valori reali e falsi coerenti, intendo che è possibile restituire uno di una coppia di valori, come 1
true e 0
false, oppure False
true e "no"
false, purché questi valori siano diversi l'uno dall'altro e non passa da un programma all'altro. Usa qualunque cosa ti salvi i personaggi.
** Da non confondere con non eseguito : codice valido e che può fare cose strane ma mai chiamato va bene.
(eslaf)fi
, puoi usarlo if(false)
.
()()
non è un palindromo
if(false){some code}
o variabili inutilizzate? Sono ammessi?