Produire une liste de rotonymes 2

11

Rotonymes 2

Un "Rotonym" est un mot qui ROT13s dans un autre mot (dans la même langue).

Pour ce défi, nous utiliserons une autre définition: un "Rotonym" est un mot qui se déplace / tourne en circulaire dans un autre mot (dans la même langue).

Par exemple:

'stable' < 'tables' < 'ablest'
'abort' > 'tabor'
'tada' >> 'data'

Le défi

Écrivez un programme ou une fonction qui accepte une liste de dictionnaires / mots et imprime ou retourne une liste complète de rotonymes.

  1. L'ordre n'a pas d'importance.
  2. Les comparaisons doivent être insensibles à la casse, vous pouvez donc supposer que l'entrée sera transmise en tant que dictionnaire en minuscules uniquement.
  3. Le résultat doit être exprimé sous la forme de mots simples (pas de paires) et ne contenir aucun doublon, vous pouvez donc supposer que l'entrée n'a pas de doublons.
  4. C'est du .

Exemple

Donné

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Revenir

ablest
abort
stable
tables
tabor

Un vrai test

Donné

a aa aal aalii aam aani aardvark aardwolf aaron aaronic aaronical aaronite aaronitic aaru ab aba ababdeh ababua abac abaca abacate abacay abacinate abacination abaciscus abacist aback abactinal abactinally abaction abactor abaculus abacus abadite abaff abaft abaisance abaiser abaissed abalienate abalienation abalone abama abampere abandon abandonable abandoned abandonedly abandonee abandoner abandonment abanic abantes abaptiston abarambo abaris abarthrosis abarticular abarticulation abas abase abased abasedly abasedness abasement abaser abasgi abash abashed abashedly abashedness abashless abashlessly abashment abasia abasic abask abassin abastardize abatable abate abatement abater abatis abatised abaton abator abattoir abatua abature abave abaxial abaxile abaze abb abba abbacomes abbacy abbadide abbas abbasi abbassi abbasside abbatial abbatical abbess abbey abbeystede abbie abbot abbotcy abbotnullius abbotship abbreviate abbreviately abbreviation abbreviator abbreviatory abbreviature abby abcoulomb abdal abdat abderian abderite abdest abdicable abdicant abdicate abdication abdicative abdicator abdiel abditive abditory abdomen abdominal abdominales abdominalian abdominally abdominoanterior abdominocardiac abdominocentesis abdominocystic abdominogenital abdominohysterectomy abdominohysterotomy abdominoposterior abdominoscope abdominoscopy abdominothoracic abdominous abdominovaginal abdominovesical abduce abducens abducent abduct abduction abductor abe abeam abear abearance abecedarian abecedarium abecedary abed abeigh abel abele abelia abelian abelicea abelite abelmoschus abelmosk abelonian abeltree abencerrages abenteric abepithymia aberdeen aberdevine aberdonian aberia aberrance aberrancy aberrant aberrate aberration aberrational aberrator aberrometer aberroscope aberuncator abet abetment ablest abort abut ach ache acher achete achill achor acor acre acyl ad adad adat add addlings adet ala ama baa bafta balonea batea beta caba cha chilla cora crea da dad dada data each lacy orach rache saddling stable tables tabor tabu tade teache zoquean zoraptera zorgite zoril zorilla zorillinae zorillo zoroastrian zoroastrianism zoroastrism zorotypus zorrillo zorro zosma zoster zostera zosteraceae zosteriform zosteropinae zosterops zouave zounds zowie zoysia zubeneschamali zuccarino zucchetto zucchini zudda zugtierlast zugtierlaster zuisin zuleika zulhijjah zulinde zulkadah zulu zuludom zuluize zumatic zumbooruk zuni zunian zunyite zupanate zutugil zuurveldt zuza zwanziger zwieback zwinglian zwinglianism zwinglianist zwitter zwitterion zwitterionic zyga zygadenine zygadenus zygaena zygaenid zygaenidae zygal zygantra zygantrum zygapophyseal zygapophysis zygion zygite zygnema zygnemaceae zygnemales zygnemataceae zygnemataceous zygnematales zygobranch zygobranchia zygobranchiata zygobranchiate zygocactus zygodactyl zygodactylae zygodactyli zygodactylic zygodactylism zygodactylous zygodont zygolabialis zygoma zygomata zygomatic zygomaticoauricular zygomaticoauricularis zygomaticofacial zygomaticofrontal zygomaticomaxillary zygomaticoorbital zygomaticosphenoid zygomaticotemporal zygomaticum zygomaticus zygomaxillare zygomaxillary zygomorphic zygomorphism zygomorphous zygomycete zygomycetes zygomycetous zygon zygoneure zygophore zygophoric zygophyceae zygophyceous zygophyllaceae zygophyllaceous zygophyllum zygophyte zygopleural zygoptera zygopteraceae zygopteran zygopterid zygopterides zygopteris zygopteron zygopterous zygosaccharomyces zygose zygosis zygosperm zygosphenal zygosphene zygosphere zygosporange zygosporangium zygospore zygosporic zygosporophore zygostyle zygotactic zygotaxis zygote zygotene zygotic zygotoblast zygotoid zygotomere zygous zygozoospore zymase zyme zymic zymin zymite zymogen zymogene zymogenesis zymogenic zymogenous zymoid zymologic zymological zymologist zymology zymolyis zymolysis zymolytic zymome zymometer zymomin zymophore zymophoric zymophosphate zymophyte zymoplastic zymoscope zymosimeter zymosis zymosterol zymosthenic zymotechnic zymotechnical zymotechnics zymotechny zymotic zymotically zymotize zymotoxic zymurgy zyrenian zyrian zyryan zythem zythia zythum zyzomys zyzzogeton

