Encuentra las palabras onduladas!


18

(Nota: este es un spin-off más fácil de mi desafío anterior Find the Infinity Words!, Que es un spin-off de mi otro desafío anterior Find the Swirling Words! :))

Definición de una palabra ondulada :

  1. Si conecta con curvas todos los caracteres de una Palabra ondulada en el alfabeto (AZ), obtiene el camino de una onda que va continuamente hacia la derecha o hacia la izquierda y nunca cambia de dirección, como en los diagramas a continuación.
  2. Una palabra ondulada puede ser:
    • Aumento si cada carácter consecutivo está a la derecha (en el alfabeto) del anterior.
    • Disminuye si cada carácter consecutivo está a la izquierda (en el alfabeto) del anterior.
  3. Toda la conexión par debe estar inactiva, todas las conexiones impares deben estar activadas.
  4. Puede ignorar mayúsculas / minúsculas o considerar / convertir todo a mayúsculas o todo a minúsculas.
  5. Las palabras de entrada son solo caracteres en el rango alfabético de AZ, sin espacios, sin signos de puntuación o símbolos.
  6. Si una palabra tiene caracteres dobles, como "CUCHARA", debe contraer los dobles a un carácter: "CUCHARA"> "ESPONJA" (porque si va de O a O es distancia cero).
  7. Las palabras onduladas contendrán al menos 3 caracteres distintos (incluso después del colapso de los dobles).

Aquí hay algunos ejemplos:

ingrese la descripción de la imagen aquí

Tarea:

Escriba un programa o función completa que tomará una palabra de la entrada estándar y dará salida si es una palabra ondulada o no, y en caso positivo, dará salida si está aumentando o disminuyendo . La salida puede ser True/False/Null, 2/1/0, 1/Null/0, -1/0/1, NO/WR/WD, etc, a decidir la forma de representar la misma.

Casos de prueba:

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

Reglas:

  • El código más corto gana.

Tarea opcional:

Encuentre, en una lista, tantas palabras onduladas como pueda en un diccionario de inglés, y también las más largas. Puede tomar como referencia la lista completa de palabras en inglés aquí .


¿Cómo hiciste las fotos?
— Oliver Ni

@Oliver With Illustrator porque lo tengo para trabajar, pero es posible obtener resultados similares con Gimp o Inkskape, u otros.
— Mario

NOy FOOno son entradas válidas por sus reglas.
— PurkkaKoodari

1
@ Pietu1998 Sin embargo, están en la NOT WAVY WORDSsección, lo cual es correcto ..
— Kade

1
@xnor # 5 puede asumir que todas las palabras de entrada son como se describen, no es necesario validar. # 7 este es el número mínimo de letras para hacer una forma de onda. Por lo demás, usted decide la salida que prefiera.
— Mario

Respuestas:


6

05AB1E , 11 9 bytes (Gracias a Adnan)

Dg2›iÇü‹Ù

Pruébalo en línea!

Casos ondulados:

0 - Ondulado decreciente

1 - Ondulado creciente

Casos no ondulados:

[0,1] - No ondulado, inicialmente disminuyendo, pero luego tiene un aumento / igualdad que rompió el patrón.

[1,0] - No ondulado, inicialmente aumentando, pero luego tiene una disminución / igualdad que rompió el patrón

Cadena de entrada : no es posible ser ondulado en primer lugar debido a la longitud.

Explicación:

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 ... Acabo de ver los comentarios y los cambios ... Supuse The input words will contain at least 3 distinct charactersque no tenía que manejar menos de 3 palabras char. Trabajar en los cambios puede llevar un tiempo; Esta es mi primera respuesta que pude hacer en 05AB1E.
— Urna de pulpo mágico

1
@JonathanAllan Fixed :)! Pero ahora me estás golpeando;).
— Urna mágica de pulpo

1
¡Muy agradable! Un consejo, ü‹es lo mismo que ü-0‹:)
— Adnan

