Questa stringa è una lettera che fa un cartwheel?


35

L'ispirazione della sfida è stata questa che ho visto da qualche parte:

La parola "suora" è solo la lettera n che fa una ruota dentata

La tua sfida è quella di prendere una stringa e determinare se è la prima lettera a fare una ruota a ruota.

Regole

Una stringa è una lettera che fa un cartwheel se:

  • La prima lettera è la stessa dell'ultima lettera. (La lettera non può atterrare sulla sua testa.)
  • La stringa si alterna tra lettere a ruota libera ogni carattere.

Le lettere rotanti sono ne u, me w, be q. Si noti che ne winsieme non sono lettere a ruota libera, e nemmeno lo sono we b.

  • Prenderai una stringa usando uno dei nostri metodi di input standard.
  • Verrà emesso un valore di verità se la stringa è una lettera a ruota libera e un valore di falsa se non lo è. L'output può essere eseguito utilizzando qualsiasi metodo di output standard.

Regole aggiuntive:

  • Devono essere gestite solo lettere minuscole n/ u/ m/ w/ b/ minuscole q.
  • Si può presumere che l'input non sia mai vuoto.
  • Una stringa di un carattere non è un cartwheel valido.

Casi test

Input        -> Output
nun          -> truthy
nunun        -> truthy
nunununu     -> falsy
wmw          -> truthy
wmwun        -> falsy
bqbqbqbqbqb  -> truthy
v^v^v        -> falsy
AVAVA        -> falsy
OOO          -> falsy
ununununu    -> truthy
nunwmwnun    -> falsy
nun unun     -> falsy
nunwmw       -> falsy
nnuunnuunnuu -> falsy
nwnwnwnwn    -> falsy
m            -> falsy
nunuuunun    -> falsy

Vincitore

Come nel , vince il codice più corto (in ogni lingua)!


29
Penso che le bcartwheels entrino q, no? de psono anche amici del cartwheel. La chiave è che ruotano, non capovolgono.
ingegnere Toast il

Un altro suggerimento testcase:uwuwuwuwuwu
Kritixi Lithos

19
Perché bqbma no pdp?
aschepler

@aschepler Ho sbagliato.
MD XF,

2
Dal momento che dpd, pdp e tali non funzionano, penso che dovresti averli nei casi di test con una risposta falsa.
Trlkly

Risposte:


2

Gelatina , 23 byte

Ciò ha richiesto più lavoro di quanto si possa pensare!

“nmbuwq”iЀo⁵IAs2⁼€3,3Ȧ

Un collegamento monadico che prende un elenco di personaggi e ritorna 1(verità) o 0(falsità).

Provalo online! o vedere una suite di test .

Come?

Trova l'indice di ciascun carattere dell'input nell'elenco di caratteri 1 indicizzato nmbuwq. Questa stringa è disposta in modo tale che gli indici delle coppie siano separati da tre, pertanto la differenza incrementale degli indici per le cartwheel valide sarà la ripetizione di uno di [-3,3]o [3,-3].

Quando un elemento non viene trovato in un elenco dall'atomo "indice di" i, ritorna 0, che accoppierebbe i caratteri infondati b, rendendo l'input bxbxbveritiero. Quindi i messaggi di posta 0elettronica vengono sostituiti da 10un valore superiore a tre rispetto a qualsiasi altro valore prima di verificarne la validità.

“nmbuwq”iЀo⁵IAs2⁼€3,3Ȧ - Link: list of characters, s
         Ѐ             - map across c in s:
        i               -   first index of c in (1-indexed; 0 if not present)
“nmbuwq”                -   literal "nmbuwq"
            ⁵           - literal 10
           o            - logical or (vectorises - replace any 0s with 10s)
             I          - incremental differences (i.e. deltas)
              A         - absolute value (vectorises)
               s2       - split into chunks of 2 (possibly with a single remainder)
                   3,3  - pair three with three = [3,3]
                 ⁼€     - equals? for €ach (1 if so, otherwise 0 - including a single 3)
                      Ȧ - any and all? (0 if any 0s or if empty, 1 otherwise)