Revenir

aal aam aba abac abaft abalone abate abet ablest abort abut ach ache acher achete achill achor acor acre acyl ad adad adat add addlings adet ala ama baa bafta balonea batea beta caba cha chilla cora crea da dad dada data each lacy orach rache saddling stable tables tabor tabu tade teache
Parapluie
la source
pouvons-nous supposer que les mots saisis sont uniques?
ngn
Oui, je pense que j'ai pré-exécuté mon entrée via un filtre unique lorsque j'ai exécuté le dictionnaire système.
Parapluie
J'ai remarqué que certaines réponses fonctionnaient pour l'exemple, mais pas pour un dictionnaire complet. J'ai ajouté un ensemble de tests plus grand qui est un sous-ensemble du dictionnaire suffisamment grand pour contenir des mots qui échouent pour certaines réponses qui réussissent l'exemple trivial.
Parapluie
@Umbrella, vous devez commenter toutes les réponses non valides pour alerter l'utilisateur, afin qu'il puisse corriger / supprimer sa réponse
H.PWiz
abdominovaginal, vous avez des mots étranges là-bas.
Urne Magic Octopus

Réponses:

5

Gelée , 8 octets

ṙ1$ƬfḊɗƇ

Essayez-le en ligne!

Version alternative, 7 octets

ṙƬ1fḊʋƇ

Dyadic Ƭfaisait quelque chose de bizarre, donc cela n'a pas fonctionné lorsque le défi a été publié.

Essayez-le en ligne!

Comment ça fonctionne

ṙƬ1fḊʋƇ  Main link. Argument: A (array of strings)

     ʋ   Vier; combine the 4 preceding links into a dyadic chain.
      Ƈ  Comb; for each string s in A, call the chain with left argument s and
         right argument A. Keep s iff the chain returned a truthy value.
 Ƭ           'Til; keep calling the link to the left, until the results are no
             longer unique. Return the array of unique results.
ṙ 1          Rotate the previous result (initially s) one unit to the left.
   f         Filter; keep only rotations that belong to A.
             s is a rotonym iff there are at least two rotations of s in A.
    Ḋ        Deque; remove the first string (s) of the result.
             The resulting array is non-empty / truthy iff s is a rotonym.
