Encontre as palavras onduladas!

18

(Nota: este é um spin-off mais fácil do meu desafio anterior Find the Infinity Words!, Que é um spin-off do meu outro desafio anterior Find the Swirling Words! :))

Definição de uma palavra ondulada :

  1. Se você conectar com curvas todos os caracteres de uma Palavra Ondulada no alfabeto (AZ), obterá o caminho de uma onda indo continuamente para a direita ou para a esquerda e nunca mudando de direção, como nos diagramas abaixo.
  2. Uma palavra ondulada pode ser:
    • Aumentando se cada caractere consecutivo está à direita (no alfabeto) do anterior.
    • Diminuindo se cada caractere consecutivo estiver à esquerda (no alfabeto) do caractere anterior.
  3. Todas as conexões pares devem estar inoperantes, todas as conexões ímpares devem estar ativadas.
  4. Você pode ignorar maiúsculas / minúsculas ou considerar / converter tudo em maiúsculas ou tudo em minúsculas.
  5. As palavras de entrada são apenas caracteres no intervalo alfabético de AZ, sem espaços, sem pontuação ou símbolos.
  6. Se uma palavra tiver caracteres duplos, como "COLHER", você deverá reduzir as dobras para um caractere: "COLHER"> "COLHER" (porque se você passar de O para O é a distância zero).
  7. As Palavras Onduladas conterão pelo menos 3 caracteres distintos (mesmo após o colapso das duplas).

Aqui estão alguns exemplos:

insira a descrição da imagem aqui

Tarefa:

Escreva um programa ou função completa que retire uma palavra da entrada padrão e saia se for uma Palavra Ondulada ou não, e, no caso positivo, saia se estiver aumentando ou diminuindo . A saída pode ser True/False/Null, 2/1/0, 1/Null/0, -1/0/1, NO/WR/WD, etc, você decide como para representá-lo.

Casos de teste:

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

Regras:

  • O menor código vence.

Tarefa opcional:

Encontre, como uma lista, o maior número possível de Palavras Onduladas em um dicionário em inglês, e as mais longas também. Você pode tomar, por exemplo, como referência a lista completa de palavras em inglês aqui .

Mario
fonte
Como você fez as fotos?
Oliver Ni
@ Oliver Com o Illustrator porque o tenho para o trabalho, mas é possível obter resultados semelhantes com o Gimp, o Inkskape ou outros.
Mario
NOe FOOnão são entradas válidas pelas suas regras.
PurkkaKoodari
1
@ Pietu1998 Eles estão na NOT WAVY WORDSseção, porém, o que é correto ..
Kade
1
@xnor # 5, você pode assumir que todas as palavras de entrada são as descritas, sem necessidade de validar. # 7 este é o número mínimo de letras para criar uma forma de onda. De resto, você decide a saída como preferir.
Mario

Respostas:

6

05AB1E , 11 9 bytes (Graças a Adnan)

Dg2›iÇü‹Ù

Experimente online!

Casos ondulados:

0 - Diminuindo Ondulado

1 - Aumentando Ondulado

Casos não ondulados:

[0,1] - Não ondulado, diminuindo inicialmente, mas depois apresenta um aumento / igualdade que quebrou o padrão.

[1,0] - Não ondulado, aumentando inicialmente, mas depois apresenta uma diminuição / igualdade que quebrou o padrão

String de entrada - Não é possível ficar ondulado em primeiro lugar devido ao comprimento.

Explicação:

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.
Urna de polvo mágico
fonte
1
@ JonathanAllan Dangit ... Acabei de ver os comentários e alterações ... Entendi The input words will contain at least 3 distinct charactersque não precisava lidar com menos de três palavras de caractere. Trabalhando em mudanças, pode demorar um pouco; esta é minha primeira resposta que pude fazer no 05AB1E.
Magic Octopus Urn
1
@JonathanAllan Fixed :)! Mas agora você está me batendo;).
Magic Octopus Urn
1
Muito agradável! Uma dica, ü‹é o mesmo que ü-0‹:)
Adnan
Hehehe ... Cara, talvez eu tenha que aprender python e começar a ajudar a expandir o 05AB1E. Essa linguagem é impressionante. Obrigado pela dica!
Magic Octopus Urn
5

