Складіть список ротонімів 2


11

Ротоніми 2

"Ротонім" - це слово, яке ROT13 переходить в інше слово (тією ж мовою).

Для цього завдання ми використаємо альтернативне визначення: "Ротонім" - це слово, яке круговим чином переміщується / перетворюється на інше слово (тією ж мовою).

Наприклад:

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

Змагання

Напишіть програму або функцію, яка приймає список словників / слів і друкує або повертає повний список ротонімів.

  1. Замовлення не має значення.
  2. Порівняння мають бути нечутливими до регістру, тому ви можете припустити, що вхід буде переданий як малий регістр словника.
  3. Результат повинен бути виражений окремими словами (а не парами) і не містити дублікатів, тому ви можете припустити, що введення не має дублікатів.
  4. Це .

Приклад

Дано

ablest
abort
green
irk
stable
tables
tabor
tata
terra
vex
you

Повернення

ablest
abort
stable
tables
tabor

Справжнє випробування

Дано

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

Повернення

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

чи можна вважати, що вхідні слова є унікальними?
ngn

Так, я думаю, що я заздалегідь провів свій вхід через унікальний фільтр, коли запускав системний словник.
Парасолька

Я помітив, що деякі відповіді працювали на прикладі, але не для повного словника. Я додав більший тестовий набір, який є підмножиною словника, достатньо великим, щоб містити слова, які не відповідають деяким відповідям, які передають тривіальний приклад.
Парасолька

@Umbrella, ви повинні прокоментувати будь-які недійсні відповіді, щоб попередити користувача, щоб він міг виправити / видалити свою відповідь
H.PWiz

abdominovaginal, у вас там є якісь дивні слова.
Чарівна восьминога урна

Відповіді:


5

Желе , 8 байт

ṙ1$ƬfḊɗƇ

Спробуйте в Інтернеті!

Альтернативна версія, 7 байт

ṙƬ1fḊʋƇ

Діадік Ƭробив щось дивне, тож це не вийшло, коли було викладено виклик.

Спробуйте в Інтернеті!

Як це працює

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

О нових швидких персонажів? Хм, я повинен навчитися коли ними користуватися ... (ті ж речі, але зараз 1 байт, тому я можу використовувати їх більше, ніж назад, коли вони були 2-байтними)
HyperNeutrino

Це рівнозначно ṙ1$ÐĿfḊɗÐf.
Денніс

4

APL (Dyalog) , 20 байт

Вимагає ⎕io←0

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

Спробуйте в Інтернеті!

(1↓∘∪⍳∘≢⌽¨⊂)¨ отримує унікальні обертання (виключаючи сам рядок) кожної рядки в словнику

приймає довжину вектора

⍳∘≢ створює діапазон від 0 до довжини

кілька разів обертає вектор, наприклад, 2⌽'abort '->' ortab '

⍳∘≢⌽¨⊂ буде дано всі обертання вектора

видаляє дублікати

1↓ видаляє перший елемент (початковий рядок)

,/ згладжує всі обертання в один список

⊂∩¨ приймає перетин словника з обертаннями


ваш результат виходить укладеним, але я думаю, що це повинно бути гаразд, і @ Adám може вкрасти ⊂∩¨трюк (або навпаки) для подальшого -1
ngn

4

APL (Dyalog Unicode) , 25 23 22 17 16 байт SBCS

Позичає ідеї з ngn / k рішення ngn . А потім -6 завдяки йому. Також -1, повернувши доданий список як H.PWiz .

Функція анонімного мовчазного префікса.

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

Спробуйте в Інтернеті!

