Erstellen Sie eine Liste der Rotonyme 2

11

Rotonyme 2

Ein "Rotonym" ist ein Wort, das ROT13 in ein anderes Wort (in derselben Sprache) umwandelt.

Für diese Herausforderung verwenden wir eine alternative Definition: Ein "Rotonym" ist ein Wort, das sich kreisförmig in ein anderes Wort (in derselben Sprache) verschiebt.

Beispielsweise:

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

Die Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die eine Wörterbuch- / Wortliste akzeptiert und eine vollständige Liste von Rotonymen druckt oder zurückgibt.

  1. Ordnung spielt keine Rolle.
  2. Bei Vergleichen sollte die Groß- und Kleinschreibung nicht berücksichtigt werden. Sie können also davon ausgehen, dass die Eingabe als Wörterbuch nur in Kleinbuchstaben übergeben wird.
  3. Das Ergebnis sollte als einzelne Wörter (nicht als Paare) ausgedrückt werden und keine Duplikate enthalten. Sie können also davon ausgehen, dass die Eingabe keine Duplikate enthält.
  4. Das ist .

Beispiel

Gegeben

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Rückkehr

ablest
abort
stable
tables
tabor

Ein echter Test

Gegeben

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

Rückkehr

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
Regenschirm
quelle
Können wir annehmen, dass Eingabewörter eindeutig sind?
ngn
Ja, ich glaube, ich habe meine Eingabe durch einen eindeutigen Filter vorab ausgeführt, als ich das Systemwörterbuch ausgeführt habe.
Regenschirm
Ich bemerkte, dass einige Antworten für das Beispiel funktionierten, aber nicht für ein vollständiges Wörterbuch. Ich habe einen größeren Testsatz hinzugefügt, der eine Teilmenge des Wörterbuchs ist, die groß genug ist, um Wörter zu enthalten, die bei einigen Antworten, die das triviale Beispiel bestehen, fehlschlagen.
Regenschirm
@Umbrella Sie sollten alle ungültigen Antworten kommentieren, um den Benutzer zu benachrichtigen, damit er seine Antwort
korrigieren
abdominovaginalDu hast da ein paar seltsame Worte.
Magic Octopus Urn

Antworten:

5

Gelee , 8 Bytes

ṙ1$ƬfḊɗƇ

Probieren Sie es online aus!

Alternative Version, 7 Bytes

ṙƬ1fḊʋƇ

Dyadic hat Ƭfrüher etwas Seltsames gemacht, also hat das nicht funktioniert, als die Herausforderung veröffentlicht wurde.

Probieren Sie es online aus!

Wie es funktioniert

ṙƬ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
quelle
Oh neue schnelle Charaktere? Hm muss lernen, wann man diese jetzt benutzt ... (die gleichen Dinge, aber jetzt 1-Byter, damit ich sie mehr als früher verwenden kann, als sie 2-Byter waren)
HyperNeutrino
Es ist gleichbedeutend mit ṙ1$ÐĿfḊɗÐf.
Dennis
4

APL (Dyalog) , 20 Bytes

Benötigt ⎕io←0

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

Probieren Sie es online aus!

(1↓∘∪⍳∘≢⌽¨⊂)¨ Ruft die eindeutigen Rotationen (ohne die Zeichenfolge selbst) jeder Zeichenfolge im Wörterbuch ab

nimmt die Länge eines Vektors

⍳∘≢ Erstellt den Bereich von 0 bis zur Länge

dreht einen Vektor einige Male, z. B. 2⌽'abort '->' ortab '

⍳∘≢⌽¨⊂ gibt dann alle Umdrehungen eines Vektors an

entfernt die Duplikate

1↓ entfernt das erste Element (die ursprüngliche Zeichenfolge)

,/ glättet alle Rotationen in einer Liste

⊂∩¨ nimmt den Schnittpunkt des Wörterbuchs mit den Rotationen

