Produzir uma lista de rotônimos 2


11

Rotônimos 2

Um "Rotonym" é uma palavra que ROT13s em outra palavra (no mesmo idioma).

Para esse desafio, usaremos uma definição alternativa: um "Rotônimo" é uma palavra que muda / gira circularmente para outra palavra (no mesmo idioma).

Por exemplo:

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

O desafio

Escreva um programa ou função que aceite uma lista de dicionário / palavra e imprima ou retorne uma lista completa de rotônimos.

  1. A ordem não importa.
  2. As comparações não diferenciam maiúsculas de minúsculas, portanto, você pode assumir que a entrada será passada como um dicionário somente em minúsculas.
  3. O resultado deve ser expresso como palavras únicas (não os pares) e não deve conter duplicatas, portanto, você pode assumir que a entrada não possui duplicatas.
  4. Isso é .

Exemplo

Dado

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Retorna

ablest
abort
stable
tables
tabor

Um teste 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

Retorna

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

podemos assumir que as palavras de entrada são únicas?
NGN

Sim, acho que pré-executei minha entrada através de um filtro exclusivo ao executar o dicionário do sistema.
Umbrella

Notei que algumas respostas funcionaram para o exemplo, mas não para um dicionário completo. Adicionei um conjunto de testes maior que é um subconjunto do dicionário grande o suficiente para conter palavras que falham em algumas respostas que passam no exemplo trivial.
Umbrella

@Umbrella você deve comentar sobre quaisquer respostas inválidas para alertar o usuário, de modo que eles podem corrigir / apagar a sua resposta
H.PWiz

abdominovaginal, você tem algumas palavras estranhas lá.
Magic Octopus Urn

Respostas:


5

Geléia , 8 bytes

ṙ1$ƬfḊɗƇ

Experimente online!

Versão alternativa, 7 bytes

ṙƬ1fḊʋƇ

Dyadic Ƭcostumava fazer algo estranho, então isso não funcionou quando o desafio foi lançado.

Experimente online!

Como 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.

Oh novos personagens rápidos? Hm tem que aprender quando usar os agora ... (mesmas coisas mas 1-byters agora para que eu possa usá-los mais do que quando eles foram 2-byters)
HyperNeutrino

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

4

APL (Dyalog) , 20 bytes

Requer ⎕io←0

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

Experimente online!

(1↓∘∪⍳∘≢⌽¨⊂)¨ obtém as rotações exclusivas (excluindo a própria string) de cada string no dicionário

leva o comprimento de um vetor

⍳∘≢ cria o intervalo de 0 até o comprimento

gira um vetor várias vezes, por exemplo, 2⌽'abort '->' ortab '

⍳∘≢⌽¨⊂ dará então todas as rotações de um vetor

remove as duplicatas

1↓ remove o primeiro elemento (a sequência original)

,/ nivela todas as rotações em uma lista

⊂∩¨ faz a interseção do dicionário com as rotações


o resultado sai fechado, mas eu acho que deve ser aprovado, e @ Adam pode roubar o seu ⊂∩¨truque (ou vice-versa) por mais um -1
NGN

4

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

Solicita idéias da solução ngn / k da ngn . E então -6 graças a ele. Também -1, retornando uma lista fechada, como H.PWiz .

Função de prefixo tácito anônimo.

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

Experimente online!

