> 1
> Input
>> 1…2
>> L!
>> L+1
>> L∣2
>> L⋅R
>> 2%L
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
> {0}
>> 12∖13
>> Each 8 14
>> L≠1
>> Each 16 15
>> Each 7 17 15
>> 18∖13
>> [19]
>> 2’
>> 21⋅20
>> Output 22
Pruébalo en línea!
Esto devuelve una lista vacía para números primos que no son Pillai, y una lista no vacía de lo contrario.
Cómo funciona
Whispers fue diseñado para la manipulación de números reales / complejos, con un poco de comandos de matriz agregados para una buena medida, de ahí el uso repetido de Each
iterar sobre las listas generadas.
Un poco de historia sobre Whispers:
Whispers es ligeramente diferente en su ruta de ejecución a la mayoría de los otros idiomas. En lugar de trabajar a través de cada línea linealmente, solo ramificándose en condicionales, Whispers comienza en la última línea del archivo que comienza con >
(las reglas son un poco más complicadas que eso, pero eso es todo lo que necesitamos saber por ahora), y el significado de los números difieren, dependiendo de si la línea comienza con >
o >>
.
Si la línea comienza con >
, como > 1
o > Input
, esta es una línea constante : devuelve el mismo valor cada vez. Aquí, los números representan su forma numérica, por lo que la primera línea siempre devolverá 1 cuando se llame.
>>
Sin embargo, si la línea comienza con , los números se tratan como referencias a otras líneas, más o menos como llamadas a funciones, si lo desea. Por ejemplo, en la línea >> 1…2
, esto no ejecuta el …
comando en los enteros 1 y 2 , sino en los valores devueltos por las líneas 1 y 2 . En este caso, esos valores son el número entero 1 y cualquier entero que se nos pase como entrada.
Para este ejemplo, consideremos la entrada de 23 . Tenga en cuenta que, debido al preprocesamiento de Whispers, la segunda línea ( > Input
) se convierte a> 23
.
Nuestro primer comando está en la línea 3: >> 1…2
. …
es un rango diádico, en este caso de 1 a 23 , produciendo {1, 2, ... 22, 23} . A continuación, saltamos a las líneas 9 a 12 :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Aquí tenemos 4 Each
enunciados consecutivos , cada uno de los cuales itera sobre el resultado anterior, esencialmente mapeando los 4 comandos sobre la matriz en la línea 3 : el rango. Las primeras tres declaraciones son mapas simples, con líneas 4 , 5 y 6 :
>> L!
>> L+1
>> L∣2
Estos tres comandos, sobre un número entero n , producen (n! +1) ∣x , donde ! denota factorial , ∣ denota divisibilidad y x es la entrada. Finalmente, la línea 12 tiene una estructura de mapa diádico .
Una estructura de mapa diádico toma tres enteros: el objetivo, el izquierdo y el derecho, cada uno indexa a otras líneas. Aquí, comprimimos la izquierda y la derecha para producir una lista de pares, luego reducimos cada par mediante el comando diádico (el objetivo). Aquí, si la entrada es 23 , las listas son {1, 2, ... 22, 23} y {0, 0, ... 1, 0} y el comando es
>> L⋅R
que multiplica el argumento izquierdo por el derecho. Esto produce una matriz de enteros, con 0 en los índices de enteros cuyos factoriales incrementados no son divisibles por las entradas, y el índice original donde están. Vamos a llamar a esta matriz A . A continuación, eliminamos los 0 s de A tomando la diferencia establecida entre {0} y A :
> {0}
>> 12∖13
Con nuestro ejemplo de entrada, esto produce el conjunto {14, 18, 22} . A continuación, tomamos el resto de la entrada que se divide por cada valor en el conjunto, y verificamos si ese resto no es igual a 1 :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Nuevamente, tenemos una lista de 0 o 1 sy necesitamos eliminar los 0 sy reemplazar los 1 s con los valores originales. Aquí repetimos el código que vimos arriba, pero con >> 18∖13
más que con 12
. Finalmente, lanzamos este conjunto resultante a una lista para una verificación final. Desafortunadamente, nuestro código también debe rechazar números compuestos que cumplan con todos estos criterios, como 437 . Entonces agregamos nuestra verificación final, multiplicando nuestra lista final por la primalidad de la entrada. Debido a cómo funciona la multiplicación de Python en las listas, 0 la reemplaza con una lista vacía y 1 no tiene ningún efecto. Entonces calculamos la primalidad de la entrada, multiplicamos eso por la lista de m s para la entrada y salida del resultado final:
>> 2’
>> 21⋅20
>> Output 22