Trova le parole ondulate!


18

(Nota: questo è uno spin-off più semplice della mia precedente sfida Trova le parole infinite ! , che è uno spin-off della mia altra precedente sfida Trova le parole turbinanti! :))

Definizione di una parola ondulata :

  1. Se si collegano con le curve tutti i caratteri di una parola ondulata sull'alfabeto (AZ), si ottiene il percorso di un'onda che va continuamente verso destra o verso sinistra e non cambia mai direzione, come negli schemi sotto.
  2. Una parola ondulata può essere:
    • Sollevare se ogni carattere consecutivo si trova a destra (sull'alfabeto) di quello precedente.
    • Diminuendo se ogni carattere consecutivo si trova a sinistra (sull'alfabeto) di quello precedente.
  3. Tutte le connessioni pari devono essere inattive, tutte le connessioni dispari devono essere attive.
  4. È possibile ignorare le maiuscole / minuscole o considerare / convertire tutto in maiuscolo o tutto in minuscolo.
  5. Le parole di input sono solo caratteri nell'intervallo alfabetico di AZ, nessuno spazio, nessuna punteggiatura o simboli.
  6. Se una parola ha caratteri doppi, come "SPOON", devi comprimere i doppi in un carattere: "SPOON"> "SPON" (perché se passi da O a O è zero distanza).
  7. Le parole ondulate conterranno almeno 3 caratteri distinti (anche dopo il collasso dei doppi).

Ecco alcuni esempi:

inserisci qui la descrizione dell'immagine

Compito:

Scrivi un programma o una funzione completi che prenderanno una parola dall'input standard e verranno emessi se si tratta di una parola ondulata o meno, e in caso positivo, l'output se sta aumentando o diminuendo . L'uscita può essere True/False/Null, 2/1/0, 1/Null/0, -1/0/1, NO/WR/WD, ecc, si decide come rappresentare esso.

Casi test:

WAVY WORDS:
  ADEPT, BEGIN, BILL, BOSS, BOOST, CHIMP,
  KNOW, SPONGE, SPOON, TROLL, WOLF  

ADEPT  > YES > RAISING
BEGIN  > YES > RAISING
BILL   > YES > RAISING
BOSS   > YES > RAISING
BOOST  > YES > RAISING
CHIMP  > YES > RAISING
KNOW   > YES > RAISING
SPONGE > YES > DECREASING
SPOON  > YES > DECREASING
TROLL  > YES > DECREASING
WOLF   > YES > DECREASING

NOT WAVY WORDS:
  WATCH, EARTH, NINON, FOO, BAR, WAVE, SELECTION,
  YES, NO, DEFINITION, WATER, WINE, CODE, AAAHHHH, I, MM, ABCA

Regole:

  • Il codice più corto vince.

Attività opzionale:

Trova, come elenco, quante più parole ondulate che puoi in un dizionario inglese e anche il più lungo. Puoi prendere ad esempio come riferimento l'elenco completo di parole inglesi qui .


Come hai fatto le foto?
Oliver Ni,

@Oliver Con Illustrator perché ce l'ho per lavoro, ma è possibile ottenere risultati simili con Gimp o Inkskape o altri.
Mario,

NOe FOOnon sono input validi dalle tue regole.
PurkkaKoodari,

1
@ Pietu1998 Sono nella NOT WAVY WORDSsezione però, il che è corretto ..
Kade,

1
@xnor # 5 puoi presumere che tutte le parole di input siano come descritte, non è necessario convalidare. # 7 questo è il numero minimo di lettere per creare una forma d'onda. Per il resto decidi l'output che preferisci.
Mario,

Risposte:


6

05AB1E , 11 9 byte (Grazie ad Adnan)

Dg2›iÇü‹Ù

Provalo online!

Casi ondulati:

0 - Riduzione ondulata

1 - Aumentare ondulato

Casi non ondulati:

[0,1] - Non ondulato, inizialmente in diminuzione, ma poi ha un aumento / uguaglianza che ha rotto il modello.

[1,0] - Non ondulato, inizialmente in aumento, ma poi ha una diminuzione / uguaglianza che ha rotto il modello

Input String - Non è possibile essere ondulati in primo luogo a causa della lunghezza.

Spiegazione:

Dg2›iÇü‹Ù   # Full program

D           # Push 2 copies of input.
 g2›i       # If length is greater than 2. 
     Ç      # Push ASCII values for all characters in the string.
      ü     # Push pairwise array.
       ‹    # Vectorize 1 if negative difference, 0 if positive difference.
        Ù   # Uniquify using right most unique values first.
            # Else just print the string back, letting them know it's not valid input.

1
@JonathanAllan Dangit ... Ho appena visto i commenti e le modifiche ... The input words will contain at least 3 distinct charactersHo pensato che non avrei dovuto gestire meno di 3 caratteri. Lavorare sui cambiamenti, potrebbe richiedere del tempo; questa è la mia prima risposta che sono stato in grado di fare in 05AB1E.
Magic Octopus Urn,

1
@JonathanAllan Fixed :)! Ma ora mi stai picchiando;).
Magic Octopus Urn,