( Застосувати таку негласну функцію до кожного слова:

,⍨ приєднати слово до себе

≢,/ всі підрядки довжиною слова (тобто всі обертання)

 унікальні елементи цих обертань (щоб запобігти появі таких слів, як tataдвічі)

1,.↓ з’єднання первинних слів (оригінальних слів) кожного списку

⊂∩¨ перетин змісту цього і всього оригінального списку слів


Старе рішення

-2 завдяки ngn.

Анонімний префікс лямбда.

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

Спробуйте в Інтернеті!

{} Функція, де знаходиться список слів:

( Застосувати таку негласну функцію до кожного слова:

  ,⍨ приєднати слово до себе

  ≢,/ всі підрядки довжиною слова (тобто всі обертання)

   унікальні елементи цих обертань (щоб запобігти появі таких слів, як tataдвічі)

 змішати список списків в одну матрицю (колодки з рядками з усього простору)

⍵∊⍨ вказати, які елементи матриці є членами вихідного списку

+/ підсумовуйте рядки (підраховує події кожного з початкових слів)

2≤ вкажіть, які мають дублікати (тобто трапляються інші, ніж при поверненні до оригіналу)

⍵/⍨ використовуйте це для фільтрування оригінального списку


{∪⌽∘⍵¨⍳≢⍵}-> (∪≢,/,⍨); ви користуєтесь розумним
ngn

@ngn Дякую Я дізнався трюк від Мортена.
Адам

ці потяги роблять мій мозок {⍵∩⊃,/1↓¨(∪≢,/,⍨)¨⍵}
болячим

@ngn Це те, що я хоч увійшов у поїзд і без хитрості для обертань
H.PWiz

1
Вибачте, остання ⊢∩∘⊃1,.↓(∪≢,/,⍨)¨
передумка

4

Брахілог , 26 байт

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

Спробуйте в Інтернеті!

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

К (нг / к) , 23 байти

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

Спробуйте в Інтернеті!

{ } - це функція з аргументом x

0 1_вирізає рядок за індексами 0 і 1, наприклад "abcd"->(,"a";"bcd")

| обертає два скибочки: ("bcd";,"a")

,/ приєднується до них: "bcda"

(,/|0 1_)\ повертає всі обертання рядка

(,/|0 1_)\'x - це обертання кожного рядка в x

1_' випадає перше "обертання" кожного, тобто кожного тривіального обертання тотожності

,/ приєднатися

x^y- це список xбез елементів спискуy

x^x^yє перетином xіy


Розумний. Мені вдалося використати частину перетину, щоб зберегти ще один байт.
Адам

2

05AB1E , 14 байт

εDvDÀ})Ùå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 байти

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

Спробуйте в Інтернеті!

Це виявило головний недолік у тому, як PynTree будує список розумінь, оскільки використовує функції для призначення змінних, щоб призначення могло переходити у вирази, але тоді в результаті умови не мають значення змінної до того моменту, як вона не буде оцінена і основний блок був оцінений. Це здається легко зафіксованим, але я цього не помічав раніше, і тому ця відповідь жахливо довга.

Насправді навіть якщо я визначив, що думаю, це все ще може бути дуже довго.


2

Перл 6 , 65 байт

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

Спробуй це

Розширено:

{  # 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 байт

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

Безголівки:

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
     )

Спробуйте в Інтернеті!


Ласкаво просимо до PPCG! Я не розбираюся в JavaScript, але не забудьте перевірити тему JavaScript Поради, щоб побачити, чи є щось, що стосується тут.
AdmBorkBork

Дякую за підказку. Я читав відповіді як для JS, так і для ES6, але, здається, я вже застосував усі відповідні поради для цього. Принаймні ті, які були мені очевидні.
бульбашки

1

Сітківка 0,8,2 , 71 62 байт

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

Спробуйте в Інтернеті! Пояснення:

%+)

Повторіть для кожного слова.

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

Попередьте наступне обертання слова із заднім числом !.

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

Але якщо це початкове слово, видаліть його ще раз.

O`

Сортуйте слова.

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

Знайдіть дублікати.


1

Python 2 , 66 55 70 байт

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

Спробуйте в Інтернеті!

11 байт Thx для Денніса, щоб використовувати прикутийx in y in z підхід.

Бере набір слів d; повертає набір Rotonyms.


Чек занадто слабкий; {ab, abab} передасть це.
xnor

@xnor: Наносити такі крайові умови! Швидке виправлення ...
Час Браун


0

Japt , 17 байт

Надзвичайно повільно, але працює. TIO вичерпується, але я підтвердив, що він працює, зменшивши кількість ітерацій в мовному джерелі вручну.

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.

Спробуйте в Інтернеті!


Чому так багато ітерацій? Я спочатку робив ітерації для довжини рядка, але за допомогою тестування зрозуміло, що десять лівих обертів на слово було достатньо, щоб знайти всі випадки у файлі диктовок MacOS.
Парасолька

@Umbrella Тому що писати коротко. Питання - це код гольфу, а не найшвидший код.
Ніт

Я бачу. Я не знайомий з Japt, тому мені не видно було, що менша ітерація займе більше символів.
Парасолька

0

Javascript, 129 символів

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

Безумовно

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

Спробуйте в Інтернеті!



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.