Producir una lista de rotónimos 2

11

Rotónimos 2

Un "Rotónimo" es una palabra que ROT13 se convierte en otra palabra (en el mismo idioma).

Para este desafío, usaremos una definición alternativa: un "Rotónimo" es una palabra que circular cambia / rota a otra palabra (en el mismo idioma).

Por ejemplo:

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

El reto

Escriba un programa o función que acepte una lista de diccionario / palabras e imprima o devuelva una lista completa de rotónimos.

  1. El orden no importa.
  2. Las comparaciones deben ser insensibles a mayúsculas y minúsculas, por lo que puede suponer que la entrada se pasará como un diccionario de minúsculas.
  3. El resultado debe expresarse como palabras individuales (no los pares) y no contener duplicados, por lo que puede suponer que la entrada no tiene duplicados.
  4. Este es el .

Ejemplo

Dado

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Regreso

ablest
abort
stable
tables
tabor

Una prueba real

Dado

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

Regreso

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
Paraguas
fuente
¿podemos suponer que las palabras de entrada son únicas?
ngn
Sí, creo que ejecuté previamente mi entrada a través de un filtro único cuando ejecuté el diccionario del sistema.
Paraguas
Noté que algunas respuestas funcionaron para el ejemplo, pero no para un diccionario completo. Agregué un conjunto de prueba más grande que es un subconjunto del diccionario lo suficientemente grande como para contener palabras que fallan para algunas respuestas que pasan el ejemplo trivial.
Paraguas
@Umbrella, debe comentar cualquier respuesta no válida para alertar al usuario, de modo que pueda corregir / eliminar su respuesta
H.PWiz
abdominovaginal, tienes algunas palabras extrañas allí.
Urna de pulpo mágico

Respuestas:

5

Jalea , 8 bytes

ṙ1$ƬfḊɗƇ

Pruébalo en línea!

Versión alternativa, 7 bytes.

ṙƬ1fḊʋƇ

Dyadic Ƭsolía hacer algo extraño, por lo que esto no funcionó cuando se publicó el desafío.

Pruébalo en línea!

Cómo funciona

ṙƬ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
fuente
Oh nuevos personajes rápidos? Tengo que aprender cuándo usarlos ahora ... (las mismas cosas pero 1 byters ahora para poder usarlas más que cuando eran 2 byters)
HyperNeutrino
Es equivalente a ṙ1$ÐĿfḊɗÐf.
Dennis
4

APL (Dyalog) , 20 bytes

Requiere ⎕io←0

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

Pruébalo en línea!

(1↓∘∪⍳∘≢⌽¨⊂)¨ obtiene las rotaciones únicas (excluyendo la cadena en sí) de cada cadena en el diccionario

toma la longitud de un vector

⍳∘≢ crea el rango desde 0 hasta la longitud

rota un vector varias veces, por ejemplo, 2⌽'abortar '->' ortab '

⍳∘≢⌽¨⊂ entonces dará todas las rotaciones de un vector

elimina los duplicados

1↓ elimina el primer elemento (la cadena original)

,/ aplana todas las rotaciones en una lista

⊂∩¨ toma la intersección del diccionario con las rotaciones

H.PWiz
fuente
el resultado sale encerrado, pero supongo que debería estar bien, y @ ADAM puede robar su ⊂∩¨truco (o viceversa) para una mayor -1
NGN
4

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

Toma prestado ideas de la solución ngn / k de ngn . Y luego -6 gracias a él. También -1 al devolver una lista adjunta como H.PWiz .

Función de prefijo tácito anónimo.

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

Pruébalo en línea!