1
Molto bella! Un consiglio, ü‹è lo stesso di ü-0‹:)
Adnan,

Hehehe ... Amico, dovrei solo imparare Python e iniziare ad aiutare ad espandere 05AB1E. Questa lingua è impressionante. Grazie per il consiglio!
Magic Octopus Urn,

5

Gelatina , 10 byte

OIṠḟ0µL’aQ

TryItOnline! o eseguire tutti i casi di test

Ritorni:
[1]per ondulato crescente
[-1]per ondulato diminuendo
qualcos'altro altrimenti ( [], [0], [-1,1], o [1,-1])

(Dichiarata come inutili: Per un singolo valore per ciascuno OIṠḟ0µL’aQS(11 byte) tornerà 1, -1e 0rispettivamente.)

Come?

OIṠḟ0µL’aQ - Main link: s
O          - cast to ordinals
 I         - incremental differences
  Ṡ        - sign (-1 for decreasing, 0 for no change, 1 for increasing)
   ḟ0      - filter out zeros
     µ     - monadic chain separation
      L    - length
       ’   - decremented
        a  - and
         Q - unique items

È consentito avere 3 diverse possibili uscite per nessuno dei due casi?
xnor

Ho preso "decidi tu come rappresentarlo" per dire sì, purché siano diversi. Tuttavia, la tua domanda sulla regola n. 5 potrebbe invalidare questo (e probabilmente ogni altra voce).
Jonathan Allan,

Aggiunta una soluzione a questo, se necessario.
Jonathan Allan,

Non puoi semplicemente sommare l'elenco?
xnor

Oh, sì, certo> _ <grazie.
Jonathan Allan,

3

Python 2, 54 byte

lambda s:[2<len(set(s))<s[::b]==sorted(s)for b in-1,1]

Accetta input come un elenco di caratteri. Uscite:

[False, True] for ascending
[True, False] for descending
[False, False] for neither

Verifica se la stringa di input ordinata è uguale al suo originale o al contrario. Lo fa affettando con passi di 1 e -1. Allo stesso tempo, controlliamo se la parola ha almeno 2 lettere distinte.

Se "exit with error" può essere usato come output per nessuno dei due casi, possiamo scendere a 51 byte:

lambda s:[s,s[::-(len(set(s))>2)]].index(sorted(s))

Abbastanza sicuro che puoi prendere un elenco di caratteri poiché non è specificato come stringa: meta.codegolf.stackexchange.com/a/2216/8478
Jonathan Allan,

3

Python 3, 77 75 byte

lambda x:(len(set(x))>2)*(list(x)==sorted(x)or(list(x)==sorted(x)[::-1])*2)

Presuppone che tutte le lettere siano dello stesso caso.

Ritorna:

  • 0 se non ondulato
  • 1 se in avanti ondulato
  • 2 se ondulato all'indietro

