Losowanie Eratostenesa

9

Wyzwanie

Napisz funkcję lub program, który akceptuje wiersz danych wejściowych, wykonuje bardzo specyficzne i dziwnie znajome losowanie swoich znaków i wyświetla wynik.

Wymagane tasowanie można opisać za pomocą następującego algorytmu:

  1. Oznacz każdy znak na wejściu indeksem 1.
  2. Wpisz znak numer 1 jako wynik.
  3. Zaczynając od znaku 2, zapisz co drugi znak na wyjściu w kolejności, z wyjątkiem samego znaku 2. Innymi słowy, wypisz znaki 4, 6, 8, 10 itd. Jako dane wyjściowe.
  4. Zaczynając od następnego znaku n, który nie został jeszcze zapisany jako wynik, zapisz co n-ty znak na wyjściu, wyłączając znak n sam i wykluczając jakikolwiek inny znak (etykietą numeryczną), który mógłeś już zapisać na wyjściu.
  5. Powtórz krok 4, o ile nadal dodaje nowe znaki do wyniku.
  6. Wpisz pozostałe znaki do wydrukowania w kolejności.

Przykład

  1. Oznacz znaki.
  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
  OLDDOCYAK 'SBEAUTYCORNER

2. Wpisz pierwszy znak do wyjścia:

 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. Napisz co drugi znak zaczynając od 2, z wyjątkiem 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. Następnym nie zapisanym jeszcze znakiem jest znak 3; napisz co 3 znak, zaczynając od 3, ale wyłączając znak 3 i każdy znak już napisany.

 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. Powtórz krok 4, używając następnego znaku, znaku 5.

4. Następnym jeszcze nie zapisanym znakiem jest znak 5; napisz co 5 znak, zaczynając od 5, ale wyłączając sam znak 5 i każdy znak już napisany. (To tylko postać 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. Następna postać to 7; ale 14, 21 zostało już napisanych, więc nie powiemy więcej znaków, jeśli powtórzymy krok 4. Zatem skończyliśmy z 5.

6. Wypisz pozostałe znaki w kolejności.

 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                  

Zasady

Wejście i wyjście może odbywać się za pośrednictwem standardowego wejścia / wyjścia standardowego, ciągów znaków lub tablic znaków.

Jeśli wczytujesz standardowe wejście, możesz wygodnie założyć, że jest nowy znak końca lub że całe wejście zawiera wiersz. Znaki nowej linii nie uczestniczą w tasowaniu.

Podobnie, dla twojej wygody, twój wynik może albo mieć końcowy znak nowej linii, albo nie.

Standardowe luki są niedozwolone.

To zawody w golfa kodowego. Najmniejszy kod w bajtach wygrywa.

Przypadki testowe

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 Walters
źródło
Teraz rozumiem, dlaczego to jest tak dziwnie znajome ... To główne sito ...
busukxuan
1
Naprawdę byłem zaskoczony 4 w twoich blokach kodu. Przekreślone 4 wciąż jest normalne 4 ...
Mama Fun Roll
@MamaFunRoll Tak, ale wszystko jest dość rozłożone, aby pokazać etykiety numeryczne. Korzystając z tego, przedłużyłem strajki. Teraz 4 wygląda na przekreślone ... lepiej?
H Walters,
1
Tak, to był częściowo stary mem PPCG: P Dziękuję, doceń jasność!
Mama Fun Roll

Odpowiedzi:

4

Galaretka , 10 bajtów

JÆfṂ$ÞÆPÞị

TryItOnline

W jaki sposób?

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
Jonathan Allan
źródło
5

Mathematica, 61 bajtów

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

Funkcja bez nazwy, która przyjmuje listę znaków jako dane wejściowe i zwraca listę znaków.

FactorInteger[#][[1,1]]daje najmniejszy współczynnik pierwszy #(i zwraca, 1jeśli #jest równy 1). Dlatego FactorInteger[#][[1,1]]PrimeQ@#daje dziwne wyrażenie: [ #najmniejszy czynnik pierwszy], Falsejeśli #nie jest liczbą pierwszą, a # Truejeśli #jest liczbą pierwszą (są to nieocenione produkty liczby i wartości logicznej).

Range@Length@#zwraca listę liczb do długości danych wejściowych. Następnie SortBysortuje te liczby według zabawnej funkcji opisanej powyżej. Mathematica jest naprawdę wrażliwa na typy na wiele sposobów, ale wesoło miesza je na inne sposoby: wyrażenia postaci [liczba] Falsesą sortowane alfabetycznie przed wyrażeniami postaci [liczba] True, podczas gdy powiązania są łamane przez sortowanie liczb numerycznie. To daje dokładnie taką permutację, jakiej chcemy tutaj, i odpowiednio #[[...]]permutuje znaki wejściowe.

Greg Martin
źródło
2

C, 164 bajty

Pobiera to dane wejściowe jako pierwszy parametr polecenia i wypisuje z powrotem na standardowe wyjście. Gdy przetwarzamy każdą postać, usuwamy ją, pozwalając na końcowe przejście.

#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);}
Seth
źródło