Utwórz listę rotonimów 2

11

Rotonimy 2

„Rotonim” to słowo, które ROT13 zamienia na inne słowo (w tym samym języku).

W tym wyzwaniu zastosujemy alternatywną definicję: „Rotonim” to słowo, które cyklicznie przesuwa się / obraca w inne słowo (w tym samym języku).

Na przykład:

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

Wyzwanie

Napisz program lub funkcję, która akceptuje słownik / listę słów i drukuje lub zwraca pełną listę rotonimów.

  1. Porządek nie ma znaczenia.
  2. Porównania nie powinny uwzględniać wielkości liter, więc można założyć, że dane wejściowe zostaną przekazane jako słownik zawierający tylko małe litery.
  3. Wynik powinien być wyrażony jako pojedyncze słowa (nie pary) i nie może zawierać duplikatów, więc można założyć, że dane wejściowe nie mają duplikatów.
  4. To jest .

Przykład

Dany

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Powrót

ablest
abort
stable
tables
tabor

Prawdziwy test

Dany

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

Powrót

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
Parasol
źródło
czy możemy założyć, że słowa wejściowe są unikalne?
ngn
Tak, myślę, że wcześniej uruchomiłem swoje wejście przez unikalny filtr, kiedy uruchomiłem słownik systemowy.
Parasol
Zauważyłem, że niektóre odpowiedzi działały w tym przykładzie, ale nie w przypadku pełnego słownika. Dodałem większy zestaw testowy, który jest podzbiorem słownika wystarczająco dużym, aby zawierał słowa, które zawodzą w przypadku niektórych odpowiedzi, które przechodzą przez prosty przykład.
Parasol
@Umbrella powinieneś komentować wszelkie nieprawidłowe odpowiedzi, aby ostrzec użytkownika, aby mógł naprawić / usunąć swoją odpowiedź
H.PWiz
abdominovaginal, masz tam jakieś dziwne słowa.
Magic Octopus Urn

Odpowiedzi:

5

Galaretka , 8 bajtów

ṙ1$ƬfḊɗƇ

Wypróbuj online!

Alternatywna wersja, 7 bajtów

ṙƬ1fḊʋƇ

Dyadic Ƭrobił kiedyś coś dziwnego, więc nie zadziałało to po opublikowaniu wyzwania.

Wypróbuj online!

Jak to działa

ṙƬ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
źródło
Och, nowe szybkie postacie? Hm, muszę się nauczyć, kiedy ich używać teraz ... (te same rzeczy, ale teraz 1-byters, więc mogę używać ich więcej niż w przeszłości, gdy były 2-byters)
HyperNeutrino
Jest to równoważne z ṙ1$ÐĿfḊɗÐf.
Dennis
4

APL (Dyalog) , 20 bajtów

Wymaga ⎕io←0

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

Wypróbuj online!

(1↓∘∪⍳∘≢⌽¨⊂)¨ pobiera unikalne obroty (wyłączając sam łańcuch) każdego łańcucha w słowniku

przyjmuje długość wektora

⍳∘≢ tworzy zakres od 0 do długości

obraca wektor kilka razy, np. 2⌽ 'abort' -> 'ortab'

⍳∘≢⌽¨⊂ da wtedy wszystkie obroty wektora

usuwa duplikaty

1↓ usuwa pierwszy element (oryginalny ciąg)

,/ spłaszcza wszystkie obroty w jedną listę

⊂∩¨ przyjmuje przecięcie słownika z obrotami

H.PWiz
źródło
twój wynik jest zamknięty, ale myślę, że powinno być w porządku, a @ Adám może ukraść twoją ⊂∩¨sztuczkę (lub odwrotnie) przez kolejne -1
ngn
4

APL (Dyalog Unicode) , 25 23 22 17 16 bajtów SBCS

Pożycza pomysły z rozwiązania ngn / k ngn . A potem -6 dzięki niemu. Również -1, zwracając załączoną listę jak H.PWiz .

Anonimowa ukryta funkcja prefiksu.

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

Wypróbuj online!