Rimossi spazi non necessari grazie a @ETHproductions


2
Benvenuti in PPCG e bella prima risposta! Tuttavia, devi anche assicurarti che ci siano almeno tre caratteri distinti nella stringa; in caso contrario, non è una parola ondulata, non importa quale.
ETHproductions

Ah giusto. Avrei dovuto guardare più da vicino la definizione di una parola ondulata. Fisso.
C. Smith,

Bello! Non sono un esperto di Python, ma penso che puoi rimuovere lo spazio su entrambi i lati di or.
ETHproductions

Sì, hai ragione. Ho dimenticato di rimuoverli dopo aver circondato le espressioni tra parentesi. Grazie per la cattura!
C. Smith,

3

R, 96 95 byte

function(x,d=diff(rle(utf8ToInt(x))$v))if(any(d>0)&any(d<0)|sum(1|d)<2)3 else`if`(all(d<1),2,1)

Ritorna:

  • 1 per ondulato e rilancio
  • 2 per ondulato e decrescente
  • 3 per non ondulato

spiegato

  • d=diff(rle(utf8ToInt(x))$v): Genera una variabile dconvertendo prima la stringa nei suoi ASCIIvalori usando utf8ToIntquale restituisce comodamente un vettore. Successivamente eseguire la codifica della lunghezza della corsa utilizzando rle. rle(...)$vrestituisce i valori non ripetitivi della sequenza (ovvero comprimendo tutte le esecuzioni). Finalmente fai la differenza.
  • if(any(d>0)&any(d<0)|sum(1|d)<2)3: Se almeno una delle differenze è positiva e almeno una negativa, o se la sequenza di differenza ha meno di 2 elementi (equivalente alla parola originale con meno di 3 caratteri), la parola non è ondulata e restituisce3
  • else``if``(all(d<1),2,1): Altrimenti se tutte le differenze sono negative, ritorna 2per ondulato e decrescente, altrimenti ritorna 1per ondulato e rilancio.

Prova tutti i casi di test su R-fiddle (nota che è chiamato in modo tale da poter essere vettorizzato per i casi di test).


3

JavaScript (ES6), 84 81 byte

s=>(new Set(t=[...s]).size>2)*(!t.some((c,i)=>c>s[i+1])-!t.some((c,i)=>c<s[i+1]))

Presuppone che l'input sia tutto nello stesso caso. Restituisce 1per aumentare ondulato, -1per diminuire ondulato 0o -0(entrambi sono falsi) per non ondulato. Modifica: salvato 3 byte grazie a @RobertHickman.


Non sono un esperto delle nuove funzionalità, ma puoi rimuoverlo new?
Cyoce,

@Cyoce Purtroppo le nuove funzionalità richiedono l'uso new.
Neil,

@Neil, credo, Puoi salvare un byte inizializzando un'altra variabile all'interno della funzione Set () t=[...s]e usando t invece di [... s] in quei due punti che hai.
Robert Hickman,

3

Javascript (ES6), 84 80 78 byte

i=>new Set(s=[...i]).size>2?[i,s.reverse().join``].indexOf(s.sort().join``):-1

Dove l'aumento ondulato è 0, la diminuzione è 1 e -1 non è ondulato.

Grazie a @Neil per avermi aiutato a salvare 2 byte.


1
new Set(s=[...i])ti fa risparmiare 2 byte. (Funziona iterando i, trasformandolo in un array, ripetendo l'array e trasformandolo in un set. Contorto, ma non ti preoccupi di quel genere di cose quando giochi a golf.)
Neil


2

Python 2, 53 52 50 byte

Prevede input racchiusi tra virgolette, ad es "watch"

Come lambda senza nome:

lambda s:(sum(map(cmp,s[1:],s))+1)/min(len(s)-1,3)

Somma il segno di differenza tra ogni lettera e numero intero diviso per len-1. Se tutti 1(aumentando) la somma è len-1visualizzata 1, simile per diminuzione -1e per misto 1, -1la somma è minore dilen-1 così viene visualizzata 0.

-1 byte per passare cmp,s[1:],s[:-1])acmp,s[1:],s)+1


