Dado um número inteiro positivo como entrada, sua tarefa é gerar um valor verdadeiro se o número for divisível pelo dobro da soma de seus dígitos e, caso contrário, um valor falso ( OEIS A134516 ). Em outras palavras:
(sum_of_digits)*2 | number
Em vez de valores verdadeiros / falsos para os casos verdadeiros e falsos, você pode especificar qualquer conjunto finito de valores para o caso verdadeiro / falso, e eles complementam os outros valores. Para um exemplo simples, você pode usar
0
para o caso verdadeiro e todos os outros números para o caso falso (ou vice-versa, se desejar).Regras de entrada e saída padrão se aplicam. As brechas padrão também se aplicam.
Você pode receber a entrada como um número inteiro ou como a representação de sequência desse número inteiro.
Este é o código-golfe , portanto o código mais curto em bytes vence!
Eu sou novo no PPCG, então gostaria que você publicasse uma explicação, se possível.
Casos de teste
Entrada - Saída - (Razão) 80 - Verdade - (16 divide 80) 100 - Verdade - (2 divide 100) 60 - Verdade - (12 divide 60) 18 - Verdade - (18 divide 18) 12 - Verdade - (6 divide 12) 4 - Falsia - (8 não divide 4) 8 - Falsia - (16 não divide 8) 16 - Falsia - (14 não divide 16) 21 - Falsia - (6 não divide 21) 78 - Falsy - (30 não divide 78) 110 - Falsy - (4 não aparece 110) 111 - Falsy - (6 não divide 111) 390 - Falsy - (24 não divide 390)
Respostas:
Neim , 3 bytes
Explicação:
Experimente online!
Versão detalhada
fonte
JavaScript (ES6),
312927 bytesRecebe a entrada como uma sequência. Retorna zero para verdade e diferente de zero para falsidade.
Comentado
Casos de teste
Mostrar snippet de código
fonte
C #, 46 bytes
Versão completa / formatada:
fonte
Retina ,
3827 bytes-11 bytes e corrigiu um erro no código graças a @MartinEnder
Experimente online!
Imprime 1 se divisível, 0 caso contrário
Explicação (espero que eu entendi direito)
Anexa toda a entrada, mais uma nova linha, mais a entrada novamente
Converte cada correspondência em unária (a segunda linha inteira que é a entrada original ou cada dígito na primeira linha)
Verifique se a primeira linha (a soma de dois dígitos) é um divisor da segunda linha
fonte
MATL , 7 bytes
Saída
0
se divisível, número inteiro positivo caso contrário. Especificamente, ele gera o restante da divisão do número pelo dobro da soma de seus dígitos.Experimente online!
Explicação
fonte
05AB1E ,
54 bytes-1 byte graças a Okx
Experimente online!
Você também pode remover o último Ö para obter 0 para verdade e outra coisa para falsidade, resultando em apenas 3 bytes, mas para mim isso parece não se encaixar adequadamente na definição.
Explicação
fonte
%_
porÖ
.Código da máquina x86-64, 24 bytes
O código acima define uma função no código de máquina x86 de 64 bits que determina se o valor de entrada é divisível pelo dobro da soma de seus dígitos. A função está em conformidade com a convenção de chamada do System V AMD64, para que possa ser chamada de praticamente qualquer idioma, como se fosse uma função C.
Ele usa um único parâmetro como entrada via
EDI
registrador, conforme a convenção de chamada, que é o número inteiro a ser testado. (Supõe-se que seja um número inteiro positivo , consistente com as regras de desafio e é necessário para que asCDQ
instruções que usamos funcionem corretamente.)Retorna seu resultado no
EAX
registro, novamente, conforme a convenção de chamada. O resultado será 0 se o valor de entrada for divisível pela soma de seus dígitos e diferente de zero. (Basicamente, um booleano inverso, exatamente como o exemplo dado nas regras de desafio.)Seu protótipo C seria:
Aqui estão as instruções da linguagem assembly não destruídas, anotadas com uma breve explicação do objetivo de cada instrução:
No primeiro bloco, fazemos algumas inicializações preliminares dos registros:
PUSH
AsPOP
instruções + são usadas como uma maneira lenta, mas curta, de inicializarESI
para 10. Isso é necessário porque aDIV
instrução em x86 requer um operando de registro. (Não existe uma forma que divida por um valor imediato de, digamos, 10.)XOR
é usado como uma maneira curta e rápida de limpar oECX
registro. Este registro servirá como o "acumulador" dentro do próximo loop.EDI
) é feita e armazenadaEAX
, que será eliminada à medida que avançamos no loop.Então, começamos a repetir e somar os dígitos no valor de entrada. Isso se baseia na
DIV
instrução x86 , que divideEDX:EAX
por seu operando e retorna o quociente inEAX
e o restante inEDX
. O que faremos aqui é dividir o valor de entrada por 10, de modo que o restante seja o dígito em último lugar (que adicionaremos ao nosso registro acumuladorECX
), e o quociente é o restante.CDQ
instrução é uma maneira curta de definirEDX
como 0. Na verdade , ela estende o valorEAX
paraEDX:EAX
, que é o queDIV
usa como dividendo. Na verdade, não precisamos de extensão de sinal aqui, porque o valor de entrada não é assinado, masCDQ
é de 1 byte, em vez de usarXOR
para limparEDX
, que seria de 2 bytes.DIV
ideEDX:EAX
porESI
(10).EDX
) é adicionado ao acumulador (ECX
).EAX
registro (quociente) é testado para verificar se é igual a 0. Nesse caso, passamos por todos os dígitos e seguimos em frente. Caso contrário, ainda temos mais dígitos para somar, então voltamos ao topo do loop.Por fim, após a conclusão do loop, implementamos
number % ((sum_of_digits)*2)
:A
LEA
instrução é usada como uma maneira curta de multiplicarECX
por 2 (ou, equivalentemente, adicionarECX
a si mesma) e armazenar o resultado em um registro diferente (neste casoEAX
).(Também poderíamos ter feito
add ecx, ecx
+xchg ecx, eax
; ambos são 3 bytes, mas aLEA
instrução é mais rápida e mais típica.)CDQ
novamente para nos preparar para a divisão. ComoEAX
será positivo (isto é, não assinado), isso tem o efeito de zerarEDX
, exatamente como antes.EDX:EAX
pelo valor de entrada (uma cópia não-modificada da qual ainda resideEDI
). Isso é equivalente ao módulo, com o restante emEDX
. (O quociente também é inseridoEAX
, mas não precisamos dele.)XCHG
trocamos o conteúdo deEAX
eEDX
. Normalmente, você faria umMOV
aqui, masXCHG
é apenas 1 byte (embora mais lento). ComoEDX
contém o restante após a divisão, será 0 se o valor for igualmente divisível ou diferente de zero. Assim, quandoRET
urn,EAX
(o resultado) será 0 se o valor de entrada for divisível pelo dobro da soma de seus dígitos, ou diferente de zero.Espero que isso seja suficiente para uma explicação.
Esta não é a entrada mais curta, mas, ei, parece que bate quase todas as línguas que não são de golfe! :-)
fonte
Japonês ,
74 bytesRecebe a entrada como uma sequência. Saídas
0
paratrue
ou um número maior que0
parafalse
, que, de outras soluções, parecem válidas. Caso contrário, avise-me e reverteremos.Teste-o
Explicação
Entrada implícita da sequência
U
."390"
Repita
U
duas vezes."390390"
Dividir para matriz de caracteres individuais.
["3","9","0","3","9","0"]
Reduza pela soma, convertendo automaticamente cada caractere para um número inteiro no processo.
24
Obtenha o restante da divisão
U
pelo resultado, também convertendo automaticamenteU
para um número inteiro no processo. Implica implicitamente o número inteiro resultante.6 (=false)
fonte
C89,
5553 bytes(Obrigado a Steadybox!
É preciso uma única entrada
x
, que é o valor a ser testado. Retorna 0 sex
for divisível igualmente pelo dobro da soma de seus dígitos, ou diferente de zero.Experimente online!
Ungolfed:
Como você pode ver, isso tira proveito das regras implit-int do C89. As variáveis globais
s
et
são implicitamente declaradas comoint
s. (Eles também são implicitamente inicializados como 0 porque são globais, mas não podemos tirar proveito disso se queremos que a função seja solicitada várias vezes.)Da mesma forma, a função,
f
leva um único parâmetro,x,
que é implicitamente umint
, e retorna umint
.O código dentro da função é bastante direto, embora o
for
loop pareça muito estranho se você não estiver familiarizado com a sintaxe. Basicamente, umfor
cabeçalho de loop em C contém três partes:Na seção "inicialização", inicializamos nossas variáveis globais. Isso será executado uma vez, antes que o loop seja inserido.
Na seção "condição do loop", especificamos em que condição o loop deve continuar. Isso deve ser óbvio.
Na seção "incremento", basicamente colocamos código arbitrário, pois ele será executado no final de cada loop.
O objetivo maior do loop é iterar através de cada dígito no valor de entrada, adicionando-o a
s
. Finalmente, depois que o loop termina,s
é duplicado e levadox
para o módulo para ver se é igualmente divisível. (Uma explicação melhor e mais detalhada da lógica aqui pode ser encontrada em minha outra resposta , na qual esta se baseia.)Versão legível por humanos:
fonte
t
vez det>0
como a condição de loop .Braquilog , 8 bytes
Experimente online!
Explicação
fonte
Python 2 ,
3432 bytes-2 bytes graças a @Rod
Experimente online!
fonte
<1
.Mathematica, 26 bytes
Nenhuma pista por que
∣
tem uma precedência mais alta que a multiplicação ...fonte
PHP , 41 bytes
imprime zero se divisível, número inteiro positivo caso contrário.
Experimente online!
fonte
$a=10
, mas você se esqueceu de contar isso para a sua contagem de bytes$argn
está disponível com o-F
(neste caso) ou-R
opção-F
. Mas isso não se reflete no seu TIO (ele suporta eco do STDIN?).-F
opção em vez de-R
php.net/manual/en/features.commandline.options.php Se você encontrou uma maneira melhor de fazer o mesmo no tio como no commnd linha me aviseExcel, 63 bytes
A soma de dígitos é o bit longo.
fonte
Perl 6 , 19 bytes
Experimente online!
fonte
Casca ,
98 bytesAgradecemos a Leo por economizar 1 byte.
Experimente online!
Explicação
fonte
Haskell ,
383742 bytesAgradecimentos a Zgarb por jogar fora 1 byte
Experimente online!
Recebe entrada como uma string; retorna 0 se divisível e diferente de zero caso contrário.
fonte
(:[])
pode serpure
.Python 3, 35 bytes
fonte
=
e após o)
noint(c)
. Além disso, comosum
pode usar um gerador como argumento, você pode remover o[..]
interior dele. Se você tiver alguma dúvida adicional, sinta-se à vontade para me enviar um ping.int(c)for c in a
também poderia sermap(int,a)
, para salvar alguns bytes.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 bytes-5 graças a @Oki
Isso é complicado pelo fato de não haver uma maneira concisa de somar dígitos inteiros no TI-BASIC . Retorna
0
paraTrue
e um número diferente paraFalse
.Explicação:
fonte
10^-randIntNoRep(1,1+int(log(Ans
faz o mesmo queseq(10^(~A-1),A,0,log(Ans
em menor número de bytes como matéria ordem esquentar (Assumindo versão 2.55MP)Braingolf ,
1312 bytesExperimente online!
Saídas 0 para verdade, qualquer outro número para falsey.
Explicação
fonte
Japonês , 7 bytes
Retorna
1
paratrue
,0
porfalse
Experimente online!
Explicação
fonte
Haskell , 49 bytes
Uso
Experimente online!
fonte
Java , 66 bytes
-1 byte graças a Olivier
Ungolfed & explicação:
fonte
int
vez debyte
para salvar ... um byte.a%i*2
que é analisado,(a%i)*2
uma vez que o módulo e a multiplicação têm a mesma ordem.J, 15 bytes
0 indica verdade, diferente de zero indica falsidade.
Explicação
fonte
@
ou[:
!|~2*1#.,.&.":
por 13 bytes.Ohm , 5 bytes
Experimente online!
fonte
tcl, 45
demonstração
fonte
0==
por1>
.Haskell ,
3534 bytesExperimente online!
Retorna '0' no caso verdadeiro e o restante no caso contrário.
Haskell , edição pointfree por nimi, 34 bytes
Experimente online!
fonte
mod<*>(2*).sum.map(read.pure).show
PHP, 44 bytes
Execute assim:
Explicação
Repete os dígitos para calcular o total e, em seguida, gera o módulo como a maioria das respostas.
fonte
Java (OpenJDK 8) ,
5553 bytesExperimente online!
Um valor de retorno de
0
significa verdade, qualquer outra coisa significa falsidade.Como meu comentário na resposta de Okx não fez ondulações, eu a apaguei e publiquei como esta resposta, ainda mais.
Mais golfe graças a @KrzysztofCichocki e @Laikoni, que por direito me mostraram que eu não preciso responder a um valor de verdade / falsidade, mas a qualquer valor desde que eu descreva o resultado.
fonte
true
.Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.
.Mini-Flak,
296292 bytesExperimente online!
O link do TIO tem mais comentários meus, por isso é parcialmente mais fácil de ler.
Truthy / Falsey: Truthy (divisível) se o segundo número for igual ao terceiro número, caso contrário, falso. Portanto, tanto o conjunto verdadeiro quanto o falso são infinitos, mas suponho que isso deva ser permitido. 10 bytes, se não estiver.
Nota: Novas linhas / espaços em branco à esquerda / à direita não são permitidos na entrada.
fonte