Jejeje ... Hombre, puede que tenga que aprender Python y comenzar a ayudar a expandir 05AB1E. Este lenguaje es impresionante. ¡Gracias por el consejo!
— Urna mágica del pulpo

5

Jalea , 10 bytes

OIṠḟ0µL’aQ

TryItOnline! o ejecutar todos los casos de prueba

Devuelve:
[1]para aumentar ondulado
[-1]para disminuir ondulado
otra cosa de lo contrario ( [], [0], [-1,1], o [1,-1])

(Declarado como innecesaria: Para un único valor para cada uno OIṠḟ0µL’aQS(11 bytes) devolverá 1, -1y 0respectivamente).

¿Cómo?

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

¿Se le permite tener 3 salidas posibles diferentes para ninguno de los dos casos?
— xnor

Supuse que "tú decides cómo representarlo" significa que sí, siempre que sean diferentes. Sin embargo, su pregunta sobre la regla # 5 podría invalidar esto (y probablemente cualquier otra entrada).
— Jonathan Allan

Se agregó una solución a eso si es necesario.
— Jonathan Allan

¿No puedes simplemente resumir la lista?
— xnor

Oh, sí, por supuesto> _ <gracias.
— Jonathan Allan

3

Python 2, 54 bytes

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

Toma la entrada como una lista de caracteres. Salidas:

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

Comprueba si la cadena de entrada ordenada es igual a su original o inversa. Lo hace cortando con pasos de 1 y -1. Al mismo tiempo, verificamos si la palabra tiene al menos 2 letras distintas.

Si se puede utilizar "salir con error" como salida para ninguno de los dos casos, podemos bajar a 51 bytes:

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

Estoy bastante seguro de que puede tomar una lista de caracteres ya que no se especifica como una cadena: meta.codegolf.stackexchange.com/a/2216/8478
— Jonathan Allan

3

Python 3, 77 75 bytes

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

Asume que todas las letras son del mismo caso.

Devoluciones:

  • 0 si no ondulado
  • 1 si hacia adelante ondulado
  • 2 si está ondulado hacia atrás

Se eliminaron espacios innecesarios gracias a @ETHproductions


2
¡Bienvenido a PPCG, y buena primera respuesta! Sin embargo, también debe asegurarse de que haya al menos tres caracteres distintos en la cadena; si no, no es una palabra ondulada pase lo que pase.
— ETHproductions

Ah bien. Debería haber mirado más de cerca la definición de una palabra ondulada. Fijo.
— C. Smith

¡Agradable! No soy un experto en Python, pero creo que puedes eliminar el espacio a ambos lados del or.
— ETHproductions

Sí, tienes razón. Olvidé eliminarlos después de rodear las expresiones con paréntesis. Gracias por la captura!
— C. Smith

3

R, 96 95 bytes

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)

Devoluciones:

  • 1 para ondulado y criado
  • 2 para ondulado y decreciente
  • 3 para no ondulado

Explicado

  • d=diff(rle(utf8ToInt(x))$v): Genera una variable dconvirtiendo primero la cadena en sus ASCIIvalores usando lo utf8ToIntque convenientemente devuelve un vector. Posteriormente realice la codificación de longitud de ejecución usando rle. rle(...)$vdevuelve los valores no repetidos de la secuencia (es decir, contrayendo todas las ejecuciones). Finalmente toma la diferencia.
  • if(any(d>0)&any(d<0)|sum(1|d)<2)3: Si al menos una de las diferencias es positiva y al menos una negativa, o si la secuencia de diferencia tiene menos de 2elementos (equivalente a que la palabra original tenga menos de 3 caracteres), la palabra no es ondulada y regresa3
  • else``if``(all(d<1),2,1): De lo contrario, si todas las diferencias son negativas, regrese 2para ondulado y decreciente, de lo contrario regrese 1para ondulado y subiendo.

Pruebe todos los casos de prueba en R-fiddle (tenga en cuenta que se llama de tal manera que se puede vectorizar para los casos de prueba).


3

JavaScript (ES6), 84 81 bytes

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

