Este desafio é uma homenagem ao usuário do PPCG Dennis por ganhar a parte dos ladrões do The Programming Language Quiz .
Olhando para a página de perfil PPCG de Dennis , podemos ver algumas coisas bastante impressionantes:
Atualmente, ele tem mais de sessenta e oito mil reputação, o que o coloca em segundo lugar no ranking geral , ultrapassando o terceiro lugar em quase trinta mil. Recentemente, ele venceu nossa eleição para um novo moderador e recebeu um novo diamante brilhante ao lado de seu nome. Mas, pessoalmente, acho que a parte mais interessante sobre Dennis é seu número de identificação de usuário PPCG: 12012.
À primeira vista, 12012
quase parece um palíndromo , um número que lê o mesmo quando invertido, mas está um pouco fora. Pode se tornar o palíndromo 21012
se trocarmos as posições do primeiro 1
e 2
, e pode se tornar o palíndromo 12021
se trocarmos o último 1
e 2
. Além disso, seguindo a convenção de que zeros à esquerda em um número não são gravados, troque o primeiro 1
e os 0
resultados por, 02112
ou melhor, 2112
qual é outro palíndromo.
Vamos definir um número de Dennis como um número inteiro positivo que não é palindrômico, mas que pode ser transformado em um palíndromo, trocando as posições de pelo menos um par de dois dígitos. A ordem de um número de Dennis é o número de pares distintos de dígitos que podem ser trocados para formar um palíndromo (não necessariamente distinto).
Assim, a fim de 12012
se desde 3 3 pares distintos de seus algarismos ( 12012
, , ) podem ser trocadas para produzir palindromas. passa a ser o menor número de 3 Dennis da ordem.12012
12012
12012
10
é o menor número de Dennis e tem a ordem 1 porque alternar entre 1
e 0
dá 01
aka 1
que é um palíndromo.
Os zeros iniciais imaginários de um número não contam como dígitos comutáveis. Por exemplo, alterar 8908
a 08908
e trocando os dois primeiros dígitos para obter o palíndromo 80908
é inválido. 8908
não é um número de Dennis.
Pode-se dizer que os números não-Dennis têm a ordem 0.
Desafio
Escreva um programa ou função que receba um número inteiro positivo N e imprima ou retorne o enésimo menor número de Dennis, juntamente com a ordem em algum formato razoável, como 12012 3
ou (12012, 3)
.
Por exemplo, 12012
é o número 774th Dennis, portanto, se 774
é a entrada para o seu programa, a saída deve ser algo como 12012 3
. (Curiosamente, 774 é outro número de Dennis.)
O código mais curto em bytes vence.
Aqui estão os 20 primeiros números de Dennis e seus pedidos de referência:
N Dennis Order
1 10 1
2 20 1
3 30 1
4 40 1
5 50 1
6 60 1
7 70 1
8 80 1
9 90 1
10 100 1
11 110 2
12 112 1
13 113 1
14 114 1
15 115 1
16 116 1
17 117 1
18 118 1
19 119 1
20 122 1
fonte
Respostas:
Pitão, 44 bytes
Experimente on-line: Demonstration or Test Suite
Um bug estúpido (?) Em Pyth arruinou uma solução de 41 bytes.
Explicação:
fonte
.f
. Aqui está a solicitação de recebimento que eu fiz por causa desta questão: github.com/isaacg1/pyth/pull/151CJam, 45 bytes
Experimente online!
Como funciona
fonte
Haskell, 174 bytes
p
verifica se uma lista é um palíndromo.x!y
éTrue
se as listasx
ey
(que devem ter o mesmo comprimento) diferem exatamente em dois lugares. Especificamente, sex
é uma permutação dey
,x!y
determina se é uma "troca".o n
encontra a ordem de Dennis den
. Ele filtra os swaps entre as permutações dex = show n
e depois conta quantos desses swaps são palíndromos. A compreensão da lista que realiza essa contagem tem uma proteção extranot (p x)
, o que significa que ela retornará0
sen
fosse um palíndromo para começar.O
snd (span (<'1') v)
bit é apenasdropWhile
um byte mais curto; isso se"01221"
transforma"1221"
.f
índices de uma lista de(i, o i)
ondeo i > 0
(ou seja,i
é um número de Dennis.) Normalmente, haveria um erro de um por um aqui, como(!!)
conta de 0, mas o problema conta de 1. Consegui remediar isso iniciando a pesquisa a partir de-10
(qual acabou sendo considerado um número de Dennis pelo meu programa!) empurrando todos os números para os pontos certos.f 774
é(12012,3)
.fonte
Python 2, 176
Não consigo imaginar que meu código de troca seja particularmente ideal, mas é o melhor que pude obter. Também não gosto da frequência com que converto entre string e número inteiro ...
Para cada número, ele cria uma lista de se todos os swaps de dois dígitos são palíndromos. Ele diminui o contador quando pelo menos um desses valores é verdadeiro e o número original não é um palíndromo. Uma vez que
0+True
em python avalia1
a soma da lista final, trabalha pela ordem do número de Dennis.fonte
Ferrugem, 390 bytes
O novo Java? : /
Ungolfed e comentou:
fonte
Gelatina , 33 bytes (não concorrente)
Experimente online!
Como funciona
fonte
APL, 87
O corpo do loop retorna um vetor de 4 números: 1) seu argumento esquerdo
⍺
lido da entrada, 2) contagem de números de Dennis até agora, 3) valor atual deX
- o contador de loop e 4) sua ordemK
calculada como soma dos palíndromos dentro de permutações de 1 swap. Ele termina quando os dois primeiros elementos se tornam iguais e os dois últimos são retornados como resultado.fonte
JavaScript (ES6), 229
Como de costume, o JavaScript brilha por sua inaptidão para combinações (ou, talvez seja a minha inaptidão ...). Aqui eu recebo todas as posições de swap possíveis, encontrando todos os números binários do comprimento especificado e apenas 2 conjuntos.
Teste a execução do snippet abaixo no Firefox (como o MSIE está longe de ser compatível com o EcmaScript 6 e o Chrome ainda não possui os parâmetros padrão)
fonte
awk, 199
Estrutura
Uso
Cole isso no seu console e substitua o número depois
echo
, se desejarFica lento em números mais altos;)
Versão reutilizável não destruída
fonte
Ruby, 156
Usa o recurso Ruby, em que a chamada
"19".next!
retorna"20"
para evitar a conversão de tipos; nós apenas usamos um regex para ignorar a liderança0s
. Repete todos os pares de posições das strings para verificar se há comutadores palindrômicos. Originalmente, escrevi isso como uma função recursiva, mas ela destrói a pilha.A saída para 774 é
["12012", 3]
(remover as aspas custaria mais 4 bytes, mas acho que a especificação permite).fonte