Ritorneremo 1per"NO"
Jonathan Allan il

@JonathanAllan, LMNOPquindi O è dopo N, il che significa aumentare, il che significa 1
Karl Napf,

Sì, ma qualsiasi parola di meno di 3 caratteri (dopo aver rimosso le lettere duplicate) è stata definita come non ondulata ("NO" è nei casi di test non ondulati).
Jonathan Allan,

@JonathanAllan risolto il lenproblema, ma i caratteri ripetuti sono ancora un problema
Karl Napf,

2

Rubino, 54 byte

->w{c=w.chars.uniq;c==(s=c.sort)?2:(c==s.reverse)?1:0}

Restituisce 0se la parola non è ondulata, 1se è ondulata all'indietro e 2se è ondulata in avanti.


2

Groovy - 56 byte

{D = it [0]; c = [0] * 3; it.each {a-> c [(a <=> d)] = 1; d = a}; c [1 ..- 1]}

Uscite [1,0]per l'innalzamento ondulato, [0,1]per l'ondulazione decrescente, [0,0]per l'immissione di singoli caratteri o [1,1]per non ondulati.

NOTA: si suppone che l'input sia una stringa o un carattere [] e che tutte le lettere siano dello stesso caso.


2

PHP, 96 byte

for(;($t=$argv[1])[++$i];)$s+=$r[]=$t[$i-1]<=>$t[$i];echo(max($r)-min($r)<2)*(0<=>$s)*(1<$s*$s);

o 98 byte

$s=str_split($t=$argv[1]);sort($s);echo(-($t==strrev($j=join($s)))|$t==$j)*!!count_chars($t,3)[2];

0 non ondulato 1 in aumento -1 in diminuzione


-anziché 2*(-1 per diminuire: -1 byte). *(!!...)non ha bisogno di parentesi. (-2)
Tito

$s*$s>1anziché abs($s)>1(-2)
Tito

@Titus Fatto grazie
Jörg Hülsermann,

2

PHP, 100 byte

$n=$m=$l=str_split($argv[1]);sort($n);rsort($m);echo(($n==$l)-($m==$l))*(count(array_unique($l))>2);

Ritorna:

  • -1 per ondulato, decrescente.
  • 0 per non ondulato.
  • 1 per ondulato, alzando.

!!array_unique($s)[2]invece dicount(array_unique($l))>2
Jörg Hülsermann,

In realtà, il problema è che array_unique prevarrà sulle chiavi. Pertanto, un input come aaabc genererà 0 in modo errato quando si utilizza array_unique.
chocochaos

1

C, 164 byte

main(){char s[99];scanf("%s",s);char *c=&s;int p=*c;while(*c^0){if(p>*c){if(c-&s[0]>1)return 0;while(*c^0){if(p<*c)return 0;p=*c;c++;}return 2;}p=*c;c++;}return 1;}

Restituisce 0 se non pazzo, 1 se pazzo e in aumento, 2 se decrescente.


1

Racchetta 321 byte

(let*((ld(λ(sl)(for/list((i(sub1(length sl))))(-(list-ref sl(add1 i))(list-ref sl i)))))(l(ld(remove-duplicates(map
(λ(x)(char->integer x))(string->list s)))))(am andmap)(N"Not WAVY")(d displayln))(cond[(<(length l)2)(d N)][(am(λ(x)(>= x 0))l)
(d"YES; RAISING")][(am(λ(x)(<= x 0))l)(d"YES; DECREASING")][else(d N)])))

Ungolfed:

(define (f s)
  (let*  ((ld (lambda(sl)          ; sub-fn to get differences in list elements
                (for/list ((i (sub1(length sl))))
                  (- (list-ref sl (add1 i))
                     (list-ref sl i) ) )))
          (l (ld
              (remove-duplicates
               (map
                (lambda(x)
                  (char->integer x))
                (string->list s)))))
          (am andmap)
          (N "Not WAVY")
          (d displayln))
    (cond
      [(< (length l) 2)(d N)]
      [(am (lambda(x) (>= x 0)) l) (d "YES; RAISING")]
      [(am (lambda(x) (<= x 0)) l) (d "YES; DECREASING")]
      [else (d N)]
      )))