H.PWiz
quelle
Ihr Ergebnis kommt beigefügt heraus, aber ich denke, das sollte in Ordnung sein, und @ Adám kann Ihren ⊂∩¨Trick (oder umgekehrt) für einen weiteren -1
ngn
4

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

Leiht Ideen aus der ngn / k-Lösung von ngn aus . Und dann -6 danke an ihn. Auch -1 durch Rückgabe einer beiliegenden Liste wie H.PWiz .

Anonyme stillschweigende Präfixfunktion.

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

Probieren Sie es online aus!

( Wenden Sie auf jedes Wort die folgende stillschweigende Funktion an:

,⍨ verketten Sie das Wort zu sich selbst

≢,/ alle wortlangen Unterzeichenfolgen (dh alle Rotationen)

 einzigartige Elemente dieser Rotationen (um zu verhindern, dass Wörter wie tatazweimal erscheinen)

1,.↓ die Verkettung der Drop-Firsts (der ursprünglichen Wörter) jeder Liste

⊂∩¨ Schnittpunkt des Inhalts dieser und der gesamten ursprünglichen Wortliste


Alte Lösung

-2 danke an ngn.

Anonymes Präfix Lambda.

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

Probieren Sie es online aus!

{} Funktion wo ist die Wortliste:

( Wenden Sie auf jedes Wort die folgende stillschweigende Funktion an:

  ,⍨ verketten Sie das Wort zu sich selbst

  ≢,/ alle wortlangen Unterzeichenfolgen (dh alle Rotationen)

   einzigartige Elemente dieser Rotationen (um zu verhindern, dass Wörter wie tatazweimal erscheinen)

 Mischen Sie die Liste der Listen in einer einzigen Matrix (Pads mit All-Space-Strings).

⍵∊⍨ Geben Sie an, welche Elemente der Matrix Mitglieder der ursprünglichen Liste sind

+/ Summiere die Zeilen (zählt das Vorkommen jedes der ursprünglichen Wörter)

2≤ Geben Sie an, welche Duplikate haben (dh nicht anders als beim Zurückdrehen zum Original).

⍵/⍨ Verwenden Sie dies, um die ursprüngliche Liste zu filtern

Adam
quelle
{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); Ihre Verwendung von ist klug
ngn
@ngn Danke. Ich habe den Trick von Morten gelernt.
Adám
Diese Züge machen mein Gehirn weh ... es ist einfacher als ein dfn:{⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
ngn
@ngn Das habe ich zwar zu einem Zug gemacht und ohne den Trick für Rotationen
H.PWiz
1
Entschuldigung, eine letzte Änderung der Meinung:⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
ngn
4

Brachylog , 26 Bytes

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

Probieren Sie es online aus!

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 - Monica wieder einsetzen
quelle
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]

Probieren Sie es online aus!

Nimmt eine Reihe von Wörtern (Kleinbuchstaben) und gibt eine Liste von Rotonymen zurück.


Gerettet

  • -2 Bytes dank Ovs
TFeld
quelle
67 Bytes
ovs
3

K (ngn / k) , 23 Bytes

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

Probieren Sie es online aus!

{ } ist eine Funktion mit Argument x

0 1_schneidet eine Zeichenfolge bei den Indizes 0 und 1, z. B. "abcd"->(,"a";"bcd")

| kehrt die beiden Scheiben um: ("bcd";,"a")

,/ schließt sich ihnen an: "bcda"

(,/|0 1_)\ Gibt alle Umdrehungen eines Strings zurück

(,/|0 1_)\'x sind die Rotationen jeder Saite in x

1_' Lässt die erste "Rotation" von jeder fallen, dh jede triviale Identitätsrotation

,/ beitreten

x^yist die Liste xohne Elemente der Listey

x^x^yist der Schnittpunkt von xundy

ngn
quelle
Klug. Ich konnte den Schnittpunkt verwenden, um ein weiteres Byte zu speichern.
Adám
2

05AB1E , 14 Bytes

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

Probieren Sie es online aus!

Erläuterung

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

PynTree , 44 Bytes

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

Probieren Sie es online aus!

Dies stellte sich als schwerwiegender Fehler in der Art und Weise heraus, wie PynTree Listenverständnisse erstellt, da es Funktionen zum Zuweisen von Variablen verwendet, sodass die Zuweisung in Ausdrücken erfolgen kann. Die Bedingungen haben jedoch erst dann den Wert der Variablen, wenn sie ausgewertet wurden und Der Hauptblock wurde ausgewertet. Dies scheint leicht zu beheben zu sein, aber ich habe dies nicht früher bemerkt und daher ist diese Antwort schrecklich lang.

Eigentlich selbst wenn ich das behoben habe, denke ich, dass es immer noch furchtbar lang sein könnte.

HyperNeutrino
quelle
2

Perl 6 , 65 Bytes

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

Versuch es

Erweitert:

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

Probieren Sie es online aus!

bubens
quelle
Willkommen bei PPCG! Ich bin nicht mit JavaScript vertraut, aber lesen Sie unbedingt den Thread mit den JavaScript-Tipps, um festzustellen, ob hier etwas zutrifft.
AdmBorkBork
Danke für den Tipp. Ich habe die Antworten sowohl für JS als auch für ES6 gelesen, aber anscheinend habe ich bereits alle relevanten Tipps dafür angewendet. Zumindest diejenigen, die mir klar waren.
Bubens
1

Retina 0,8,2 , 71 62 Bytes

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

Probieren Sie es online aus! Erläuterung:

%+)

Wiederholen Sie dies für jedes Wort.

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

Stellen Sie die nächste Drehung des Wortes mit einem nachgestellten Zeichen voran !.

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

Aber wenn das das ursprüngliche Wort ist, löschen Sie es erneut.

O`

Sortieren Sie die Wörter.

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

Finde die Duplikate.

Neil
quelle
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}

Probieren Sie es online aus!

11 Bytes danke an Dennis , um den verketteten x in y in zAnsatz zu verwenden.

Nimmt eine Reihe von Wörtern d; gibt eine Reihe von Rotonymen zurück.

Chas Brown
quelle
Der Scheck ist zu schwach; {ab, abab} würde es bestehen.
xnor
@xnor: Verdammt diese Randbedingungen! Eine schnelle Lösung ...
Chas Brown
0

Japt , 17 Bytes

Extrem langsam, funktioniert aber. TIO läuft ab, aber ich habe bestätigt, dass es funktioniert, indem die Anzahl der Iterationen in der Sprachquelle manuell verringert wurde.

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.

Probieren Sie es online aus!

Nit
quelle
Warum so viele Iterationen? Ich habe anfangs Iterationen für die Zeichenfolgenlänge durchgeführt, aber durch Tests wurde festgestellt, dass zehn Linksumdrehungen pro Wort ausreichen, um alle Fälle in der MacOS-Diktatdatei zu finden.
Regenschirm
@ Umbrella Weil es kurz ist zu schreiben. Die Frage ist Code Golf, nicht der schnellste Code.
Nit
Aha. Ich bin mit Japt nicht vertraut, daher war mir nicht klar, dass weniger Iteration mehr Zeichen erfordern würde.
Regenschirm
0

Javascript, 129 Zeichen

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

Probieren Sie es online aus!

Schlafend
quelle
0

Java (JDK 10) , 144 Byte

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

Probieren Sie es online aus!

Olivier Grégoire
quelle
0

JavaScript (Node.js) , 66 Byte

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

Probieren Sie es online aus!

langweilige Antwort

14 m2
quelle
Dies funktioniert nicht richtig. Testen Sie es mit dem größeren Test-Set, das ich hinzugefügt habe.
Regenschirm