Trouvez les mots ondulés!

18

(Remarque: il s'agit d'un spin-off plus facile de mon défi précédent Find the Infinity Words!, Qui est un spin-off de mon autre défi précédent Find the Swirling Words! :))

Définition d'un mot ondulé :

  1. Si vous connectez avec des courbes tous les caractères d'un mot ondulé sur l'alphabet (AZ), vous obtenez le chemin d'une onde allant continuellement vers la droite ou vers la gauche et ne changeant jamais de direction, comme dans les schémas ci-dessous.
  2. Un mot ondulé peut être:
    • Augmenter si chaque caractère consécutif est à droite (sur l'alphabet) du précédent.
    • Diminue si chaque caractère consécutif est à gauche (sur l'alphabet) du précédent.
  3. Toutes les connexions paires doivent être interrompues, toutes les connexions impaires doivent être actives.
  4. Vous pouvez ignorer les majuscules / minuscules ou considérer / convertir tout en majuscules ou tout en minuscules.
  5. Les mots saisis sont uniquement des caractères de la gamme alphabétique AZ, pas d'espaces, pas de ponctuation ou des symboles.
  6. Si un mot a des caractères doubles, comme "SPOON", vous devez réduire les doubles à un caractère: "SPOON"> "SPON" (car si vous passez de O à O, la distance est nulle).
  7. Les mots ondulés contiendront au moins 3 caractères distincts (même après l'effondrement des doubles).

Voici quelques exemples:

entrez la description de l'image ici

Tâche:

Écrire un programme complet ou une fonction qui prendra un mot d'entrée et la sortie standard volonté si elle est un mot onduleux ou non, et dans le cas positif, la production si elle soulève ou baisse . La sortie peut être True/False/Null, 2/1/0, 1/Null/0, -1/0/1, NO/WR/WD, etc, vous décidez comment représenter.

Cas de 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

Règles:

  • Le code le plus court gagne.

Tâche facultative:

Trouvez, sous forme de liste, autant de mots ondulés que possible dans un dictionnaire anglais, et le plus long aussi. Vous pouvez prendre par exemple comme référence la liste complète des mots anglais ici .

Mario
la source
Comment as-tu fait les photos?
Oliver Ni
@Oliver With Illustrator car je l'ai pour le travail, mais il est possible d'obtenir des résultats similaires avec Gimp ou Inkskape, ou autres.
Mario
NOet FOOne sont pas des entrées valides selon vos règles.
PurkkaKoodari
1
@ Pietu1998 Ils sont dans la NOT WAVY WORDSsection cependant, ce qui est correct ..
Kade
1
@xnor # 5, vous pouvez supposer que tous les mots saisis sont tels que décrits, pas besoin de valider. # 7 c'est le nombre minimum de lettres pour faire une forme d'onde. Pour le reste, vous décidez de la sortie que vous préférez.
Mario

Réponses:

6

05AB1E , 11 9 octets (Merci à Adnan)

Dg2›iÇü‹Ù

Essayez-le en ligne!

Cas ondulés:

0 - Diminution ondulée

1 - Augmentation de l'ondulation

Cas non ondulés:

[0,1] - Pas ondulé, initialement décroissant, mais a ensuite une augmentation / égalité qui a brisé le motif.

[1,0] - Pas ondulé, initialement en augmentation, mais a ensuite une diminution / égalité qui a brisé le motif

Chaîne d'entrée - Impossible d'être ondulé en premier lieu en raison de la longueur.

Explication:

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.
Urne de poulpe magique
la source
1
@JonathanAllan Dangit ... Je viens de voir les commentaires et les changements ... J'ai compris The input words will contain at least 3 distinct charactersque je n'avais pas à gérer moins de 3 mots char. Travailler sur les changements peut prendre un certain temps; c'est ma première réponse que j'ai pu faire en 05AB1E.
Urne de poulpe magique
1
@JonathanAllan Fixed :)! Mais maintenant tu me bats;).
Urne de poulpe magique du
1
Très agréable! Un conseil, ü‹c'est la même chose que ü-0‹:)
Adnan
Hehehe ... Mec, je devrais peut-être juste apprendre le python et commencer à développer 05AB1E. Cette langue est impressionnante. Merci pour le conseil!
Urne de poulpe magique du
5

Gelée , 10 octets

OIṠḟ0µL’aQ

TryItOnline! ou exécutez tous les cas de test

Renvoie:
[1]pour les cheveux ondulés de plus en plus
[-1]pour les cheveux ondulés diminuant
autre chose autrement ( [], [0], [-1,1]ou [1,-1])

(Déclarée comme inutile: Pour obtenir une valeur unique pour chaque OIṠḟ0µL’aQS(11 octets) retourne 1, -1et 0respectivement).

Comment?

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
la source
Êtes-vous autorisé à avoir 3 sorties différentes possibles pour les deux cas?
xnor
J'ai pris "vous décidez comment le représenter" pour signifier oui, tant qu'ils sont différents. Cependant, votre question sur la règle n ° 5 pourrait invalider cela (et probablement toutes les autres entrées).
Jonathan Allan
Ajout d'une solution à cela si besoin est.
Jonathan Allan
Ne pouvez-vous pas simplement résumer la liste?
xnor
Oh, oui, bien sûr> _ <merci.
Jonathan Allan
3

Python 2, 54 octets

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

Prend la saisie sous forme de liste de caractères. Les sorties:

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

Vérifie si la chaîne d'entrée triée est égale à son origine ou son inverse. Le fait en découpant avec des tailles de pas de 1 et -1. Dans le même temps, nous vérifions si le mot a au moins 2 lettres distinctes.

Si "exit with error" peut être utilisé comme sortie pour les deux cas, on peut descendre à 51 octets:

lambda s:[s,s[::-(len(set(s))>2)]].index(sorted(s))
xnor
la source
Je suis presque sûr que vous pouvez prendre une liste de caractères car elle n'est pas spécifiée en tant que chaîne: meta.codegolf.stackexchange.com/a/2216/8478
Jonathan Allan
3

Python 3, 77 75 octets

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

Suppose que toutes les lettres sont du même cas.

Retour:

  • 0 sinon ondulé
  • 1 si en avant ondulé
  • 2 si ondulé en arrière

Suppression des espaces inutiles grâce à @ETHproductions

C. Smith
la source
2
Bienvenue chez PPCG, et belle première réponse! Cependant, vous devez également vous assurer qu'il y a au moins trois caractères distincts dans la chaîne; sinon, ce n'est pas un mot ondulé quoi qu'il arrive.
ETHproductions
Ah, c'est vrai. J'aurais dû regarder de plus près la définition d'un mot ondulé. Fixé.
C. Smith du
Agréable! Je ne suis pas un expert de Python, mais je pense que vous pouvez supprimer l'espace de chaque côté de la or.
ETHproductions
Oui, tu as raison. J'ai oublié de les supprimer après avoir entouré les expressions de parenthèses. Merci pour la capture!
C. Smith,
3

R, 96 95 octets

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)