test:

(f "ADEPT"); > YES > RAISING
(f "BEGIN"); > YES > RAISING
(f "BILL"); > YES > RAISING
(f "BOSS"); > YES > RAISING
(f "BOOST"); > YES > RAISING
(f "CHIMP"); > YES > RAISING
(f "KNOW"); > YES > RAISING
(f "SPONGE"); > YES > DECREASING
(f "SPOON"); > YES > DECREASING
(f "TROLL"); > YES > DECREASING
(f "WOLF"); > YES > DECREASING

(f "WATCH")
(f "EARTH")
(f "NINON")
(f "FOO")
(f "BAR")
(f "WAVE")
(f "SELECTION")

Produzione:

YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; DECREASING
YES; DECREASING
YES; DECREASING
YES; DECREASING
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY

1

Java 7, 254 240 byte

import java.util.*;int c(String s){char[]a=s.toCharArray(),x=a.clone();Arrays.sort(x);return s.replaceAll("(.)\\1{1,}","$1").length()<3?0:Arrays.equals(a,x)|Arrays.equals(x,(new StringBuffer(s).reverse()+"").toCharArray())?a[0]>a[1]?1:2:0;}

Emette 0se la stringa di input non è ondulata, 1se è un'onda che si alza e2 se è un'onda decrescente.

Codice non testato e test:

Provalo qui.

import java.util.*;
class M{
  static int c(String s){
    char[] a = s.toCharArray(),
           x = a.clone();
    Arrays.sort(x);
    return s.replaceAll("(.)\\1{1,}", "$1").length() < 3
            ? 0
            : Arrays.equals(a, x) | Arrays.equals(x, (new StringBuffer(s).reverse()+"").toCharArray())
               ? a[0] > a[1]
                  ? 1
                  : 2
               : 0;
  }

  public static void main(String[] a){
    System.out.print(c("ADEPT") + ", ");
    System.out.print(c("BEGIN") + ", ");
    System.out.print(c("BILL") + ", ");
    System.out.print(c("BOSS") + ", ");
    System.out.print(c("BOOST") + ", ");
    System.out.print(c("CHIMP") + ", ");
    System.out.println(c("KNOW"));

    System.out.print(c("SPONGE") + ", ");
    System.out.print(c("SPOON") + ", ");
    System.out.print(c("TROLL") + ", ");
    System.out.println(c("WOLF"));

    System.out.print(c("WATCH") + ", ");
    System.out.print(c("EARTH") + ", ");
    System.out.print(c("NINON") + ", ");
    System.out.print(c("FOO") + ", ");
    System.out.print(c("BAR") + ", ");
    System.out.print(c("WAVE") + ", ");
    System.out.print(c("SELECTION") + ", ");
    System.out.print(c("YES") + ", ");
    System.out.print(c("NO") + ", ");
    System.out.print(c("DEFINITION") + ", ");
    System.out.print(c("WATER") + ", ");
    System.out.print(c("WINE") + ", ");
    System.out.print(c("CODE") + ", ");
    System.out.print(c("AAAHHHH") + ", ");
    System.out.print(c("I") + ", ");
    System.out.print(c("MM") + ", ");
    System.out.println(c("ABCA"));
  }
}

Produzione:

2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

int c(char[]s){int t=s[0],f=s.length,a=1,b=1,i;for(i=1;i<f;){if(s[i]-s[i-1]>=0)++a;if(s[i]-s[i++-1]<1)++b;}return a==f?1:b==f?-1:0;}(132 byte)
Numberknot

Uscita 1 se aumento ondulato, uscita -1 se ondulato decrescente, 0 se non ondulato
Numberknot
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.