Перемішування Ератостена


9

Виклик

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

Необхідне переміщення може бути описане за допомогою наступного алгоритму:

  1. Позначте кожного символу на вході за допомогою індексу на основі 1.
  2. Запишіть символ 1 як вихід.
  3. Починаючи з символу №2, записуйте кожен інший символ у вихідний порядок, виключаючи сам символ 2. Іншими словами, запишіть символи 4, 6, 8, 10 тощо, як вихід.
  4. Починаючи з наступного числа символів n, який ще не записаний як вихід, запишіть кожен n-й символ до виводу, виключаючи сам символ n та виключаючи будь-який інший символ (за цифровою міткою), який ви, можливо, вже записали у висновок.
  5. Повторіть крок 4 до тих пір, поки він продовжує додавати нові символи до виводу.
  6. Залиште символи, що залишилися для виведення, у порядку.

Приклад

  1. Позначте символів.
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  СОБАУТИКОРНЕР ОЛДДОКЯК

2. Напишіть перший символ для виводу:

 1   2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  O   LDDOCYAK 'SBEAUTYCORNER
O

3. Запишіть усі інші символи, починаючи з 2, виключаючи 2.

 1   2 3 4   5 6   7 8   9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
 O   LD    D O   C    Y A   K '   S    B E   A U   T Y     C   O R   N E   R
O OA 'EUYCRE

4. Наступний ще не записаний символ - це символ № 3; пишіть кожен третій символ, починаючи з 3, але виключаючи сам символ 3, і будь-який символ, який уже написано.

 1   2 3 4   5 6   7 8   9  10 11 12 13 14  15  16 17 18 19 20  21  22 23 24 25 26  27
  O   LD    D O   C Y A   K '   S B E   A U   T Y C   O R   N E R 
OOA 'EUYCRE YB R             

5. Повторіть крок 4, використовуючи наступний символ, символ 5.

4. Наступний ще не записаний символ - символ 5; пишіть кожен 5-й символ, починаючи з 5, але виключаючи сам символ 5, і будь-який уже написаний символ. (Це становить лише 25 символів).

 1   2 3 4   5 6   7 8  9  10 11 12 13 14  15  16 17 18 19 20  21  22 23 24  25  26  27
  O   LD    D O   C Y A   K '   S B E   A U   T Y C   O R N E R 
OOA 'EUYCREYB R N               

5. Наступний символ - 7; але 14, 21 вже написано, тому більше символів не буде виведено, якщо ми повторимо крок 4. Таким чином, ми зробили з 5.

6. Випишіть інші символи в порядку.

 1   2 3 4   5 6   7 8  9  10 11 12 13 14  15  16 17 18 19 20  21  22 23 24  25  26  27
  O   LD   D O   C Y A   K '   S B E   A U   T Y C   O R N E R 
OOA 'EUYCREYB RN LDDCKSATO                  

Правила

Введення та вихід можуть здійснюватися за допомогою стандартного вводу / стандартного виводу, рядків або масивів символів.

Якщо ви читаєте в якості стандартного введення, ви можете припустити, що існує зворотний новий рядок, або що весь вхід містить рядок. Персонажі нового рядка не беруть участь у перетасуванні.

Так само, за вашої зручності, ваш вихід може мати або зворотний новий рядок, або ні.

Стандартні лазівки заборонені.

Це змагання з кодового гольфу. Найменший код у байтах виграє.

Випробування

123456789ABCDEF -> 1468ACE9F2357BD

OLD DOC YAK'S BEAUTY CORNER -> O O A' EUYCREYB RNLDDCKSATO

Blue boxes use a 2600hz tone to convince telephone switches that use in-band signalling that the caller is actually a telephone operator.
->
Bebxsuea20h oet ovnetlpoesice htuei-adsgaln httecle satal  eehn prtre 0ncce ha nng aiuapootnt ihyon atallu o s 6z oi ehwstsnbilt lr clee.

Тепер я бачу, чому це так дивно знайомо ... Це головне сито ...
busukxuan

1
Мене справді спантеличили чотири у ваших кодових блоках. Закреслено 4 все ще регулярно 4 ...
Mama Fun Roll

@MamaFunRoll Так, але все розміщено зовсім небагато, щоб показати числові мітки. Скориставшись цим, я продовжив закреслення. Тепер 4 насправді виглядає закресленими ... краще?
H Walters

1
Так, це був частково старий мем PPCG: P Хоча, дякую, ясність!
Mama Fun Roll

Відповіді:


4

Желе , 10 байт

JÆfṂ$ÞÆPÞị

TryItOnline

Як?

JÆfṂ$ÞÆPÞị - Main link: theString
J          - range(length), the 1-based indexes of theString
     Þ     - sort these by
    $      -     last two links as a monad
 Æf        -         prime factorization array (e.g. 20 -> [2,2,5])
   Ṃ       -         minimum
        Þ  - sort these by
      ÆP   - isPrime, i.e. move all the primes to the right
         ị - index into theString

5

Математика, 61 байт

#[[SortBy[Range@Length@#,FactorInteger[#][[1,1]]PrimeQ@#&]]]&

Безіменна функція, яка приймає список символів як вхідні та повертає список символів.

FactorInteger[#][[1,1]]дає найменший простий коефіцієнт #(і повертається, 1якщо #дорівнює 1). Тому FactorInteger[#][[1,1]]PrimeQ@#виходить дивний вираз: [ #'найменший простий коефіцієнт], Falseякщо #він не є простим, а # Trueякщо #є простим (це неоцінені добутки числа і булевого рівня).

Range@Length@#дає список чисел до довжини введення. Потім SortByсортуйте ці числа за описаною вище смішною функцією. Mathematica справді багато в чому чутливий до типу, але бадьоро змішує їх іншими способами: вирази форми [число] Falseв алфавітному порядку сортуються перед виразами форми [число] True, тоді як зв’язки розбиваються шляхом сортування чисел за числовим числом. Це створює саме ту перестановку, яку ми хочемо тут, і перестановляє #[[...]]символи вводу відповідно.


2

C, 164 байти

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

#define p putchar
main(c,s,i,j,t)char**s,*t;{c=strlen(t=s[1]);p(*t);for(;j++<c;)if(t[j])for(i=2*j+1;i<=c;i+=j+1)!t[i]?:p(t[i]),t[i]=0;for(j=0;j++<c;)!*++t?:p(*t);}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.