Retour:

  • 1 pour onduler et soulever
  • 2 pour ondulé et décroissant
  • 3 pour non ondulé

Expliqué

  • d=diff(rle(utf8ToInt(x))$v): Génère une variable den convertissant d'abord la chaîne en ses ASCIIvaleurs en utilisant utf8ToIntce qui renvoie commodément un vecteur. Exécutez ensuite l'encodage de la longueur d'exécution à l'aide de rle.rle(...)$vrenvoie les valeurs non répétitives de la séquence (c'est-à-dire en réduisant toutes les exécutions). Prenez enfin la différence.
  • if(any(d>0)&any(d<0)|sum(1|d)<2)3: Si au moins une des différences est positive et au moins une négative, ou si la séquence de différence a moins de 2éléments (équivalent au mot d'origine ayant moins de 3 caractères), le mot est non ondulé et retourne3
  • else``if``(all(d<1),2,1): Sinon si toutes les différences sont négatives, retour 2pour ondulé et décroissant, sinon retour 1pour ondulé et élévation.

Essayez tous les cas de test chez R-fiddle (notez qu'il est nommé de manière à pouvoir être vectorisé pour les cas de test).

Billywob
la source
3

JavaScript (ES6), 84 81 octets

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

Suppose que l'entrée est tout dans le même cas. Renvoie 1pour augmenter ondulé, -1pour diminuer ondulé 0ou -0(les deux sont faux) pour non ondulé. Edit: sauvé 3 octets grâce à @RobertHickman.

Neil
la source
Je ne suis pas un expert des nouvelles fonctionnalités, mais pouvez-vous supprimer new?
Cyoce
@Cyoce De façon ennuyeuse, les nouvelles fonctionnalités vous obligent à utiliser new.
Neil
@Neil, je crois, vous pouvez enregistrer un octet en initialisant une autre variable à l'intérieur de la fonction Set () t=[...s]et en utilisant t au lieu de [... s] dans ces deux endroits que vous avez.
Robert Hickman
3

Javascript (ES6), 84 80 78 octets

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

Où l'augmentation ondulée est 0, la diminution est 1 et -1 n'est pas ondulé.

Grâce à @Neil de m'avoir aidé à économiser 2 octets.

Robert Hickman
la source
1
new Set(s=[...i])vous fait gagner 2 octets. (Il fonctionne en itérer i, en le transformant en un tableau, itérer le tableau, et en tournant que dans un ensemble Convoluted mais vous ne vous inquiétez pas de ce genre de chose quand vous êtes de golf..)
Neil
2

Python 2, 53 52 50 octets

Attend une entrée entre guillemets, par exemple "watch"

En tant que lambda sans nom:

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

Additionne le signe de différence entre chaque lettre et divise l'entier par len-1. Si tous étaient 1(augmentant), la somme est len-1affichée 1, similaire pour décroissante -1et pour mixte 1, -1la somme est inférieure à len-1ce qu'elle affiche 0.

-1 octet pour passer cmp,s[1:],s[:-1])àcmp,s[1:],s)+1

Karl Napf
la source
Reviendra 1pour"NO"
Jonathan Allan
@JonathanAllan LMNOPdonc O est après N ce qui signifie augmenter ce qui signifie 1
Karl Napf
Oui, mais tout mot de moins de 3 caractères (après avoir supprimé les lettres en double) a été défini comme non ondulé ("NON" est dans les cas de test non ondulés).
Jonathan Allan
@JonathanAllan a résolu le lenproblème, mais les caractères répétitifs sont toujours un problème
Karl Napf
2

Rubis, 54 octets

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

Retour 0 si le mot n'est pas ondulé, 1s'il est ondulé vers l'arrière et 2s'il est ondulé vers l'avant.

Lee W
la source
2

Groovy - 56 octets

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

Sorties [1,0]pour augmenter ondulé, [0,1]pour diminuer ondulé, [0,0]pour entrée de caractère unique ou [1,1]pour non ondulé.

REMARQUE: suppose que l'entrée est une chaîne ou un caractère [] et toutes les lettres sont du même cas.

GolfIsAGoodWalkSpoilt
la source
2

PHP, 96 octets

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 octets

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

0 non ondulé 1 augmentant -1 diminuant

Jörg Hülsermann
la source
-au lieu de 2*(-1 pour décroître: -1 octet). *(!!...)n'a pas besoin de parenthèses. (-2)
Titus
$s*$s>1au lieu de abs($s)>1(-2)
Titus
@Titus Done Merci
Jörg Hülsermann
2

PHP, 100 octets

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

Retour:

  • -1 pour ondulé, décroissant.
  • 0 pour pas ondulé.
  • 1 pour ondulé, soulevant.
chocochaos
la source
!!array_unique($s)[2]au lieu decount(array_unique($l))>2
Jörg Hülsermann
En fait, le problème avec cela est que array_unique prévaudra sur les clés. Ainsi, une entrée comme aaabc affichera faussement 0 lors de l'utilisation de array_unique.
chocochaos
1

C, 164 octets

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

Renvoie 0 si pas wawy, 1 si wawy et augmente, 2 si diminue.

Steadybox
la source
1

Raquette 321 octets

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

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

Essai:

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

Production:

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
la source
1

Java 7, 254 240 octets

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

Sort 0si la chaîne d'entrée n'est pas ondulée, 1si c'est une onde montante et 2si c'est une onde décroissante.

Code non testé et testé:

Essayez-le ici.

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

Production:

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
la source
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 octets)
Numberknot
Sortie 1 si augmentation ondulée, sortie -1 si diminution ondulée, 0 si non ondulée
Numberknot