13

sed 4.2.2 , 30 + 1 -r= 43 31 byte

Risparmiato 12 byte grazie a @Neil accorciando la prima riga

/nu|wm|qb/!d
/^((.).)\1*\2$/!d

Provalo online!

Elimina l'input se false, altrimenti non fa nulla sull'input.

Spiegazione

Con la -rbandiera, non abbiamo bisogno di usare \(e \)per catturare gruppi e questo fa risparmiare byte.

/nu|wm|qb/!                # On every line that does not match this regex
           d               # Delete
/^((.).)\1*\2$/!           # On every line that does not math
 ^((.).)                   #  the first two characters at the beginning of the line
        \1*                #  repeated
           \2$             #  with the first character at the end of the line
                d          # Delete

Ecco che arriva il sedmago ...
MD XF

@MDXF Sono ben lungi dall'essere un mago, ancora un principiante :)
Kritixi Lithos

Tutto seda me sembra magie. : P
MD XF,

1
Devi solo controllare il contenimento della metà delle coppie di lettere, ad esempio entrambe unue nuncontenere nue la seconda riga assicura che il resto delle lettere corrisponda a quelle due.
Neil,

8

JavaScript (ES6), 82 78 77 byte

Salvato 1 byte utilizzando due valori di falsy, come suggerito da ThePirateBay e MD XF.

([c,...s],S='bqwmun')=>s.reduceRight((r,a)=>r&a==S[S.search(c)^++k&1],k=s>'')

Casi test


Qualche motivo per partire &&invece di &?

@ThePirateBay Bene, l'unica ragione è la coerenza del valore falso restituito, sebbene non sembri davvero un requisito per questa sfida. (Usando &produrrebbe uno falseo 0.)
Arnauld

@Arnauld È possibile rimuovere il secondo &; Ho specificato (in chat) che a volte sono consentiti valori di falsa incoerenti.
MD XF,

5

Python 3 , 111 byte

-2 byte grazie a Mr. Xcoder.

lambda s:s[0]==s[-1]and any(any({*s[::2]}=={i[j]}and{*s[1::2]}=={i[j<1]}for j in[0,1])for i in['nu','mw','bq'])

Provalo online!


2
sospira quando mi passi di nuovo in rappresentante
MD XF

Non mi sento bene, dato che stai per raggiungere di nuovo il mio conteggio di byte, ma -2 byte .
Mr. Xcoder,

A proposito, la tua soluzione non è valida, proprio come la mia era all'inizio. Non funziona per nunununu.
Mr. Xcoder,

Risolto al costo di molti byte. ; -;
totalmente umano il

5

Python 2 , 63 byte

lambda s:s[:3]in'ununqbqbwmwm'and s==s[:2]*max(len(s)/2,1)+s[0]

Provalo online!


Bella risposta, benvenuta nel sito! Alcuni consigli: potresti "nu un nm mn bp pb".split()salvare 4 byte e rimuovere alcuni spazi bianchi. 75 byte:lambda s:any(s==c[-1]+c*max(len(s)/2,1)for c in"nu un nm mn bp pb".split())
DJMcMayhem

È possibile salvare 1 byte facendo s[0]invece di c[-1].
DJMcMayhem

La risposta di 61 byte restituisce True per unmnue unmwnu. In realtà restituisce falsi positivi quando (s==s[::-1])+len(set(s))è 4, che è facile da forzare. Anche solo 4 personaggi diversi lo rendono vero.
Arnold Palmer,

I 59 byte si interrompono con input a carattere singolo. Ci scusiamo per aver scelto questo, mi piace Python :)
Arnold Palmer il

Le eccezioni non sono false? Quella pausa è intenzionale
Harrichael il

5

Python 3 , 71 byte

lambda n:''.join(sorted({*n[1::2]}|{*n[::2]}))in"nu,mw,bq"*(n==n[::-1])

Provalo online!

-1 grazie a @HyperNeutrino e -13 grazie a @ovs

Se si riscontra che quanto sopra fallisce per qualsiasi caso di test, esiste un'alternativa:

