Placas Francesas
As placas francesas vêm em uma ordem seqüencial, seguindo um padrão específico de números e letras:AB-012-CD
Desafio
Escreva um programa ou função que, para um determinado número, emita o número correspondente da placa francesa . Seu programa não deve lidar com nenhum caso especial, conforme especificado na página vinculada. Ele deve ser capaz de gerar todas 26*26*1000*26*26 => 456 976 000
as placas possíveis, ou até onde seu idioma puder suportar.
O sistema de numeração é o seguinte:
- AA-000-AA a AA-999-AA (os números evoluem primeiro);
- AA-000-AB a AA-999-AZ (então a última letra à direita);
- AA-000-BA a AA-999-ZZ (então a primeira letra à direita);
- AB-000-AA a AZ-999-ZZ (então a última letra à esquerda);
- BA-000-AA a ZZ-999-ZZ (então a primeira letra à esquerda).
Entrada
- O índice do número da placa como um número inteiro
Saída
- O número correspondente da placa francesa
Informação adicional
- As letras devem estar em maiúsculas
- Você pode usar a indexação com base em 0 e com base em 1 para gerar as placas (o que significa que AA-000-AA pode corresponder
0
ou1
, supondo que todos os outros casos de teste usem a mesma indexação.
Este é o código-golfe , a resposta mais curta em todos os idiomas vence!
Casos de teste (indexação baseada em 0)
0 -> AA-000-AA
1 -> AA-001-AA
999 -> AA-999-AA
1000 -> AA-000-AB
675 999 -> AA-999-ZZ
676 000 -> AB-000-AA
456 975 999 -> ZZ-999-ZZ
Respostas:
Pure Bash (sem utilitários externos), 64
Experimente online! - leva cerca de 10 segundos para atropelar as 7 caixas de teste.
eval
é necessária para assegurar a expansão variável (de x) ocorre antes da expansão da cinta.fonte
Perl 5 (-ap), 47 bytes
Experimente online!
PHP , 74 bytes
Experimente online!
fonte
Python 3 ,
79 7877 bytesExperimente online!
De alguma forma, nunca percebi que o
f"string"
atalho de formato existe até ver a resposta de Black Owl Kai.fonte
tuple
por(*...,)
f"string"
torna sua resposta exclusiva do Python 3.6+, apenas para que você esteja ciente. Bom trabalho!Ruby,
615955 bytesTambém 55 bytes:
Experimente online!
Isso inicializa um contador para
AA-AA000-
, incrementa-on
vezes (multiplicando uma sequência do código que faz isso por n eeval
ing) e, em seguida, move os últimos 4 caracteres após o 3º.fonte
->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}
é mais longo, mas me pergunto se é possível reduzi-lo.->n{s=[*'AA-AA000-'..?Z*9][n];s[2]+=s.slice!5,4;s}
deve funcionar e tem apenas 50 bytes de comprimento, mas gera primeiro todas as placas possíveis. : - /PHP ,
968479 bytes-5 bytes graças aos ótimos comentários de Ismael Miguel .
Experimente online!
Aproveito o fato de que você pode incrementar letras em PHP! Assim
AAAA++
se tornariaAAAB
eAAAZ++
se tornariaAABA
. Calculo quantas vezes as letras precisam ser incrementadas, obtendo parte inteira deinput/1000
. Em seguida, aumente o comprimento dos quatro caracteres várias vezes e os dois primeiros e os dois últimos se tornarão automaticamente o lado esquerdo e direito da placa.Por exemplo, para a introdução do
675999
número de incrementos de letras é(int)(675999 / 1000) = 675
, assimAAAA
seráAAZZ
.Finalmente, o número do meio é calculado por
input%1000
e tudo é impresso no formato especificado com a ajuda de printf .%.2s
imprime os dois primeiros caracteres da string,%03u
preenche o número à esquerda com 3 zeros.fonte
%0.2s
você pode escrever%.2s
. Isso economiza 1 byte. (Como uma pequena dica: se você deseja gerar um número decimal com um número específico de casas decimais, poderá fazê-lo%.2f
(ou qualquer outro modificador), pois funciona da mesma maneira)0
. Edit: olhando as documentações, parece que eu nem precisava disso em primeiro lugar: P$x++^$argn/1e3
vez de$x++<(0^$argn/1e3)
e deve salvar 4 bytes. Isso fará um loop até($x++^$argn/1e3) === 0
, e é0
quando$x
e$argn/1e3
é o mesmo número inteiro (usando^
o converterá os números em número inteiro). Você pode tentar isso em sandbox.onlinephpfunctions.com/code/…C,
8886 bytesMuito simples, ele usa divisão e módulo para extrair os campos, adiciona 'A' para as letras para mapeá-los para caracteres ASCII e formatar printf para os números.
Experimente online!
fonte
Haskell,
85817977 bytesExperimente online!
fonte
05AB1E ,
252220 bytes-2 bytes (e aumentou o desempenho por não gerar a lista inteira) graças ao @Grimy .
Indexação baseada em 0.
Experimente online ou verifique todos os casos de teste .
Explicação:
A última parte (
s₄‰`UèX₄+¦'-.øý
) pode serI₄÷èI₄+3.£.ý'-ý
uma alternativa de bytes iguais:Experimente online ou verifique todos os casos de teste .
fonte
Au2ããI₄‰`UèX₄+¦'-.øý
ouAu2ããI₄÷èI₄+3.£'-.øý
.J ,
564946 bytesExperimente online!
-3 bytes graças ao FrownyFrog
A coisa toda não passa de sete trens aninhados - se isso não é divertido, o que é?
fonte
JavaScript (Node.js) , 82 bytes
Experimente online!
fonte
Ruby , 51 bytes
Experimente online!
fonte
R , 101 bytes
Experimente online!
Apenas faz os cálculos aritméticos necessários. Salvei 5 bytes incluindo no vetor
a
um valor inútil ema[4]
, permitindo-me reutilizar o vetor auxiliarb
.B
AB-012-CD
n
n %/% 676000 %% 26
%/%
%%
fonte
Geléia ,
2622 bytesUm link monádico que aceita um número inteiro (indexado a 1) que produz uma lista de caracteres ... Louco-devagar, pois constrói todas as placas primeiro!
Experimente online! (não será concluído)
Ou tente uma versão reduzida do alfabeto (apenas "ABC" para as letras).
Para o código que é concluído em tempo hábil, eis um programa completo de 32 bytes (indexado a 0) que cria a placa única em vez disso, usando descompressão modular aritmética e base numérica modular:
Tente este!
fonte
APL + WIN, 61 bytes
Solicita o número inteiro:
Experimente online! Cortesia de Dyalog Classic
fonte
Carvão , 33 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Digite o número.
Imprimir a
-
.Adicione 1000 ao número, depois converta o resultado em sequência e imprima os três últimos dígitos.
Divida o número por 1000 e adicione 26⁵, para que a conversão para a base personalizada usando o alfabeto maiúsculo resulte em uma sequência de comprimento 6, que é dividida em pares de letras.
Imprimir a
-
.Imprima o último par de letras.
Mover para o início da chapa de matrícula.
Imprima o restante das letras desejadas.
fonte
Perl 6 , 42 bytes
Experimente online!
Solução Perl 5 do Port of Grimy. Lento para grandes valores de entrada.
fonte
Excel,
183167155147 bytes-16 bytes graças a @Neil. (6 usando
E3
)-12 bytes graças a @Keeta. (em
TRUNC
vez deQUOTIENT
)-8 bytes graças a @ Jonathan Larouche (em
INT
vez deTRUNC
)Concatena 5 partes:
fonte
MOD(QUOTIENT(A1,1E3),26)
funciona? Além disso, por1E3
que1000
mas não26E3
etc?456 975 996
->[Z-996-ZZ
CHAR(65+)
silenciosamente trunca decimais até%.9999997614649
. Maior do que isso é arredondado para cima. CompareCHAR(65+24.9999997614649)
eCHAR(65+24.999999761465)
.Limpo , 107 bytes
Experimente online!
Define o
$ :: Int -> [Char]
fornecimento da n-ésima matrícula com zero índice.fonte
Japonês , 21 bytes
Obscenamente lento! Sério, nem tente executá-lo!
Ponta do chapéu para Kevin por me fazer perceber onde eu estava errado quando lutava para fazer isso funcionar ontem à noite.
Experimente - limita o intervalo de números a
000-005
.fonte
Quarto (gforth) , 94 bytes
Experimente online!
Indexado a 0. A entrada é obtida do topo da pilha
Explicação do código
fonte
q , 78 bytes
fonte
T-SQL, 135 bytes
fonte
Python 2 , 88 bytes
Experimente online!
fonte
Vermelho ,
130127 bytesExperimente online!
fonte
Python 3 , 89 bytes
Experimente online!
-1 byte graças a mypetlion
fonte
chr(x//26000%26+65)+chr(x//1000%26+65)
para'%c%c'%(x//26000%26+65,x//1000%26+65)
para salvar 1 byte.MATLAB , 113 bytes
Explicações:
A primeira linha define uma função que produzirá um char (de
A
aZ
), função de 2 entradas. O número do índicex
a ser convertido em um número de placa e um número inteirop
que será usado como expoente para 26 (ou seja26^p
). Esta segunda entrada permite ajustar os cálculos do primeiro dígito alfanumérico da placa (p=3
) até o último (p=0
).Por exemplo, para o segundo dígito, ciclado a cada 1000 * 26 * 26 iterações, a operação:
mod(idivide(x,1000*26^2),26)
retorna um índice entre 0 e 25, que é então convertido em um ASCIIchar
adicionando 65 (porque o índice é0
baseado)A segunda linha simplesmente concatena os caracteres. Cada caractere alfanumérico é calculado com o uso da função
c(x,p)
, o caractere numérico é simplesmente calculado com umamodulo
operação e convertido em string.Cada componente da corda que compõe o número da placa é o seguinte:
Como não posso permitir que você experimente o MATLAB online ( edit: na verdade, você pode experimentá-lo online ), permitirei aos usuários do MATLAB a possibilidade de verificar os casos de teste:
saídas:
Variante: observe que a opção de permitir
sprintf
oufprintf
cuidar da conversão de número em caracteres é possível. Permite simplificar a funçãoc
, mas no geral resulta em mais alguns bytes nesta implementação (119 bytes):fonte
C (gcc) ,
136106105 bytesExperimente online!
-7 bytes de celingcat da solução , com adicional -23 inspirado por ela
-1 byte da solução do roofcat, alterando o
char[]
para uma conversãowchar_t[]
implicitamente paraint[]
Usa indexação baseada em 0.
Explicação / Sem Golfe:
fonte
a
eb
da macro e desceu para 106 bytesJulia 1.0 , 86 bytes
Experimente online!
fonte
Kotlin , 93 bytes
Experimente online!
fonte
Python 3 , 161 bytes
Experimente online!
fonte