( Aplique a seguinte função tácita a cada palavra:

,⍨ concatenar a palavra para si mesma

≢,/ todas as sub-strings de comprimento de palavra (ou seja, todas as rotações)

 elementos únicos dessas rotações (para impedir que palavras como tataapareçam duas vezes)

1,.↓ a concatenação dos primeiros drop (as palavras originais) de cada lista

⊂∩¨ interseção do conteúdo disso e de toda a lista de palavras originais


Solução antiga

-2 graças a ngn.

Prefixo anônimo lambda.

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

Experimente online!

{} Function onde está a lista de palavras:

( Aplique a seguinte função tácita a cada palavra:

  ,⍨ concatenar a palavra para si mesma

  ≢,/ todas as sub-strings de comprimento de palavra (ou seja, todas as rotações)

   elementos únicos dessas rotações (para impedir que palavras como tataapareçam duas vezes)

 misture a lista de listas em uma única matriz (blocos com seqüências de caracteres todos os espaços)

⍵∊⍨ indica quais elementos da matriz são membros da lista original

+/ soma as linhas (conta as ocorrências de cada uma das palavras originais)

2≤ indicar quais têm duplicatas (ou seja, ocorrerem outras que não quando giradas de volta ao original)

⍵/⍨ use isso para filtrar a lista original


{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); seu uso é inteligente
ngn

@ngn Obrigado. Eu aprendi o truque com Morten.
Adám

esses trens fazem meu cérebro doer ... é mais simples como um dfn:{⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
ngn

@ngn Isso é o que eu fiz, embora tenha me transformado em um trem e sem o truque para rotações #
2117 H.PWiz

1
desculpe, uma última mudança de idéia:⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
ngn

4

Braquilog , 26 bytes

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

Experimente 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

K (ngn / k) , 23 bytes

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

Experimente online!

{ } é uma função com argumento x

0 1_corta uma string nos índices 0 e 1, por exemplo "abcd"->(,"a";"bcd")

| inverte as duas fatias: ("bcd";,"a")

,/ junta-se a eles: "bcda"

(,/|0 1_)\ retorna todas as rotações de uma string

(,/|0 1_)\'x são as rotações de cada corda x

1_' descarta a primeira "rotação" de cada uma, ou seja, cada rotação de identidade trivial

,/ Junte-se

x^yé a lista xsem elementos da listay

x^x^yé a interseção de xey


Esperto. Consegui usar a parte de interseção para salvar outro byte.
Adám

2

05AB1E , 14 bytes

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

Experimente online!

Explicação

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

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

Experimente online!

Isso revelou uma falha importante na maneira como o PynTree constrói compreensões de lista porque usa funções para atribuir variáveis ​​para que a atribuição possa ser executada em expressões, mas as condições acabam não tendo o valor da variável até depois de ser avaliada e o bloco principal foi avaliado. Isso parece ser facilmente corrigível, mas eu não percebi isso antes e, portanto, essa resposta é terrivelmente longa.

Na verdade, mesmo se eu resolvesse isso, acho que ainda pode ser terrivelmente longo.


2

Perl 6 , 65 bytes

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

Tente

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

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

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
     )

Experimente online!


Bem-vindo ao PPCG! Não sou versado em JavaScript, mas verifique o tópico Dicas de JavaScript para ver se há algo que se aplique aqui.
AdmBorkBork

Obrigado pela dica. Eu li as respostas para JS e ES6, mas parece que já apliquei todas as dicas relevantes para isso. Pelo menos os que eram óbvios para mim.
bubens

1

Retina 0.8.2 , 71 62 bytes

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

Experimente online! Explicação:

%+)

Repita para cada palavra.

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

Anexe a próxima rotação da palavra com um final !.

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

Mas se essa é a palavra original, exclua-a novamente.

O`

Classifique as palavras.

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

Encontre as duplicatas.


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}

Experimente online!

11 bytes thx para Dennis para usar a x in y in zabordagem encadeada .

Toma um conjunto de palavras d; retorna um conjunto de rotônimos.


O cheque está muito fraco; {ab, abab} passaria.
Xnor 29/05

@xnor: Dang essas condições de borda! Uma solução rápida ...
Chas Brown


0

Japonês , 17 bytes

Extremamente lento, mas funciona. O tempo limite do TIO excede o tempo limite, mas confirmei que funciona diminuindo manualmente o número de iterações na fonte do 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.

Experimente online!


Por que tantas iterações? Inicialmente, fiz iterações para o comprimento da string, mas, através do teste, percebi que dez rotações à esquerda por palavra eram suficientes para encontrar todos os casos no arquivo de ditado do MacOS.
Umbrella

@ Guarda-chuva Porque é curto para escrever. A questão é o código de golfe, não o código mais rápido.
Nit

Entendo. Eu não estou familiarizado com Japt, então não estava claro para mim que iterar menos levaria mais caracteres.
Umbrella

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

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

Experimente online!



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.