lambda n:(sorted(list({*n[1::2]}.union({*n[::2]})))in[[*'nu'],[*'mw'],[*'bq']])*n[0]==n[-1]

Provalo online!


Spiegazione

  • ''.join(sorted(list({*n[1::2]}).union({*n[::2]})))) - Ottiene i caratteri su indici dispari e i caratteri su indici pari, li de-duplica e ordina l'elenco formato dalla loro unione.

  • in'nu,mw,bq' - Verifica se si tratta di combinazioni valide carrello-lettera.

  • n[0]==n[-1] - Verifica se il primo carattere è uguale all'ultimo.


Nessun caso di test, buon lavoro +1
MD XF

@MDXF Oh grazie! Sono così sollevato ...> _ <
Mr. Xcoder,

1
uwuwuwuwuwurisulta vero
Kritixi Lithos

1
Non valido: nunuuunun
Harrichael,

1
nuuun -> True. Questo non è giusto.
ricorsivo

5

JavaScript (ES6), 40 byte

s=>/^(nu|un|bq|qb|wm|mw)+$/.test(s+s[1])

Verifica se la stringa di input concatenata con il secondo carattere della stringa di input è una stringa ripetuta della stessa coppia di caratteri cartwheel.

test:

[
  "nun",
  "nunun",
  "nunununu",
  "wmw",
  "wmwun",
  "bqbqbqbqbqb",
  "v^v^v",
  "AVAVA",
  "OOO",
  "ununununu",
  "nunwmwnun",
  "nun unun",
  "nunwmw",
  "nnuunnuunnuu",
  "nwnwnwnwn",
  "m",
  "nunuuunun"
].forEach( x=>console.log( x, (s=>/^(nu|un|bq|qb|wm|mw)+$/.test(s+s[1]))(x) ) )


Adoro davvero la logica qui! Non avrei mai pensato di aggiungere un personaggio alla fine e testare. Anche un codice carino e pulito, anche se giocato a golf.
Trlkly

4

Clojure, 156 byte

