Placas francesas
Las placas francesas vienen en orden secuencial, siguiendo un patrón específico de números y letras:AB-012-CD
Reto
Escriba un programa o función que, para un número dado, muestre el número de matrícula francés correspondiente . Su programa no debe manejar ningún caso especial como se especifica en la página vinculada. Debería ser capaz de generar todas 26*26*1000*26*26 => 456 976 000
las placas posibles, o en la medida en que su idioma lo permita.
El sistema de numeración es el siguiente:
- AA-000-AA a AA-999-AA (los números evolucionan primero);
- AA-000-AB a AA-999-AZ (luego la última letra a la derecha);
- AA-000-BA a AA-999-ZZ (luego la primera letra a la derecha);
- AB-000-AA a AZ-999-ZZ (luego la última letra a la izquierda);
- BA-000-AA a ZZ-999-ZZ (luego la primera letra a la izquierda).
Entrada
- El índice del número de placa como un entero
Salida
- El número de matrícula francés correspondiente
Información Adicional
- Las letras deben ser mayúsculas
- Puede utilizar la indexación tanto base 0 y basados en 1 para generar las placas (es decir, AA-000-AA puede corresponder a
0
o1
, suponiendo que todos los demás casos de prueba utilizan la misma indexación.
Este es el código de golf , ¡la respuesta más corta en todos los idiomas gana!
Casos de prueba (indexación basada en 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
Respuestas:
Pure Bash (sin utilidades externas), 64
Pruébalo en línea! - tarda unos 10 segundos en pasar por las 7 cajas de prueba.
eval
requiere para garantizar que se produzca una expansión variable (de x) antes de la expansión de la llave.fuente
Perl 5 (-ap), 47 bytes
Pruébalo en línea!
PHP , 74 bytes
Pruébalo en línea!
fuente
Python 3 ,
79 7877 bytesPruébalo en línea!
De alguna manera, nunca me di cuenta de que el
f"string"
atajo de formato existe hasta que vi la respuesta de Black Owl Kai.fuente
tuple
por(*...,)
f"string"
hace que su respuesta sea exclusiva de Python 3.6+, para que lo sepa. Buen trabajo sin embargo!Ruby,
615955 bytesTambién 55 bytes:
Pruébalo en línea!
Esto inicializa un contador
AA-AA000-
, lo incrementan
por multiplicado (multiplicando una cadena del código que lo hace por n eeval
ing), y luego mueve los últimos 4 caracteres después del 3º.fuente
->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}
es más largo pero me pregunto si es posible acortarlo.->n{s=[*'AA-AA000-'..?Z*9][n];s[2]+=s.slice!5,4;s}
debería funcionar y tiene solo 50 bytes de longitud, pero genera primero todas las placas posibles. : - /PHP ,
968479 bytes-5 bytes gracias a los grandes comentarios de Ismael Miguel .
Pruébalo en línea!
¡Aprovecho el hecho de que puedes incrementar letras en PHP! Entonces
AAAA++
se volveríaAAAB
yAAAZ++
se volveríaAABA
. Calculo cuántas veces deben incrementarse las letras obteniendo una parte enterainput/1000
. Luego incremente la longitud de cuatro caracteres muchas veces y sus primeros dos y últimos dos caracteres se convertirán automáticamente en el lado izquierdo y derecho de la placa.Por ejemplo, para la entrada del
675999
número de incrementos de letras es(int)(675999 / 1000) = 675
, asíAAAA
seráAAZZ
.Finalmente, se calcula el número del medio
input%1000
y todo se imprime en el formato especificado con la ayuda de printf .%.2s
imprime los dos primeros caracteres de la cadena,%03u
rellena el número de la izquierda con 3 ceros.fuente
%0.2s
ti puedes escribir%.2s
. Eso te ahorra 1 byte. (Como un pequeño consejo: si desea generar un número decimal con un número específico de lugares decimales, puede hacerlo%.2f
(o cualquier otro modificador) ya que funciona de la misma manera)0
. Editar: mirando las documentaciones, parece que ni siquiera lo necesitaba en primer lugar: P$x++^$argn/1e3
lugar de$x++<(0^$argn/1e3)
y debe guardar 4 bytes. Esto se repetirá hasta($x++^$argn/1e3) === 0
, y es0
cuando$x
y$argn/1e3
son el mismo número entero (el uso^
convertirá los números a entero). Puede probar esto en sandbox.onlinephpfunctions.com/code/…C,
8886 bytesBastante simple, utiliza la división y el módulo para extraer los campos, agrega 'A' para las letras para mapearlos con caracteres ASCII e imprime el formato para los números.
Pruébalo en línea!
fuente
Haskell,
85817977 bytesPruébalo en línea!
fuente
05AB1E ,
252220 bytes-2 bytes (y aumentó el rendimiento al no generar la lista completa) gracias a @Grimy .
Indexación basada en 0.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
La última parte (
s₄‰`UèX₄+¦'-.øý
) podría serI₄÷èI₄+3.£.ý'-ý
para una alternativa de bytes iguales:Pruébelo en línea o verifique todos los casos de prueba .
fuente
Au2ããI₄‰`UèX₄+¦'-.øý
oAu2ããI₄÷èI₄+3.£'-.øý
.J ,
564946 bytesPruébalo en línea!
-3 bytes gracias a FrownyFrog
Todo esto no es más que 7 trenes anidados; si eso no es divertido, ¿qué es?
fuente
JavaScript (Node.js) , 82 bytes
Pruébalo en línea!
fuente
Ruby , 51 bytes
Pruébalo en línea!
fuente
R , 101 bytes
Pruébalo en línea!
Solo hace los cálculos aritméticos necesarios. Ahorré 5 bytes al incluir en el vector
a
un valor inútil ena[4]
, lo que me permite reutilizar el vector auxiliarb
.B
AB-012-CD
n
n %/% 676000 %% 26
%/%
%%
fuente
Jalea ,
2622 bytesUn enlace monádico que acepta un número entero (1 indexado) que produce una lista de caracteres ... ¡Loco-lento ya que construye todas las placas primero!
Pruébalo en línea! (no se completará)
O pruebe con una versión reducida del alfabeto (solo "ABC" para las letras).
Para el código que se completa de manera oportuna, aquí hay un programa completo de 32 bytes (indexado 0) que crea la placa única en su lugar usando aritmética modular y descompresión de base numérica:
Prueba este!
fuente
APL + WIN, 61 bytes
Solicitudes de entero:
Pruébalo en línea! Cortesía de Dyalog Classic.
fuente
Carbón , 33 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Ingrese el número.
Imprimir a
-
.Agregue 1000 al número, luego arroje el resultado a una cadena e imprima los últimos tres dígitos.
Divida el número entre 1000, luego agregue 26⁵, de modo que la conversión a una base personalizada usando el alfabeto en mayúscula resulte en una cadena de longitud 6, que luego se divide en pares de letras.
Imprimir a
-
.Imprime el último par de letras.
Avanzar al comienzo de la matrícula.
Imprime el resto de las letras deseadas.
fuente
Perl 6 , 42 bytes
Pruébalo en línea!
Puerto de la solución Perl 5 de Grimy. Lento para valores de entrada grandes.
fuente
Excel,
183167155147 bytes-16 bytes gracias a @Neil. (6 usando
E3
)-12 bytes gracias a @Keeta. (en
TRUNC
lugar deQUOTIENT
)-8 bytes gracias a @Jonathan Larouche (en
INT
lugar deTRUNC
)Concatena 5 partes:
fuente
MOD(QUOTIENT(A1,1E3),26)
funciona Además, ¿1E3
por qué,1000
pero no,26E3
etc.?456 975 996
->[Z-996-ZZ
CHAR(65+)
trunca silenciosamente los decimales hasta%.9999997614649
. Más grande que eso se redondea. ComparaCHAR(65+24.9999997614649)
yCHAR(65+24.999999761465)
.Limpio , 107 bytes
Pruébalo en línea!
Define
$ :: Int -> [Char]
dar la n-ésima placa con índice cero.fuente
Japt , 21 bytes
Obscenamente lento! En serio, ¡ni siquiera intentes ejecutarlo!
Punta del sombrero para Kevin por hacerme darme cuenta de dónde me estaba equivocando cuando luché para que esto funcionara anoche.
Pruébelo : limita el rango de números a
000-005
.fuente
Adelante (gforth) , 94 bytes
Pruébalo en línea!
0 indexado. La entrada se toma desde la parte superior de la pila
Explicación del código
fuente
q , 78 bytes
fuente
T-SQL, 135 bytes
fuente
Python 2 , 88 bytes
Pruébalo en línea!
fuente
Rojas ,
130127 bytesPruébalo en línea!
fuente
Python 3 , 89 bytes
Pruébalo en línea!
-1 byte gracias a mypetlion
fuente
chr(x//26000%26+65)+chr(x//1000%26+65)
a'%c%c'%(x//26000%26+65,x//1000%26+65)
para guardar 1 byte.MATLAB , 113 bytes
Explicaciones:
La primera línea define una función que producirá una función char (de
A
aZ
), de 2 entradas. El número de índicex
para convertir en un número de placa y un número enterop
que se utilizará como exponente para 26 (es decir26^p
). Esta segunda entrada permite ajustar los cálculos para el primer dígito alfanumérico de la placa (p=3
) hasta el último (p=0
).Por ejemplo, para el segundo dígito, ciclado cada 1000 * 26 * 26 iteraciones, la operación:
mod(idivide(x,1000*26^2),26)
devuelve un índice entre 0 y 25, que luego se convierte en un ASCIIchar
agregando 65 (porque el índice está0
basado)La segunda línea simplemente concatena caracteres juntos. Cada carácter alfanumérico se calcula con el uso de la función
c(x,p)
, los caracteres numéricos simplemente se calculan con unamodulo
operación y se convierten en una cadena.Cada componente de la cadena que compone el número de placa es el siguiente:
Como no puedo dejar que pruebes MATLAB en línea ( editar: en realidad puedes probarlo en línea ), dejaré a los usuarios de MATLAB la posibilidad de verificar los casos de prueba:
salidas:
Variante: tenga en cuenta que es posible la opción de permitir
sprintf
ofprintf
cuidar la conversión de números a caracteres. Permite simplificar la funciónc
, pero en general da como resultado unos pocos bytes más en esta implementación (119 bytes):fuente
C (gcc) ,
136106105 bytesPruébalo en línea!
-7 bytes desde celingcat 's solución , con adicional -23 inspirado por ella
-1 byte de la solución de ceilingcat cambiando el
char[]
a unwchar_t[]
molde implícito aint[]
Utiliza indexación basada en 0.
Explicación / Ungolfed:
fuente
a
b
Julia 1.0 , 86 bytes
Pruébalo en línea!
fuente
Kotlin , 93 bytes
Pruébalo en línea!
fuente
Python 3 , 161 bytes
Pruébalo en línea!
fuente