Desafio
Escreva uma função ou programa que aceite uma linha de entrada, execute uma aleatória muito específica e estranhamente familiar em seus caracteres e produz o resultado.
O embaralhamento necessário pode ser descrito usando o seguinte algoritmo:
- Rotule cada caractere na entrada com um índice baseado em 1.
- Escreva o número do caractere 1 como saída.
- Começando com o caractere número 2, escreva todos os outros caracteres na saída em ordem, excluindo o próprio caractere 2. Em outras palavras, escreva os caracteres 4, 6, 8, 10 e assim por diante como saída.
- Começando com o próximo número de caractere n ainda não gravado como saída, escreva cada enésimo caractere na saída, excluindo o próprio caractere n e excluindo qualquer outro caractere (por etiqueta numérica) que você já tenha gravado na saída.
- Repita a etapa 4, enquanto continuar adicionando novos caracteres à saída.
- Escreva os caracteres restantes na saída, em ordem.
Exemplo
- Rotule os caracteres.
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. Escreva o primeiro caractere a ser impresso:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27OLDDOCYAK 'SBEAUTYCORNER O
3. Escreva todos os outros caracteres começando com 2, excluindo 2.
12 3456789101112131415161718192021222324252627OLDDSCYAK'SBEALTYCORNER O OA 'EUYCRE
4. O próximo caractere ainda não escrito é o número de caractere 3; escreva cada terceiro caractere começando com 3, mas excluindo o próprio caractere 3 e qualquer caractere já escrito.
12 3456789101112131415161718192021222324252627OLDDOCYAK'SBEAUTYCORNEROOA «EUYCRE YB R
5. Repita a etapa 4 usando o próximo caractere, o caractere 5.
4. O próximo caractere ainda não escrito é o número 5; escreva cada quinto caractere começando com 5, mas excluindo o próprio caractere 5 e qualquer caractere já escrito. (Isso equivale apenas ao caractere 25).
12 3456789101112131415161718192021222324252627OLDDOCYAK'SBEAUTYCORNEROOA «EUYCREYB R N
5. O próximo caractere é 7; mas 14, 21 já foram escritos, portanto, nenhum caractere seria gerado se repetirmos a etapa 4. Assim, terminamos com 5.
6. Escreva os caracteres restantes em ordem.
12 3456789101112131415161718192021222324252627OLD DOCYAK'SBEAUTYCORNEROOA «EUYCREYB RN LDDCKSATO
Regras
A entrada e a saída podem ser via entrada / saída padrão, seqüências de caracteres ou matrizes de caracteres.
Se ler como entrada padrão, você pode, por sua conveniência, assumir que há uma nova linha à direita ou que toda a entrada contém a linha. Os caracteres de nova linha não participam do shuffle.
Da mesma forma, para sua conveniência, sua saída pode ter uma nova linha à direita ou não.
As brechas padrão não são permitidas.
Esta é uma competição de código de golfe. O menor código em bytes vence.
Casos de teste
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.
Respostas:
Gelatina , 10 bytes
TryItOnline
Como?
fonte
Mathematica, 61 bytes
Função sem nome, recebendo uma lista de caracteres como entrada e retornando uma lista de caracteres.
FactorInteger[#][[1,1]]
produz o menor fator primo de#
(e retorna1
se for#
igual1
). Portanto,FactorInteger[#][[1,1]]PrimeQ@#
produz uma expressão estranha:#
o menor fator primo de []False
se#
não for primo e# True
se#
for primo (esses são produtos não avaliados de um número e um booleano).Range@Length@#
produz uma lista dos números até o comprimento da entrada. Em seguida,SortBy
classifica esses números pela função engraçada descrita acima. O Mathematica é realmente sensível a tipos de várias maneiras, mas as combina alegremente de outras maneiras: as expressões do formulário [número]False
são classificadas em ordem alfabética antes das expressões do formulário [número]True
, enquanto os vínculos são quebrados ao classificar os números numericamente. Isso produz exatamente a permutação que queremos aqui e#[[...]]
permuta os caracteres da entrada de acordo.fonte
C, 164 bytes
Isso recebe a entrada como o primeiro parâmetro de comando e imprime de volta ao stdout. À medida que processamos cada personagem, limpamos, permitindo o passe final.
fonte