(fn[w](let[s["nu""wm""bq"]c #(= 1(count(set %)))e #(take-nth 2 %)r #(and(c(e %))(c(e(drop 1 %))))](and(=(first w)(last w))(r w)(some #(=(set w)(set %))s))))

Questo è stato ingannevolmente difficile! Ho finito per doverlo suddividere in 3 sotto-problemi:

  • La prima lettera è uguale all'ultima?
  • Le lettere si ripetono?
  • Tutte le lettere fanno parte di uno dei set validi?

Certamente non ho vinto, ma questo è stato un esercizio di buongiorno! Spiegazione completa di seguito:

(defn cartwheel? [word]
  (let [; Valid Character Sets
        cs ["nu" "wm" "bq"]

        ; Is the list composed of only a single character?
        count-1? #(= 1 (count (set %)))

        ; Grabs every other element of the list
        every-other #(take-nth 2 %)

        ; Do the characters repeat? Works by checking if every other element is the same, then drops the first letter
        ; to check all the odd indexed characters
        repeating? #(and (count-1? (every-other %))
                         (count-1? (every-other (drop 1 %))))]

    ; Do all the predicates hold?
    (and (= (first word) (last word))
         (repeating? word)
         ; Is the set of letters in the word part of some set of the valid characters?
         (some #(= (set word) (set %)) cs))))

4

Haskell, 80 78 byte

f s|l<-length s=odd l&&l>1&&any((==s).take l.cycle)(words"un nu mw wm bq qb")

Provalo online!

Come funziona:

l<-length s        -- let l be the length of the input string

f s         =      -- return True, if
    odd l          -- l is odd and
    l > 1          -- l is greater than 1 and 
    any            -- any of the following is also True
      (     )(words "  ...  ")
                   -- apply the function to each of the words "un", "nu" ... "qb"
           cycle   --  infinitely repeat the word
      take l       --  take the first l characters
     (==s)         --  and compare to s

4

Python 2 , 45 byte

lambda s:s[2:]+s[1:3]==s>s[:2]in'bqbunuwmw'

Provalo online!

Gli spazi nella stringa sono DELcaratteri.


|u|viene interpretato come una ruota dentata.
Harrichael,

@Harrichael ho messo i DELpersonaggi per essere chiari.
xnor

I caratteri DEL possono comunque essere inseriti caratteri. Mi piace la tua soluzione, ma dovresti prendere in prestito un trucco dalla mia risposta:s[:3]in'bqbqnunuwmwm'
Harrichael,

4

Retina , 24 byte

G`nu|mw|bq
^((.).)\1*\2$

Uscite 1 per verità, 0 per falsità.

La risposta del ciarlatano di Port of Cows.

Provalo online!


La versione più recente produce verità nunwmwnun(quando dovrebbe essere falso), motivo per cui ho avuto la \1*risposta nella mia seduta.
Kritixi Lithos,

@Cowsquack Ah, vedo.
Okx,

La prima riga può essere G`nu|mw|bppoiché tutte le stringhe veritiere contengono una di quelle coppie di lettere e la seconda riga assicurerà che tutto il resto della stringa contenga anche quelle lettere ..
Neil

@Neil Che fallisce il test caseununununu
Okx

Il suggerimento di @Okx Neil sembra funzionare ancora per quel test Provalo online!
Kritixi Lithos,

3

Grime , 28 byte

e`..-#!"nu\|bq\|mw"oTv&..v+.

Provalo online! Stampe 1per input veritieri e 0per input falsi.

Spiegazione

La sintassi di Grime ricorda espressioni regolari e un programma Grime specifica un modello che può o meno corrispondere a un rettangolo di caratteri.

e`..-#!"nu\|bq\|mw"oTv&..v+.
e`                            Match input against pattern:
      !                       Does not
     #                        contain
  ..                          a 2-character substring
    -                         which is not
       "nu\|bq\|mw"           any of these strings
                   oT         potentially reversed,
                     v&       AND
                       ..     two characters
                         v+   one or more times
                           .  then one more character.

Alcune caratteristiche di Grime che hanno contribuito a ridurre questo aspetto:

  • Normalmente un carattere letterale deve essere evitato con una barra rovesciata, ma ""cambia questo: gli elementi di sintassi sono sfuggiti ma i letterali no. Senza le virgolette, la parte che enumera le coppie di caratteri sarebbe (\n\u|\b\p|\m\w)oT.
  • Gli operatori unari che seguono un operatore binario (qui -) agiscono sul suo risultato: ..-#!"…"oTè equivalente a (..-"…"oT)#!.
  • Le vs riducono la precedenza degli elementi di sintassi che le seguono. Un solitario &ha una precedenza più alta di -, ma v&ha una precedenza. Allo stesso modo, ..+viene analizzato come .(.+), ma ..v+equivale a (..)+.



2

Gelatina , 27 byte

Ḋm2Qµ³m2Q;Ṣe“nu“mw“bq”ȧ³⁼U¤

Provalo online!

Come funziona

Ḋm2Qµ³m2Q;µṢe“nu“mw“bq”ȧ³⁼U¤  Main link; z is the argument
Ḋ                             z[1:]
 m2                           z[1::2]
   Q                          deduplicate(z[1::2])
    µ                         New Chain
     ³                        z
      m2                      z[::2]
        Q                     deduplicate(z[::2])
         ;                    deduplicate(z[1::2]) + deduplicate(z[::2])
          Ṣ                  Sort the result
           e                 Is it an element of the following?
            “nu“mw“bq”       ["nu", "mw", "bq"]
                      ȧ      It has the correct characters and:
                       ³  ¤  Nilad followed by links as nilad
                       ³     z
                        ⁼      == 
                         U        z[::-1]
                          ¤  [End chain]

Jelly ... più a lungo di Pyth ?!
Mr. Xcoder,

@ Mr.Xcoder shhhh ci sto lavorando ... xD
HyperNeutrino

Ah bene, ora sono legato con te xD
HyperNeutrino,



1

Python 3 , 88 byte

lambda x:[len(x)%2,x[:2]in'nu,un,bq,qb,mw,wm',len(set(x[::2])),len(set(x[1::2]))]==[1]*4

len(x)%2: una stringa di lunghezza pari non può terminare con il primo carattere

x[:2] in: verifica una delle 6 coppie iniziali valide

len(set()): ottieni la lunghezza dei set di caratteri a 0,2,4 ... e 1,3,5 ...

Restituisce Truese l'elenco delle valutazioni è uguale a [1,1,1,1], altrimenti False.

Provalo online!


1

Perl 5 , 55 + 1 (-p) = 56 byte

$c={"nuunmwwmbppb"=~/./g}->{$l=chop};$_=/^($l$c)+$/&&$c

Provalo online!

Stampa la versione "capovolta" del primo carattere per true, niente per false.


Battimi di ben 18 byte. Bella risposta!
Silvio Mayolo,

Non così tanti ora. L'originale stava tornando vero per qualsiasi stringa dello stesso personaggio.
Xcali,

1

PHP, 59 + 1 byte

<?=preg_match('#^(nu|un|mw|wm|bq|qb)\1+$#',$argn.$argn[1]);

Esegui come pipe con -F.

soluzione parzialmente regex, 101 + 1 byte:

for($s=$argn;$c=$s[$i++];$p=$c)$c!=$p||die;echo$i%2<1&&preg_match("#^(nu|mw|bq)#",count_chars($s,3));

Uscita vuota per falsy. Esegui come pipe con -nR.


1

Java 8, 57 byte

s->s.matches("(nu)+n|(un)+u|(mw)+m|(wm)+w|(bq)+b|(qb)+q")

Provalo qui.

Regex semplice per abbinare tutti e sei i casi. Nota che Java String#matchescorrisponde automaticamente all'intera stringa, quindi non è necessario ^...$.


1

MATL , 25 byte

'nuwmbq'&mq2&\d~wdts~Gnqv

L'uscita è un vettore di colonna numerico non vuoto, che è vero se tutte le sue voci sono diverse da zero e falsa in caso contrario. Provalo online!

Per verificare tutti i casi di test , ifviene aggiunto un ramo nel piè di pagina che sostituisce qualsiasi valore di verità con la stringa 'truthy'o qualsiasi valore di falsa con la stringa 'falsy', quindi visualizza la stringa.

Spiegazione

'nuwmbq'  % Push this string
&m        % Implicit input. For each char, push index of membership in the above
          %  string, or 0 if not member
q         % Subtract 1
2         % Push 2
&\        % Divmod. Pushes remainders, then quotients
d~        % Consecutive differences negated. Gives an array of ones iff all
          % quotients were equal
w         % Swap. Moves remainders to top
d         % Consecutive differences. Gives nonzeros iff no consecutive
          % remainders were equal
ts~       % Duplicate, sum, negate. Gives true iff sum was 0. For unequal
          % consecutive differences of remainders, this corresponds to an odd
          % number of remainders
Gnq       % Push input, length, subtract 1. True iff input longer than 1
v         % Concatenate into column vector. Truthy iff all entries are nonzero

0

Python 2 , 74 byte

import re
re.compile('(n(un)+|u(nu)+|m(wm)+|w(mw)+|b(pb)+|p(bp)+)$').match

Provalo online! Questa interpretazione del problema è sorprendentemente competitiva.


0

Clojure, 115 byte

(apply some-fn(map(fn[r]#(re-matches r %))(map(fn[[x y]](re-pattern(str x"("y x")+")))["nu""un""mw""wm""bq""qb"])))

Costruisci una regex su ciascuna coppia di lettere e vedi se l'input corrisponde a una coppia. Molti modi più eleganti per fare tutte queste parti, ma sono tutti più prolissi. Questa è la vita con il golf Clojure.


0

Perl 5, 68 + 1 = 69 byte

if(/../&&$&=~/nu|un|bq|qb|mw|wm/){s/^($&)*//;$&=~/./;print if/^$&$/}

Corri con -n.

Spiegazione:

# Match the first two characters, and if they exist, then...
if (/../ &&
 # Make sure they are a pair of compatible cartwheel characters.
 $&=~/nu|un|bq|qb|mw|wm/) {
  # If that's true, then eliminate as many of that pair of characters
  # from the beginning of the string as possible.
  s/^($&)*//;
  # Then get the first character out of the match (the first character
  # of the original string).
  $&=~/./;
  # Print the text (which is truthy since it's nonempty) if the original
  # first character matches exactly the remaining string.
  print if/^$&$/
  # Otherwise, print nothing (the empty string in Perl is falsy).
}

0

TXR Lisp , 50 byte

(f^$ #/n(un)+|u(nu)+|m(wm)+|w(mw+)|b(qb)+|q(bq)+/)

Correre:

1> (f^$ #/n(un)+|u(nu)+|m(wm)+|w(mw+)|b(qb)+|q(bq)+/)
#<intrinsic fun: 1 param>
2> [*1 "nun"]
"nun"
3> [*1 "nuns"]
nil
4> [*1 "mwm"]
"mwm"
5> [*1 "wmw"]
"wmw"
6> [*1 "abc"]
nil

f^$è un combinatore che accetta un oggetto regex e restituisce una funzione che corrisponde a quel regex in modo ancorato. (Di per sé, un oggetto regex è un oggetto richiamabile da una funzione che prende una stringa e cerca se stesso attraverso di essa.)



0

TXR : 78 74 byte

@{x 2}@(rep :gap 0)@x@(end)@y
@(bind(x y)(#"nu un mw wm bq qb"@[x 0..1]))

Esegui, dal prompt di sistema. Il numero nel prompt è stato di terminazione: 0 = successo, 1 = errore:

0:$ ./txr cart.txr 
nun
0:$ ./txr cart.txr 
abc
1:$ ./txr cart.txr 
bab
1:$ ./txr cart.txr 
mwm
1:$ ./txr cart.txr 
nununununun
0:$

Spiegazione:

  • @{x 2}: abbina due caratteri, associa alla xvariabile.
  • @(rep :gap 0)@x@(end): corrispondenza ripetuta senza spazi saltati: zero o più occorrenze di x, il digraph precedentemente associato.
  • @y: resto della riga corrispondente, catturato in y.
  • @(bind(x y)(foo bar)): associa xa foo, y a bar. Poiché xe ysono già vincolati, devono corrispondere fooe bar, altrimenti, si verifica un errore.
  • fooè #"nu un mw wm bq qb", una lista di parole letterale, zucchero sintattico per la lista di Lisp ("nu" "un" ... "qb"). Una bindcorrispondenza tra una variabile e un elenco indica che la variabile deve corrispondere a un elemento.
  • barè @[x 0..1]: la sottostringa a un carattere di xdall'inizio. La bindcorrispondenza tra ye questo impone che l'ultima lettera della riga corrisponda alla prima.

0

C ++, 268 byte

#include<map>
#include<string>
std::map<char,char>c{{'n','u'},{'m','w'},{98,'q'},{'w','m'},{'u','n'},{'q',98}};
int w(std::string s){if(s[0]!=s[s.size()-1]||c.find(s[0])==c.end()||s.size()<3)return 0;for(int i=0;i<s.size()-1;i+=2)if(s[i+1]!=c[s[i]])return 0;return 1;}

Salva 10 byte utilizzando i valori ASCII per tutti i caratteri anziché solo due.
MD XF,

@MDXF n= 110, u= 117, m= 109, w= 119, q= 113. Quindi usare i valori ASCII o no non importa per nessun carattere superiore a c(99)
HatsuPointerKun

0

JavaScript (ES6), 63 byte

s=>/bq|wm|un/.test(s)&s.replace(RegExp(s[0]+s[1],'g'),'')==s[0]

Restituisce 1o 0.

Spiegazione

Tutte le stringhe di cartwheel avranno uno o più di bq , wm o un . Lo testiamo con:

/bq|wm|un/.test(s)

Se sostituisci tutte le istanze delle prime due lettere di una stringa cartwheel con niente, rimarrai con la prima lettera della stringa. Lo testiamo con:

s.replace(RegExp(s[0]+s[1],'g'),'')==s[0]

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.