Produrre un elenco di rotonimi 2


11

Rotonimi 2

Un "Rotonimo" è una parola che ROT13 inserisce in un'altra parola (nella stessa lingua).

Per questa sfida, useremo una definizione alternativa: un "Rotonimo" è una parola che circolare / ruota in un'altra parola (nella stessa lingua).

Per esempio:

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

La sfida

Scrivi un programma o una funzione che accetta un dizionario / elenco di parole e stampa o restituisce un elenco completo di rotonimi.

  1. L'ordine non ha importanza.
  2. I confronti dovrebbero essere senza distinzione tra maiuscole e minuscole, quindi si può presumere che l'input verrà passato come un dizionario solo in minuscolo.
  3. Il risultato dovrebbe essere espresso come parole singole (non le coppie) e non contenere duplicati, quindi si può presumere che l'input non abbia duplicati.
  4. Questo è .

Esempio

Dato

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Ritorno

ablest
abort
stable
tables
tabor

Un vero test

Dato

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

Ritorno

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

possiamo supporre che le parole di input siano uniche?
ngn,

Sì, penso di aver pre-eseguito il mio input attraverso un filtro univoco quando ho eseguito il dizionario di sistema.
Ombrello

Ho notato che alcune risposte hanno funzionato per l'esempio, ma non per un dizionario completo. Ho aggiunto un set di test più grande che è un sottoinsieme del dizionario abbastanza grande da contenere parole che falliscono per alcune risposte che passano l'esempio banale.
Ombrello

@Umbrella dovresti commentare eventuali risposte non valide per avvisare l'utente, in modo che possano correggere / eliminare la loro risposta
H.PWiz,

abdominovaginal, hai qualche strana parola lì.
Magic Octopus Urn

Risposte:


5

Gelatina , 8 byte

ṙ1$ƬfḊɗƇ

Provalo online!

Versione alternativa, 7 byte

ṙƬ1fḊʋƇ

Dyadic era Ƭsolito fare qualcosa di strano, quindi non ha funzionato quando è stata pubblicata la sfida.

Provalo online!

Come funziona

ṙƬ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.

Oh nuovi personaggi veloci? Devo imparare quando usarli adesso ... (stesse cose, ma 1 byte adesso, così posso usarli più di quando erano 2 byte)
HyperNeutrino,

È equivalente a ṙ1$ÐĿfḊɗÐf.
Dennis,

4

APL (Dyalog) , 20 byte

Richiede ⎕io←0

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

Provalo online!

(1↓∘∪⍳∘≢⌽¨⊂)¨ ottiene le rotazioni univoche (esclusa la stringa stessa) di ogni stringa nel dizionario

prende la lunghezza di un vettore

⍳∘≢ crea l'intervallo da 0 fino alla lunghezza

ruota un vettore un numero di volte, ad es. 2ab'abort '->' ortab '

⍳∘≢⌽¨⊂ fornirà quindi tutte le rotazioni di un vettore

rimuove i duplicati

1↓ rimuove il primo elemento (la stringa originale)

,/ appiattisce tutte le rotazioni in un elenco

⊂∩¨ prende l'intersezione del dizionario con le rotazioni


il tuo risultato viene allegato, ma immagino che dovrebbe essere a posto, e @Adám può rubare il tuo ⊂∩¨trucco (o viceversa) per un ulteriore -1
1818

4

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

Prende in prestito idee dalla soluzione ngn / k di ngn . E poi -6 grazie a lui. Inoltre -1 restituendo un elenco allegato come H.PWiz .

Funzione prefisso tacito anonimo.

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

Provalo online!

