Эратосфен Шафл

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.
H Уолтерс
источник
Теперь я понимаю, почему это так странно знакомо ... Это простое сито ...
busukxuan
1
Я был действительно озадачен 4 в ваших блоках кода. Вычеркнуто 4 все еще регулярно 4 ...
Mama Fun Roll
@MamaFunRoll Да, но все расположено немного, чтобы показать числовые метки. Воспользовавшись этим, я продлил ауты. Теперь 4 на самом деле выглядит зачеркнуто ... лучше?
H Уолтерс
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

Mathematica, 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 байта

Это принимает ввод в качестве первого параметра команды и печатает обратно в стандартный вывод. Когда мы обрабатываем каждый символ, мы очищаем его, разрешая последний проход.

#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);}
Сет
источник