Nota: Esto se inspira en esta pregunta de @Willbeing, donde la tarea consistía en contar el número de platos perfectos de cierta longitud, pero es ligeramente diferente.
Llamamos a una placa perfecta aquella placa cuyo texto cumple las siguientes condiciones:
- Se compone de caracteres, que pueden ser letras mayúsculas (
[A-Z]
) o dígitos ([0-9]
) - Sumando las posiciones de sus letras en el alfabeto inglés, 1 indexado (es decir:)
A=1,B=2,...,Z=26
da un número entero n - Obtener cada trozo de dígitos, sumarlos y luego multiplicar todos los resultados da el mismo resultado, n
- n es un cuadrado perfecto (por ejemplo:
49
(7 2 ) ,16
(4 2 ) )
Una matrícula casi perfecta cumple las condiciones para una matrícula perfecta, excepto que n no es un cuadrado perfecto.
Entrada
Una cadena que representa el texto de la matrícula, tomada como entrada en cualquier forma estándar, excepto para la codificación fija.
Salida
Si la cadena dada representa una placa casi perfecta , devuelva un valor verdadero (por ejemplo: True
/ 1
), de lo contrario, devuelva un valor falso (por ejemplo: False
/ 0
). Se acepta cualquier forma estándar de salida al tomar nota de que estas lagunas están estrictamente prohibidas.
Ejemplos
licence plate -> output
A1B2C3 -> 1
A + B + C = 1 + 2 + 3 = 6
1 * 2 * 3 = 6
6 is not a perfect square, 6 = 6 => nearly perfect plate
01G61 -> 1
(0 + 1) * (6 + 1) = 7
G = 7
7 is not a perfect square, 7 = 7 => nearly perfect plate
11BB2 -> 0
(1 + 1) * 2 = 4
B + B = 2 + 2 = 4
4 = 4, but 4 is the square of 2 => perfect license plate (not what we want)
67FF1 -> 0
(6 + 7) * 1 = 13
F + F = 6 + 6 = 12
12 != 13 => not perfect at all!
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
fuente
n
es un cuadrado perfecto?s/licence/license/ig
esto, tenga en cuenta que "licencia" es la ortografía correcta en inglés británico (así como en inglés en otras partes del mundo).Respuestas:
Jalea ,
29 2830 bytes1 byte para corregir un error descubierto por ChristianSievers (incorrectamente tratar con subcadenas de sólo ceros) 1 byte para fijar los falsos positivos para
"0"
,"00"
, ... encuentra durante la fijación anterior (0 es un cuadrado perfecto).Pruébalo en línea! o ejecutar pruebas
¿Cómo?
fuente
11AA0
?MATL,
36343335 bytesPruébalo en MATL Online
Explicación
fuente
'0'
o'00'
(FWIW, también lo arreglé en mi código).Python 2,
120118 bytesPruébalo en línea!
Interpreta cada personaje como un número en base-36 (
h
). Convierte a decimal y agrega a la suma ifh>9
(lo que significa que es una letra), de lo contrario agrega a una variable que se multiplica para formar el producto en ejecución más tarde.fuente
Perl 5 , 80 bytes
79 bytes de código +
-p
bandera.Pruébalo en línea!
$.*=eval s/./+$&/gr for/\d+/g;
multiplica las sumas de dígitos consecutivos. (Estoy usando$.
porque su valor inicial es1
, lo que significa que es el elemento neutral para la multiplicación). Más precisamente, para cada porción de dígitos (for/\d+/g
),s/./+$&/gr
coloca un+
antes de cada dígito, luego la cadena se mideeval
y se multiplica con el producto actual.En segundo lugar,
$t-=64-ord for/\pl/g;
sumas en$t
cada letra (for/\pl/g
). (ord
devuelve el código ascii para la letra, y64-..
hace que esté entre 1 y 26.Finalmente,
$.==$t
comprueba que ambos valores son iguales y($.**.5|0)**2!=$.
que no es ni un cuadrado perfecto.fuente
Python 2,
267207 bytesGuardado 60 bytes gracias a ovs
Función con uso:
print(g('A1B2C3'))
Pruébalo en línea!
fuente
Python 3 ,
163 156 155 164161 bytesPruébalo en línea!
fuente
from math import*
es más cortoa
, solo usafor x in input():
. Puede tener falsos positivos para las placas que terminan con una cadena de ceros (por ejemplo11AA00
), ya que el finalm*=t
no se ejecuta.Retina, 143 bytes
Devuelve 1 para verdadero, 0 para falso
Pruébalo en línea!
Explicación:
Primero, reemplazamos todos los dígitos distintos de cero con su representación unaria. Eliminamos los ceros con un dígito adyacente para que no afecten nuestras operaciones unarias.
Divida la cadena resultante en letras, teniendo cuidado de excluir líneas vacías (esto es un problema cuando dos letras son consecutivas
AA
).Ordenar la cadena lexicográficamente. Luego, haga lo siguiente repetidamente:
1) Reemplace cada uno
1
con el número de1
s en la siguiente línea (esto imita la multiplicación)2) Eliminar la segunda línea de
1
sReemplazar las letras
J-S
con1J
,1K
, etc., y reemplazar las letrasT-Z
con2T
,2U
, etc. A continuación, vuelva a colocar cada uno de los gruposA-I
,J-S
yT-Z
con1-9
. Nos quedaremos con el valor numérico de cada letra (por ejemplo,13
paraM
).Convierta cada línea menos la primera en unaria (la primera línea ya está en unaria). Concatenar estas líneas. Ahora nos queda una cadena del formulario
<product of digits>\n<sum of letters>
.Reemplace un número cuadrado con la cadena vacía. Esto utiliza el método del "árbol de diferencias" .
Regrese
1
si las dos cuerdas a cada lado del\n
partido. De lo contrario, regrese0
.fuente
11AA0
,0AA11
etc.