(...  applica la seguente funzione tacita a ogni parola:

,⍨ concatenare la parola a se stessa

≢,/ tutte le sottostringhe di lunghezza di parola (cioè tutte le rotazioni)

 elementi unici di quelle rotazioni (per impedire parole come tataper apparire due volte)

1,.↓ la concatenazione dei primi (le parole originali) di ciascun elenco

⊂∩¨ intersezione del contenuto di quello e dell'intero elenco di parole originale


Vecchia soluzione

-2 grazie a ngn.

Prefisso anonimo lambda.

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

Provalo online!

{... } funzione dove si trova l'elenco delle parole:

(...  applica la seguente funzione tacita a ogni parola:

  ,⍨ concatenare la parola a se stessa

  ≢,/ tutte le sottostringhe di lunghezza di parola (cioè tutte le rotazioni)

   elementi unici di quelle rotazioni (per impedire parole come tataper apparire due volte)

 mescola l'elenco di liste in una singola matrice (pad con stringhe all-space)

⍵∊⍨ indica quali elementi della matrice sono membri dell'elenco originale

+/ somma le righe (conta le occorrenze di ciascuna delle parole originali)

2≤ indica quali sono i duplicati (ovvero si verificano diversi da quando ruotati indietro all'originale)

⍵/⍨ usalo per filtrare la lista originale


{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); il tuo uso di è intelligente
ngn

@ngn Grazie. Ho imparato il trucco da Morten.
Adám,

quei treni mi fanno male al cervello ... è più semplice come un dfn:{⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
ngn

@ngn Questo è quello che ho fatto anche se trasformato in un treno e senza il trucco per le rotazioni
H.Pwiz,

1
scusate, un ultimo ⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
ripensamento

4

Brachylog , 26 byte

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

Provalo online!

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

3

Python 2 , 73 69 67 byte

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

Provalo online!

Accetta una serie di parole (minuscole) e restituisce un elenco di rotonimi.


Salvato

  • -2 byte, grazie agli ovs


3

K (ngn / k) , 23 byte

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

Provalo online!

{ } è una funzione con argomento x

0 1_taglia una stringa negli indici 0 e 1, ad es. "abcd"->(,"a";"bcd")

| inverte le due sezioni: ("bcd";,"a")

,/ si unisce a loro: "bcda"

(,/|0 1_)\ restituisce tutte le rotazioni di una stringa

(,/|0 1_)\'x sono le rotazioni di ogni stringa in x

1_' lascia cadere la prima "rotazione" di ciascuna, ovvero ogni banale rotazione dell'identità

,/ aderire

x^yè l'elenco xsenza elementi dell'elencoy

x^x^yè l'intersezione di xey


Intelligente. Sono stato in grado di utilizzare la parte di intersezione per salvare un altro byte.
Adám,

2

05AB1E , 14 byte

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

Provalo online!

Spiegazione

ε           }    # 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

2

PynTree , 44 byte

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

Provalo online!

Questo si è rivelato per rivelare un grave difetto nel modo in cui PynTree costruisce le comprensioni degli elenchi perché utilizza funzioni per assegnare variabili in modo che l'assegnazione possa andare nelle espressioni, ma poi le condizioni finiscono per non avere il valore della variabile fino a quando non è stata valutata e il blocco principale è stato valutato. Questo sembra essere facilmente risolvibile, ma non me ne sono accorto prima e quindi questa risposta è orribilmente lunga.

In realtà, anche se avessi risolto il problema, penso che potrebbe essere terribilmente lungo.


2

Perl 6 , 65 byte

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

Provalo

Allargato:

{  # 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)
  }
}

2

JavaScript (Node.js), 105 99 byte

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

Ungolfed:

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
     )

Provalo online!


Benvenuti in PPCG! Non sono esperto di JavaScript, ma assicurati di controllare il thread Suggerimenti JavaScript per vedere se c'è qualcosa che si applica qui.
AdmBorkBork,

Grazie per il suggerimento. Ho letto le risposte sia per JS che per ES6 ma sembra che abbia già applicato tutti i suggerimenti pertinenti per questo. Almeno quelli che erano ovvi per me.
bubens,

1

Retina 0.8.2 , 71 62 byte

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

Provalo online! Spiegazione:

%+)

Ripeti per ogni parola.

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

Prepara la prossima rotazione della parola con un trascinamento !.

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

Ma se questa è la parola originale, eliminala di nuovo.

O`

Ordina le parole.

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

Trova i duplicati.


1

Python 2 , 66 55 70 byte

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

Provalo online!

11 byte grazie a Dennis per l'uso incatenatox in y in z approccio .

Richiede una serie di parole d; restituisce un set di Rotonimi.


Il controllo è troppo debole; {ab, abab} lo avrebbe superato.
xnor

@xnor: ho messo in pericolo quelle condizioni limite! Una soluzione rapida ...
Chas Brown,


0

Japt , 17 byte

Estremamente lento, ma funziona. TIO va in timeout, ma ho confermato che funziona abbassando manualmente il numero di iterazioni nella fonte della lingua.

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.

Provalo online!


Perché così tante iterazioni? Inizialmente ho fatto iterazioni per la lunghezza della stringa, ma attraverso i test ho realizzato che dieci rotazioni a sinistra per parola erano sufficienti per trovare tutti i casi nel file dict di MacOS.
Ombrello

@Umbrella Perché è breve da scrivere. La domanda è il codice golf, non il codice più veloce.
Nit

Vedo. Non ho familiarità con Japt, quindi non mi era chiaro che iterare meno avrebbe richiesto più personaggi.
Ombrello

0

Javascript, 129 caratteri

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

Ungolfed

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

Provalo online!



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.