Asume que la entrada está en el mismo caso. Retornos 1para aumentar ondulado, -1para disminuir ondulado 0o -0(ambos son falsos) para no ondulado. Editar: Guardado 3 bytes gracias a @RobertHickman.


No soy un experto en las nuevas funciones, pero ¿puedes eliminarlo new?
— Cyoce

@Cyoce Molesto, las nuevas funciones requieren que uses new.
— Neil

@Neil, creo, puede guardar un byte inicializando otra variable dentro de la función Set () t=[...s]y usando t en lugar de [...] en esos dos puntos donde lo tiene.
— Robert Hickman el

3

Javascript (ES6), 84 80 78 bytes

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

Donde el aumento ondulado es 0, la disminución es 1 y -1 no es ondulado.

Gracias a @Neil por ayudarme a ahorrar 2 bytes.


1
new Set(s=[...i])te ahorra 2 bytes. (Funciona iterando i, convirtiéndolo en una matriz, iterando la matriz y convirtiéndolo en un conjunto. Enrevesado pero no te preocupas por ese tipo de cosas cuando juegas al golf.)
— Neil


2

Python 2, 53 52 50 bytes

Espera entradas entre comillas, por ejemplo "watch"

Como lambda sin nombre:

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

Suma el signo de diferencia entre cada letra y la división entera por len-1. Si todos estuvieran 1(aumentando), la suma len-1se muestra 1, similar para disminuir -1y para mezclar 1, -1la suma es menor de len-1lo que se muestra 0.

-1 byte para cambiar cmp,s[1:],s[:-1])acmp,s[1:],s)+1


Volverá 1para"NO"
— Jonathan Allan

@JonathanAllan, LMNOPentonces O va después de N, lo que significa aumentar, lo que significa 1
— Karl Napf

Sí, pero cualquier palabra de menos de 3 caracteres (después de eliminar las letras duplicadas) se definió como no ondulada ("NO" se encuentra en los casos de prueba no ondulados).
— Jonathan Allan

@JonathanAllan solucionó el lenproblema, pero los caracteres repetidos siguen siendo un problema
— Karl Napf

2

Ruby, 54 bytes

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

Devuelve 0si la palabra no es ondulada, 1si es ondulada hacia atrás y 2si es ondulada hacia adelante.


2

Groovy - 56 bytes

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

Salidas [1,0]para elevar ondulado, [0,1]para disminuir ondulado, [0,0]para entrada de un solo carácter o [1,1]para no ondulado.

NOTA: Asume que la entrada es una Cadena o un carácter [] y todas las letras son del mismo caso.


2

PHP, 96 bytes

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 bytes

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

0 no ondulado 1 subiendo -1 disminuyendo


-en lugar de 2*(-1 para disminuir: -1 byte). *(!!...)no necesita paréntesis. (-2)
— Tito

$s*$s>1en lugar de abs($s)>1(-2)
— Titus

@Titus Done Gracias
— Jörg Hülsermann

2

PHP, 100 bytes

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

Devoluciones:

  • -1 para ondulado, decreciente.
  • 0 para no ondulado
  • 1 para ondulado, levantando.

!!array_unique($s)[2]en lugar decount(array_unique($l))>2
— Jörg Hülsermann

En realidad, el problema con eso es que array_unique precederá a las teclas. Por lo tanto, una entrada como aaabc generará falsamente 0 cuando use array_unique.
— chocochaos

1

C, 164 bytes

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

Devuelve 0 si no está ondulado, 1 si está ondulado y subiendo, 2 si está disminuyendo.


1

Raqueta 321 bytes

(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)])))

Sin golf:

(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)]
      )))

Pruebas:

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

Salida:

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 bytes

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

Emite 0si la cadena de entrada no es ondulada, 1si es una onda ascendente y 2si es una onda decreciente.

Ungolfed y código de prueba:

Pruébalo aquí

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"));
  }
}

Salida:

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 bytes)
— Numberknot

Salida 1 si sube ondulada, salida -1 si
— baja
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.