Gelatina , 10 bytes

OIṠḟ0µL’aQ

TryItOnline! ou execute todos os casos de teste

Returns:
[1]para ondulado aumentando
[-1]para ondulado diminuindo
outra coisa de outra forma ( [], [0], [-1,1]ou [1,-1])

(Declarada como desnecessária: Para um único valor para cada um OIṠḟ0µL’aQS(11 bytes) voltará 1, -1e 0respectivamente).

Quão?

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
Jonathan Allan
fonte
Você tem permissão para ter três saídas possíveis diferentes para os dois casos?
Xnor
Peguei "você decide como representá-lo" para significar sim, desde que sejam diferentes. No entanto, sua pergunta sobre a regra nº 5 pode invalidar isso (e provavelmente todas as outras entradas).
Jonathan Allan
Adicionada uma solução para isso, se necessário.
Jonathan Allan
Você não pode somar a lista?
Xnor
Ah, sim, é claro> _ <obrigado.
Jonathan Allan
3

Python 2, 54 bytes

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

Recebe a entrada como uma lista de caracteres. Saídas:

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

Verifica se a sequência de entrada classificada é igual ao original ou reversa. Faz isso cortando com tamanhos de etapas de 1 e -1. Ao mesmo tempo, verificamos se a palavra tem pelo menos 2 letras distintas.

Se "exit with error" puder ser usado como saída nos dois casos, podemos reduzir para 51 bytes:

lambda s:[s,s[::-(len(set(s))>2)]].index(sorted(s))
xnor
fonte
Certeza que você pode ter uma lista de caracteres, uma vez que não é especificado como uma string: 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)

Assume que todas as letras são do mesmo caso.

Devoluções:

  • 0 se não for ondulado
  • 1 se encaminha ondulado
  • 2 se ondulado para trás

Removidos espaços desnecessários graças a @ETHproductions

C. Smith
fonte
2
Bem-vindo ao PPCG e boa primeira resposta! No entanto, você também precisa garantir que haja pelo menos três caracteres distintos na string; se não, não é uma palavra ondulada, não importa o quê.
ETHproductions
Ah, certo. Deveria ter olhado mais de perto a definição de uma palavra ondulada. Fixo.
C. Smith
Agradável! Eu não sou um especialista em Python, mas acho que você pode remover o espaço de ambos os lados do or.
ETHproductions
Sim, você está certo. Esqueceu de removê-los depois de colocar as expressões entre parênteses. Obrigado pela 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)

Devoluções:

  • 1 para ondulado e levantando
  • 2 para ondulado e decrescente
  • 3 para não ondulado

Explicado

  • d=diff(rle(utf8ToInt(x))$v): Gera uma variável dconvertendo primeiro a cadeia de caracteres em seus ASCIIvalores usando o utf8ToIntque convenientemente retorna um vetor. Posteriormente, execute a codificação do comprimento da execução usando rle. rle(...)$vretorna os valores não repetidos da sequência (ou seja, recolhendo todas as execuções). Finalmente pegue a diferença.
  • if(any(d>0)&any(d<0)|sum(1|d)<2)3: Se pelo menos uma das diferenças for positiva e pelo menos uma negativa, ou se a sequência de diferenças tiver menos de 2elementos (equivalente à palavra original com menos de 3 caracteres), a palavra não será ondulada e retornará3
  • else``if``(all(d<1),2,1): Caso contrário, se todas as diferenças forem negativas, retorne 2 contrário, para ondulado e decrescente; caso contrário, retorne 1para ondulado e aumentado.

Experimente todos os casos de teste no R-fiddle (observe que o nome é tal que pode ser vetorizado para os casos de teste).

Billywob
fonte
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]))

