> 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
Experimente online!
Isso retorna uma lista vazia para números primos não Pillai e uma lista não vazia caso contrário.
Como funciona
O Whispers foi projetado para manipulação em números reais / complexos, com um pouco de comandos de matriz adicionados para uma boa medida, daí o uso repetido de Each
para iterar nas listas geradas.
Um pouco de experiência no Whispers:
O Whispers é um pouco diferente no caminho de execução para a maioria dos outros idiomas. Em vez de trabalhar linearmente cada linha, apenas ramificando-se em condicionais, o Whispers começa na última linha do arquivo começando com >
(as regras são um pouco mais complicadas que isso, mas é tudo o que precisamos saber por enquanto) e os significados dos números diferem, dependendo se a linha começa com >
ou >>
.
Se a linha começar com >
, como > 1
ou > Input
, essa é uma linha constante - ela retornará o mesmo valor todas as vezes. Aqui, os números representam sua forma numérica; portanto, a primeira linha sempre retornará 1 quando chamada.
Se a linha começar, no >>
entanto, os números serão tratados como referências a outras linhas, como chamadas de função, se você desejar. Por exemplo, na linha >> 1…2
, isso não executa o …
comando nos números inteiros 1 e 2 , mas nos valores retornados das linhas 1 e 2 . Nesse caso, esses valores são o número inteiro 1 e qualquer número inteiro que passamos como entrada.
Neste exemplo, vamos considerar a entrada 23 . Lembre-se de que, devido ao pré-processamento do Whispers, a segunda linha ( > Input
) é convertida em > 23
.
Nosso primeiro comando é na linha 3: >> 1…2
. …
é o intervalo diádico, neste caso de 1 a 23 , resultando em {1, 2, ... 22, 23} . Em seguida, pulamos para as linhas 9 a 12 :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Aqui temos quatro Each
instruções consectutivas , cada uma das quais itera sobre o resultado anterior, mapeando essencialmente os 4 comandos sobre a matriz na linha 3 : o intervalo. As três primeiras instruções são mapas simples, com as linhas 4 , 5 e 6 :
>> L!
>> L+1
>> L∣2
Esses três comandos, sobre um número inteiro n , produz (n! +1) ∣x , onde ! denota factorial , | denota divisbility e x é a entrada. Finalmente, a linha 12 possui uma estrutura de mapa diádico .
Uma estrutura de mapa diádico leva três números inteiros: o alvo, a esquerda e a direita, cada um indexa para outras linhas. Aqui, fechamos a esquerda e a direita para produzir uma lista de pares e depois reduzimos cada par pelo comando diádico (o destino). Aqui, se a entrada for 23 , as listas são {1, 2, ... 22, 23} e {0, 0, ... 1, 0} e o comando é
>> L⋅R
que multiplica o argumento da esquerda pela direita. Isso produz uma matriz de números inteiros, com 0 nos índices de números inteiros cujos fatoriais incrementados não são divisíveis pelas entradas e o índice original onde eles estão. Vamos chamar essa matriz A . Em seguida, vamos remover os 0 s de A , tendo a diferença de conjunto entre {0} e A :
> {0}
>> 12∖13
Com nosso exemplo de entrada, isso produz o conjunto {14, 18, 22} . A seguir, pegamos o restante da entrada sendo dividido por cada valor no conjunto e verificamos se esse restante não é igual a 1 :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Novamente, temos uma lista de 0 ou 1 se precisamos remover os 0 se substituir os 1 pelos valores originais. Aqui repetimos o código que vimos acima, mas com um >> 18∖13
pouco do que 12
. Por fim, lançamos esse conjunto resultante em uma lista para uma verificação final. Infelizmente, nosso código também deve rejeitar números compostos que atendem a todos esses critérios, como 437 . Portanto, adicionamos nossa verificação final, multiplicando nossa lista final pela primalidade da entrada. Devido à forma como a multiplicação do Python funciona nas listas, 0 o substitui por uma lista vazia e 1 não tem efeito. Então calculamos a primalidade da entrada, multiplique isso pela lista de ms para a entrada e saída do resultado final:
>> 2’
>> 21⋅20
>> Output 22