Dennis
la source
Oh de nouveaux personnages rapides? Hm dois apprendre quand les utiliser maintenant ... (mêmes choses mais 1 octet maintenant pour que je puisse les utiliser plus qu'avant quand ils étaient 2 octets)
HyperNeutrino
C'est équivalent à ṙ1$ÐĿfḊɗÐf.
Dennis
4

APL (Dyalog) , 20 octets

A besoin ⎕io←0

⊂∩¨(,/(1↓∘∪⍳∘≢⌽¨⊂)¨)

Essayez-le en ligne!

(1↓∘∪⍳∘≢⌽¨⊂)¨ obtient les rotations uniques (à l'exclusion de la chaîne elle-même) de chaque chaîne du dictionnaire

prend la longueur d'un vecteur

⍳∘≢ crée la plage de 0 à la longueur

fait tourner un vecteur un certain nombre de fois, par exemple 2⌽'abort '->' ortab '

⍳∘≢⌽¨⊂ donnera alors toutes les rotations d'un vecteur

supprime les doublons

1↓ supprime le premier élément (la chaîne d'origine)

,/ aplatit toutes les rotations en une seule liste

⊂∩¨ prend l'intersection du dictionnaire avec les rotations

H.PWiz
la source
votre résultat est inclus, mais je suppose que ça devrait aller, et @ Adám peut voler votre ⊂∩¨astuce (ou vice versa) pour un autre -1
ngn
4

APL (Dyalog Unicode) , 25 23 22 17 16 octets SBCS

Emprunte des idées de la solution ngn / k de ngn . Et puis -6 grâce à lui. Aussi -1 en revenant une liste jointe comme H.PWiz .

Fonction de préfixe tacite anonyme.

⊂∩¨1,.↓(∪≢,/,⍨)¨

Essayez-le en ligne!

(  Appliquer la fonction tacite suivante à chaque mot:

,⍨ concaténer le mot à lui-même

≢,/ toutes les sous-chaînes de longueur de mot (c'est-à-dire toutes les rotations)

 éléments uniques de ces rotations (pour éviter que des mots comme tatapour apparaître deux fois)

1,.↓ la concaténation des drop-first (les mots originaux) de chaque liste

⊂∩¨ intersection du contenu de cela et de la liste de mots originale entière


Ancienne solution

-2 grâce à ngn.

Préfixe anonyme lambda.

{⍵/⍨2≤+/⍵∊⍨↑(∪≢,/,⍨)¨⍵}

Essayez-le en ligne!

{} Fonction où se trouve la liste de mots:

(  Appliquer la fonction tacite suivante à chaque mot:

  ,⍨ concaténer le mot à lui-même

  ≢,/ toutes les sous-chaînes de longueur de mot (c'est-à-dire toutes les rotations)

   éléments uniques de ces rotations (pour éviter que des mots comme tatapour apparaître deux fois)

 mélanger la liste des listes dans une seule matrice (pads avec des chaînes de tout l'espace)

⍵∊⍨ indiquer quels éléments de la matrice sont membres de la liste d'origine

+/ additionner les lignes (compte les occurrences de chacun des mots originaux)

2≤ indiquer ceux qui ont des doublons (c.-à-d. se produire autrement que lorsqu'ils sont retournés à l'original)

⍵/⍨ utiliser cela pour filtrer la liste d'origine

Adam
la source
{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); votre utilisation est intelligente
ngn
@ngn Merci. J'ai appris l'astuce de Morten.
Adám
ces trains me font mal au cerveau ... c'est plus simple en tant que dfn:{⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
ngn
@ngn C'est ce que j'ai bien transformé en train et sans l'astuce pour les rotations
H.PWiz
1
désolé, un dernier changement d'avis:⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
ngn
4

Brachylog , 26 octets

g;?z{tWl⟧₆∋I;W↺₍R;W≠&h∋R}ˢ

Essayez-le en ligne!

g;?z                          % Zip the whole input with each word in it respectively
    {                   }ˢ    % Apply this predicate to each pair in the zip
                              %   and select the successful values
     tW                       % Let the current word be W
       l⟧₆∋I                  % There exists a number I from 1 to length(W)-1
            ;W↺₍R             % And R is the result of circularly shifting the 
                              %   current word I times 
                 ;W≠          % And R is not the current word itself (needed for words like "tata")
                    &h∋R      % And R is one of the input dictionary words
                              % (R is implicitly the output of the predicate, and 
                              %  successful R values are collected and output by the ˢ)
Sundar - Rétablir Monica
la source
3

Python 2 , 73 69 67 octets

lambda d:[w for w in d if{w[i:]+w[:i]for i in range(len(w))}-{w}&d]

Essayez-le en ligne!

Prend un ensemble de mots (en minuscules) et renvoie une liste de rotonymes.


Enregistré

  • -2 octets, grâce aux ovs
TFeld
la source
67 octets
ovs
3

K (ngn / k) , 23 octets

{x^x^,/1_'(,/|0 1_)\'x}

Essayez-le en ligne!

{ } est une fonction avec argument x

0 1_coupe une chaîne aux indices 0 et 1, par exemple "abcd"->(,"a";"bcd")

| inverse les deux tranches: ("bcd";,"a")

,/ les rejoint: "bcda"

(,/|0 1_)\ renvoie toutes les rotations d'une chaîne

(,/|0 1_)\'x sont les rotations de chaque chaîne x

1_' supprime la première "rotation" de chacun, c'est-à-dire chaque rotation d'identité triviale

,/ joindre

x^yest la liste xsans éléments de la listey

x^x^yest l'intersection de xety

ngn
la source
Intelligent. J'ai pu utiliser la partie intersection pour enregistrer un autre octet.
Adám
2

05AB1E , 14 octets

εDvDÀ})ÙåO<Ā}Ï

Essayez-le en ligne!

Explication

ε           }    # apply to each word in the input
 Dv  }           # for each letter in the word
   DÀ            # copy the previous word and rotate it left
      )Ù         # wrap the rotations in a list and remove duplicates
        å        # check each rotation for presence in the input
         O       # sum presences
          <Ā     # decrement the sum and truthify it (check if 1 or greater)
             Ï   # filter, keep words in input that are true in the resulting list
Emigna
la source
2

PynTree , 44 octets

§y:f#x0€[x/|Ḟz&⁻xzėzḞw+#x`wLx#x`0wRLxy]y#\x1

Essayez-le en ligne!

Cela s'est révélé révéler une faille majeure dans la façon dont PynTree construit des compréhensions de liste car il utilise des fonctions pour affecter des variables afin que l'affectation puisse aller dans des expressions, mais les conditions finissent par ne pas avoir la valeur de la variable jusqu'à ce qu'elle soit évaluée et le bloc principal a été évalué. Cela semble être facilement réparable, mais je ne l'ai pas remarqué plus tôt et cette réponse est donc affreusement longue.

En fait, même si je corrige cela, je pense que cela pourrait être terriblement long.

HyperNeutrino
la source
2

Perl 6 , 65 octets

{@^a.grep:{@aany(($/=[.comb]).rotate,*.rotate...^*eq$/).join}}

Essayez-le

Étendu:

{  # bare block lambda with placeholder parameter @a

  @^a     # declare and use placeholder parameter
  .grep:  # find the values that match
  {

    @a
                # Set contains operator

    any(         # create a junction of the following

      # generate a sequence
      (
        $/ =     # store into $/ (no declaration needed for this variable)
        [        # turn into an array instead of a one-time sequence
          .comb  # the input split into characters
        ]
      ).rotate,  # start the sequence on the first rotation

      *.rotate   # use this to generate the rest of the values in the sequence

      ...^       # keep generating values until: (and throw out last value)

      * eq $/    # one of them matches the cached array of the input

    ).join       # for each array in the junction join the strings (no spaces)
  }
}
Brad Gilbert b2gills
la source
2

JavaScript (Node.js), 105 99 octets

f=l=>l.filter(w=>[...Array(k=w.length)].map((x,i)=>(w+w).substr(i,k)).some(r=>l.includes(r)&&r!=w))

Non golfé:

f = list =>
  list.filter( word =>
    // create a list of all rotonyms for the current word
    [ ...Array( len = word.length ) ]
      .map( (x,i) => 
         ( word+word ).substr(i, len)
      )
    // check if any of the rotonyms is in the initial dictionary/wordlist
     .some( rotonym =>
        list.includes( rotonym )
    // and is not the word itself
        && rotonym != word
     )

Essayez-le en ligne!

bubens
la source
Bienvenue chez PPCG! Je ne connais pas le JavaScript, mais assurez-vous de consulter le fil des conseils JavaScript pour voir s'il y a quelque chose qui s'applique ici.
AdmBorkBork
Merci pour l'astuce. J'ai lu les réponses à la fois pour JS et ES6 mais il semble que j'ai déjà appliqué tous les conseils pertinents pour cela. Au moins celles qui étaient évidentes pour moi.
bubens
1

Rétine 0,8,2 , 71 62 octets

^(\w)(\w*)
$2$1!¶$&
%+)s`^(.+)(!.*¶\1)$
$2
O`
!`\b(.+)(?=¶\1!)

Essayez-le en ligne! Explication:

%+)

Répétez l'opération pour chaque mot.

^(\w)(\w*)
$2$1!¶$&

Ajoutez à la rotation suivante du mot une fin !.

s`^(.+)(!.*¶\1)$
$2

Mais si c'est le mot d'origine, supprimez-le à nouveau.

O`

Triez les mots.

!`\b(.+)(?=¶\1!)

Trouvez les doublons.

Neil
la source
1

Python 2 , 66 55 70 octets

lambda d:{w for w in d for v in d if v not in w not in v in w*2in v*3}

Essayez-le en ligne!

11 octets thx à Dennis pour utiliser enchaînéx in y in z approche .

Prend un ensemble de mots d; renvoie un ensemble de Rotonymes.

Chas Brown
la source
Le chèque est trop faible; {ab, abab} le passerait.
xnor
@xnor: Dang ces conditions de bord! Une solution rapide ...
Chas Brown
0

Japt , 17 octets

Extrêmement lent, mais fonctionne. TIO arrive à expiration, mais j'ai confirmé qu'il fonctionne en réduisant manuellement le nombre d'itérations dans la source de la langue.

f@_XéZ ÀX©UøXéZ}a
f@                // Filter the input array by
  _            }a // generating up to 1e8 rotations of each string
   XéZ ÀX         // and checking if the rotation is different than the original,
         ©UøXéZ   // yet still exists in the input array.

Essayez-le en ligne!

Lente
la source
Pourquoi tant d'itérations? J'ai d'abord fait des itérations pour la longueur de la chaîne, mais grâce aux tests, j'ai réalisé que dix rotations à gauche par mot étaient suffisantes pour trouver tous les cas dans le fichier dict MacOS.
Umbrella
@Umbrella Parce que c'est court à écrire. La question est le code golf, pas le code le plus rapide.
Nit
Je vois. Je ne suis pas familier avec Japt, il n'était donc pas évident pour moi qu'itérer moins prendrait plus de personnages.
Umbrella
0

Javascript, 129 caractères

f=a=>{n={};r=w=>w.slice(1,w.length)+w[0];a.map(w=>{m=r(w);while(m!=w){if(-~a.indexOf(m))n[m]=1;m=r(m);}});return Object.keys(n);}

Non golfé

f=a=>{
    n={};
    r=w=>w.slice(1,w.length)+w[0];
    a.map(w=>{
        m=r(w);
        while(m!=w){
            if(-~a.indexOf(m))n[m]=1;
            m=r(m);
        }
    });
    return Object.keys(n);
}

Essayez-le en ligne!

Endormi
la source
0

Java (JDK 10) , 144 octets

l->{for(var s:l){var r=s;for(int i=s.length();i-->1;){r=r.substring(1)+r.charAt(0);if(!r.equals(s)&l.contains(r)){System.out.println(s);i=0;}}}}

Essayez-le en ligne!

Olivier Grégoire
la source
0

JavaScript (Node.js) , 66 octets

s=>s.filter(t=>s.some(u=>(t+t).match(u)&&t!=u&t.length==u.length))

Essayez-le en ligne!

réponse ennuyeuse

l4m2
la source
Cela ne fonctionne pas correctement. Testez-le par rapport à l'ensemble de test plus grand que j'ai ajouté.
Umbrella