A tarefa
Nesse desafio, sua tarefa é escrever um programa em uma linguagem de programação L que recebe um número inteiro positivo n e gera a soma dos divisores adequados de n ( sequência A001065 no OEIS). Ele deve retornar a saída correta para qualquer 1 ≤ n ≤ 10 000 . Aqui estão as 10 primeiras saídas:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
Além disso, seu programa deve ser um poliglota falso , o que significa o seguinte. É um programa válido em outra linguagem de programação L ' e, para cada entrada 1 ≤ n ≤ 10 (os casos de teste acima), retorna a soma dos divisores adequados de n , mas existem 11 ≤ n ≤ 10 000 para os quais não retorna o resultado correto. Pode retornar algo incorreto, repetir para sempre, travar etc. Pode dar um resultado errado para todos os n ≥ 11 , para alguns deles ou apenas um.
Regras e pontuação
Você pode escrever um programa ou uma função completa e pode ter diferentes meios de entrada e saída nos dois idiomas. A menor contagem de bytes vence. PadrãoAplicam-se as regras código de golfe . Nesse desafio, diferentes versões principais ou implementações de uma linguagem são consideradas distintas.
Observe que, se você usar linguagens de programação com codificações não ASCII (como muitas fazem neste site), a mesma sequência de bytes deverá ser usada para ambas as linguagens. Isso significa que você deve converter entre páginas de códigos potencialmente diferentes ou sofrer penalidades por caracteres Unicode de vários bytes.
Casos de teste adicionais
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 e Python 3, 58 bytes
TIO para Python 2
TIO para Python 3
Ele funciona no python 2, mas para cada n> 10 ele produziria 0 no python 3.
Tudo devido a diferentes abordagens na comparação de strings com bytes:
'' == b''
'' != b''
fonte
JavaScript (Node.js) e PHP ,
7370 bytesNos dois idiomas, essa é uma função anônima. JavaScript fornece o resultado correto, mas o PHP fornece 0 para todos n> = 11 .
Experimente JS!
Experimente o PHP!
Como funciona
Os dois idiomas fazem o mesmo no início: itere de 1 a n-1, mantendo uma soma contínua de todos os números i para os quais n% i = 0 .
O que causa a diferença de comportamento é a parte final:
Em JavaScript,
"$n"
é apenas uma string literal. A comparação>
com o10
lança para um número implicitamente, mas como não se parece com um número, torna-se NaN. NaN fornece false quando comparado a um número de qualquer forma. Como resultado,$d
é sempre retornado.No entanto, no PHP,
"$n"
é uma sequência que contém o valor de$n
. Quando o PHP lança isso em um número, ele simplesmente se torna o valor de$n
. Se for maior que10
,0
será retornado em vez de$d
.fonte
05AB1E / Jelly ,
98 bytesO código de bytes (hexadecimal):
O uso da página de códigos de Jelly retorna resultados incorretos para qualquer número excessivo (por exemplo, uma entrada de 12 retornos em
12
vez de16
):Experimente online!
O uso da página de códigos do 05AB1E retorna resultados corretos:
Experimente online!
Quão?
05AB1E analisa até e incluindo o
71
(q
) que instrui para sair e, em seguida, para de analisar:O Jelly analisa o programa inteiro antecipadamente como três links, devido ao efeito dos bytes sem um significado atribuído,
ƭ
eq
atuando como delimitadores. O ponto de entrada de um programa é o link final:fonte
ÆḌSD
salva um byte.ÆḌSṚ
.Python 3 / Python 2 ,
646058 bytesObrigado a @officialaimm por 2 bytes de desconto
No Python 3, isso fornece os resultados corretos. No Python 2, a saída está errada para entradas que excedem
10
. O código explora o arredondamento do banqueiro, que é feito pelo Python 3, mas não pelo Python 2.Experimente online! Python 3 (correto), Python 2 (errado para
n > 10
).fonte
[ ]
.Python 3 / Python 2 , 47 bytes
Uma função sem nome, falsa no Python 2.
Experimente on-line para Python 3 ou Python 2
No Python 2
/
é uma divisão inteira com argumentos inteiros, enquanto no Python 3 é uma divisão.Quando
n
excede 10, é10/n
avaliado em 0 no Python 2, mas em um pequeno número positivo no Python 3 (isso certamente é verdade até o máximo exigido de 10.000, no mínimo).Como tal,
10/n>0
avaliaTrue
para o Python 3 erange(10/n>0,n)
é equivalente arange(1,n)
enquanto no Python 210/n>0
avaliaFalse
quandon
excede 10, quandorange(10/n>0,n)
se torna equivalente arange(0,n)
causarn%d
a tentativa de executar a aritmética do módulo zero, aumentando aZeroDivisionError
.fonte
Jelly / 05AB1E , 12 bytes
O que Jelly vê:
Experimente online!
Explicação:
q
não é suportado no Jelly, portanto, o Jelly apenas "vê" o que está depois doq
.O que 05AB1E vê:
Experimente online!
Explicação:
É claro que tudo depois de "sair" não acontece realmente.
fonte
ÆḌS
que tivesse sido válido por si só ... Resposta extraordinária!мλS
funcionaria no 05AB1E.