( Zastosuj następującą ukrytą funkcję do każdego słowa:

,⍨ konkatenuj słowo z samym sobą

≢,/ wszystkie podłańcuchy długości słowa (tzn. wszystkie rotacje)

 unikalne elementy tych rotacji (aby zapobiec pojawianiu się słów takich, jak tatapojawienie się dwukrotnie)

1,.↓ konkatenacja drop-firsts (oryginalne słowa) każdej listy

⊂∩¨ przecięcie treści tej i całej oryginalnej listy słów


Stare rozwiązanie

-2 dzięki ngn.

Anonimowy przedrostek lambda.

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

Wypróbuj online!

{} Funkcja gdzie jest lista słów:

( Zastosuj następującą ukrytą funkcję do każdego słowa:

  ,⍨ konkatenuj słowo z samym sobą

  ≢,/ wszystkie podłańcuchy długości słowa (tzn. wszystkie rotacje)

   unikalne elementy tych rotacji (aby zapobiec pojawianiu się słów takich, jak tatapojawienie się dwukrotnie)

 zmiksuj listę list w jedną macierz (pady z ciągami spacji)

⍵∊⍨ wskazuje, które elementy macierzy są członkami oryginalnej listy

+/ zsumuj wiersze (zlicza wystąpienia każdego z oryginalnych słów)

2≤ wskazać, które mają duplikaty (tj. wystąpić inaczej niż po obróceniu z powrotem do oryginału)

⍵/⍨ użyj tego do filtrowania oryginalnej listy

Adám
źródło
{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); twoje użycie jest sprytne
ngn
@ngn Thanks. Nauczyłem się tej sztuczki od Mortena.
Adám
pociągi te sprawiają, że mózg mnie boli ... to jest prostsze jak {⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
dfn
@ngn To właśnie zrobiłem, chociaż zrobiłem z niego pociąg i bez sztuczki na rotację
H.PWiz
1
przepraszam, ostatnia zmiana zdania:⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
ngn
4

Brachylog , 26 bajtów

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

Wypróbuj 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 ˢ)
sundar - Przywróć Monikę
źródło
3

Python 2 , 73 69 67 bajtów

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

Wypróbuj online!

Pobiera zestaw słów (małe litery) i zwraca listę rotonimów.


Zapisano

  • -2 bajty, dzięki ovs
TFeld
źródło
3

K (ngn / k) , 23 bajty

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

Wypróbuj online!

{ } jest funkcją z argumentem x

0 1_tnie ciąg przy indeksach 0 i 1, np. "abcd"->(,"a";"bcd")

| odwraca dwa plasterki: ("bcd";,"a")

,/ dołącza do nich: "bcda"

(,/|0 1_)\ zwraca wszystkie obroty łańcucha

(,/|0 1_)\'x są obrotami każdego łańcucha w x

1_' porzuca pierwszy „obrót” każdego, tj. każdy trywialny obrót tożsamości

,/ Przystąp

x^yto lista xbez elementów listyy

x^x^yjest skrzyżowaniem xiy

ngn
źródło
Sprytny. Byłem w stanie użyć części przecięcia, aby zapisać kolejny bajt.
Adám
2

05AB1E , 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

ε           }    # 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
źródło
2

PynTree , 44 bajty

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

Wypróbuj online!

Okazało się to ujawnić poważną wadę w sposobie, w jaki PynTree konstruuje wyrażenia listowe, ponieważ używa funkcji do przypisywania zmiennych, aby przypisanie mogło przebiegać w wyrażeniach, ale wtedy warunki nie mają wartości zmiennej aż do jej oceny i główny blok został oceniony. Wydaje się, że można to łatwo naprawić, ale nie zauważyłem tego wcześniej, więc ta odpowiedź jest strasznie długa.

Właściwie nawet gdybym to ustalił, myślę, że wciąż może być strasznie długi.

HyperNeutrino
źródło
2

Perl 6 , 65 bajtów

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

Spróbuj

Rozszerzony:

{  # 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
źródło
2

JavaScript (Node.js), 105 99 bajtów

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

Nie golfowany:

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
     )

Wypróbuj online!

bubens
źródło
Witamy w PPCG! Nie znam się na JavaScript, ale zajrzyj do wątku Porady JavaScript, aby sprawdzić, czy coś tu się dotyczy.
AdmBorkBork
Dzięki za podpowiedź. Przeczytałem odpowiedzi zarówno dla JS, jak i ES6, ale wydaje się, że zastosowałem już wszystkie odpowiednie wskazówki. Przynajmniej te, które były dla mnie oczywiste.
bubens
1

Retina 0.8.2 , 71 62 bajtów

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

Wypróbuj online! Wyjaśnienie:

%+)

Powtórz dla każdego słowa.

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

Dodaj następny obrót słowa z końcowym !.

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

Ale jeśli to jest oryginalne słowo, usuń je ponownie.

O`

Sortuj słowa.

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

Znajdź duplikaty.

Neil
źródło
1

Python 2 , 66 55 70 bajtów

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

Wypróbuj online!

11 bajtów dzięki Dennisowi, aby zastosować x in y in zpodejście łańcuchowe .

Przyjmuje zestaw słów d; zwraca zestaw rotonimów.

Chas Brown
źródło
Czek jest zbyt słaby; {ab, abab} to przekaże.
xnor
@xnor: Dang te warunki brzegowe! Szybka poprawka ...
Chas Brown
0

Japt , 17 bajtów

Niezwykle wolno, ale działa. Upłynął limit czasu TIO, ale potwierdziłem, że działa, ręcznie zmniejszając liczbę iteracji w źródle języka.

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.

Wypróbuj online!

Gnida
źródło
Dlaczego tyle iteracji? Początkowo robiłem iteracje dla długości łańcucha, ale poprzez testowanie zdałem sobie sprawę, że dziesięć lewych obrotów na słowo wystarczyło, aby znaleźć wszystkie przypadki w pliku dict MacOS.
Parasol
@Umbrella Ponieważ jest krótki do napisania. Pytanie dotyczy kodu golfa, a nie najszybszego kodu.
Nit
Widzę. Nie jestem zaznajomiony z Japt, więc nie było dla mnie oczywiste, że mniej iteracyjne zajęłoby więcej postaci.
Parasol
0

JavaScript, 129 znaków

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

Nie golfił

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

Wypróbuj online!

Śpiący
źródło
0

Java (JDK 10) , 144 bajty

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

Wypróbuj online!

Olivier Grégoire
źródło
0

JavaScript (Node.js) , 66 bajtów

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

Wypróbuj online!

nudna odpowiedź

l4m2
źródło
To nie działa poprawnie. Przetestuj to na większym zestawie testowym, który dodałem.
Parasol