Assume que a entrada é tudo no mesmo caso. Retorna 1para aumentar ondulado, -1para diminuir ondulado 0ou -0(ambos são falsos) para não ondulado. Editar: salvou 3 bytes graças a @RobertHickman.

Neil
fonte
Não sou especialista nos recursos mais recentes, mas você pode removê-lo new?
Cyoce 29/10
@Cyoce Irritantemente, os novos recursos exigem que você use new.
Neil
@ Neil, acredito, você pode salvar um byte inicializando outra variável dentro da função Set () t=[...s]e usando t em vez de [...] nos dois pontos em que você o possui.
Robert Hickman
3

Javascript (ES6), 84 80 78 bytes

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

Onde o aumento ondulado é 0, o decréscimo é 1 e -1 não é ondulado.

Agradeço ao @ Neil por me ajudar a economizar 2 bytes.

Robert Hickman
fonte
1
new Set(s=[...i])economiza 2 bytes. (Ele funciona através da iteração i, transformando-o em uma matriz, iteração a matriz, e transformando isso em um conjunto complicado, mas você não se preocupe com esse tipo de coisa quando você está golfe..)
Neil
2

Python 2, 53 52 50 bytes

Espera a entrada entre aspas, por exemplo "watch"

Como lambda sem nome:

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

Soma o sinal de diferença entre cada letra e o número inteiro dividido por len-1. Se todos estivessem 1(aumentando) a soma que é len-1exibida 1, semelhante para diminuir -1e para misto 1, -1a soma é menor do que len-1é exibida 0.

-1 byte para mudar cmp,s[1:],s[:-1])paracmp,s[1:],s)+1

Karl Napf
fonte
Retornará 1para"NO"
Jonathan Allan
@JonathanAllan LMNOPentão O está atrás de N, o que significa aumentar, o que significa que 1
Karl Napf 28/10
Sim, mas qualquer palavra com menos de três caracteres (após remover as letras duplicadas) foi definida como não ondulada ("NÃO" está nos casos de teste não ondulados).
Jonathan Allan
@JonathanAllan fixado o lenproblema, mas eu os caracteres de repetição ainda são um problema
Karl Napf
2

Ruby, 54 bytes

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

Retorna 0se a palavra não estiver ondulada, 1se estiver ondulada para trás e 2se estiver ondulada para frente.

Lee W
fonte
2

Groovy - 56 bytes

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

Saídas [1,0]para aumentar ondulado, [0,1]para diminuir ondulado, [0,0]para entrada de caractere único ou [1,1]para não ondulado.

NOTA: Assume que a entrada é uma String ou um caractere [] e todas as letras são do mesmo caso.

GolfIsAGoodWalkSpoilt
fonte
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);

ou 98 bytes

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

0 não ondulado 1 aumentando -1 diminuindo

Jörg Hülsermann
fonte
-em vez de 2*(-1 para diminuir: -1 byte). *(!!...)não precisa de parênteses. (-2)
Tito
$s*$s>1em vez de abs($s)>1(-2)
Tito
@Titus Done Obrigado
Jörg Hülsermann 30/10/16
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);

Devoluções:

  • -1 para ondulado, diminuindo.
  • 0 para não ondulado.
  • 1 para ondulado, levantando.
chocochaos
fonte
!!array_unique($s)[2]em vez decount(array_unique($l))>2
Jörg Hülsermann 29/10
Na verdade, o problema disso é que array_unique irá prevalecer nas chaves. Assim, uma entrada como aaabc produzirá falsamente 0 quando usar 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;}

Retorna 0 se não estiver em movimento, 1 se estiver em movimento e aumentando, 2 se estiver diminuindo.

Steadybox
fonte
1

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

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

Teste:

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

Resultado:

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

Saída 0se a sequência de entrada não estiver ondulada, 1se for uma onda crescente e 2se for uma onda decrescente.

Ungolfed & código de teste:

Experimente aqui.

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

Resultado:

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
Kevin Cruijssen
fonte
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
Saída 1 se levantar ondulado, saída de -1 se ondulado diminuindo, 0 se não ondulado
Numberknot