(...  aplique la siguiente función tácita a cada palabra:

,⍨ concatenar la palabra a sí misma

≢,/ todas las subcadenas de longitud de palabra (es decir, todas las rotaciones)

 elementos únicos de esas rotaciones (para evitar palabras como tataaparecer dos veces)

1,.↓ la concatenación de las primeras letras (las palabras originales) de cada lista

⊂∩¨ intersección del contenido de eso y la lista de palabras original completa


Vieja solución

-2 gracias a ngn.

Prefijo anónimo lambda.

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

Pruébalo en línea!

{... } función donde está la lista de palabras:

(...  aplique la siguiente función tácita a cada palabra:

  ,⍨ concatenar la palabra a sí misma

  ≢,/ todas las subcadenas de longitud de palabra (es decir, todas las rotaciones)

   elementos únicos de esas rotaciones (para evitar palabras como tataaparecer dos veces)

 mezclar la lista de listas en una única matriz (almohadillas con cadenas de todo el espacio)

⍵∊⍨ indicar qué elementos de la matriz son miembros de la lista original

+/ suma las filas (cuenta las ocurrencias de cada una de las palabras originales)

2≤ Indique cuáles tienen duplicados (es decir, ocurren de forma distinta a cuando se vuelven a girar al original)

⍵/⍨ use eso para filtrar la lista original

Adán
fuente
{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); su uso de es inteligente
ngn
@ngn Gracias. Aprendí el truco de Morten.
Adám
esos trenes me duelen el cerebro ... es más simple como un dfn:{⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
ngn
@ngn Eso es lo que tengo, aunque lo hice en un tren y sin el truco para las rotaciones
H.PWiz
1
Lo sentimos, una última cambio de mente:⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
NGN
4

Brachylog , 26 bytes

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

Pruébalo en línea!

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 - Restablecer a Monica
fuente
3

Python 2 , 73 69 67 bytes

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

Pruébalo en línea!

Toma un conjunto de palabras (minúsculas) y devuelve una lista de rotónimos.


Salvado

  • -2 bytes, gracias a los ovs
TFeld
fuente
67 bytes
ovs
3

K (ngn / k) , 23 bytes

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

Pruébalo en línea!

{ } es una función con argumento x

0 1_corta una cadena en los índices 0 y 1, por ejemplo, "abcd"->(,"a";"bcd")

| invierte las dos rebanadas: ("bcd";,"a")

,/ se une a ellos: "bcda"

(,/|0 1_)\ devuelve todas las rotaciones de una cadena

(,/|0 1_)\'x son las rotaciones de cada cadena en x

1_' elimina la primera "rotación" de cada uno, es decir, cada rotación de identidad trivial

,/ unirse

x^yes la lista xsin elementos de la listay

x^x^yes la intersección de xyy

ngn
fuente
Inteligente. Pude usar la parte de intersección para guardar otro byte.
Adám
2

05AB1E , 14 bytes

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

Pruébalo en línea!

Explicación

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

PynTree , 44 bytes

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

Pruébalo en línea!

Esto resultó revelar una falla importante en la forma en que PynTree construye las comprensiones de listas porque usa funciones para asignar variables para que la asignación pueda ir en expresiones, pero luego las condiciones terminan sin tener el valor de la variable hasta después de que ha sido evaluada y El bloque principal ha sido evaluado. Esto parece ser fácilmente reparable, pero no lo noté antes, por lo que esta respuesta es horriblemente larga.

En realidad, incluso si soluciono eso, creo que aún podría ser terriblemente largo.

Hiperneutrino
fuente
2

Perl 6 , 65 bytes

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

Intentalo

Expandido:

{  # 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
fuente
2

JavaScript (Node.js), 105 99 bytes

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

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

Pruébalo en línea!

Bubens
fuente
Bienvenido a PPCG! No estoy versado en JavaScript, pero asegúrese de revisar el hilo de Consejos de JavaScript para ver si hay algo que aplique aquí.
AdmBorkBork 01 de
Gracias por la pista. Leí las respuestas tanto para JS como para ES6, pero parece que ya apliqué todos los consejos relevantes para esto. Al menos los que eran obvios para mí.
bubens
1

Retina 0.8.2 , 71 62 bytes

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

Pruébalo en línea! Explicación:

%+)

Repita para cada palabra.

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

Anteponga la siguiente rotación de la palabra con un final !.

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

Pero si esa es la palabra original, bórrala nuevamente.

O`

Ordena las palabras.

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

Encuentra los duplicados.

Neil
fuente
1

Python 2 , 66 55 70 bytes

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

Pruébalo en línea!

11 bytes gracias a Dennis para usar el x in y in zenfoque encadenado .

Toma un conjunto de palabras d; devuelve un conjunto de rotónimos.

Chas Brown
fuente
El cheque es demasiado débil; {ab, abab} lo pasaría.
xnor
@xnor: ¡Maldita sea esas condiciones de borde! Una solución rápida ...
Chas Brown
0

Japt , 17 bytes

Extremadamente lento, pero funciona. TIO agota el tiempo de espera, pero he confirmado que funciona reduciendo manualmente el número de iteraciones en la fuente del idioma.

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.

Pruébalo en línea!

Liendre
fuente
¿Por qué tantas iteraciones? Inicialmente hice iteraciones para la longitud de la cadena, pero a través de las pruebas me di cuenta de que diez rotaciones izquierdas por palabra eran suficientes para encontrar todos los casos en el archivo dict de MacOS.
Paraguas
@Umbrella Porque es corto para escribir. La pregunta es el código de golf, no el código más rápido.
Nit
Veo. No estoy familiarizado con Japt, por lo que no era evidente para mí que iterar menos requeriría más personajes.
Paraguas
0

Javascript, 129 caracteres

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

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

Pruébalo en línea!

Asleepace
fuente
0

Java (JDK 10) , 144 bytes

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

Pruébalo en línea!

Olivier Grégoire
fuente
0

JavaScript (Node.js) , 66 bytes

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

Pruébalo en línea!

respuesta aburrida

l4m2
fuente
Esto no funciona correctamente. Pruébelo contra el conjunto de prueba más grande que agregué.
Paraguas