Meu amigo e eu estávamos trabalhando em um laboratório em nossa aula de Ciência da Computação da AP e decidimos codificar um dos problemas, já que ainda tínhamos metade da aula livre depois que terminamos. Aqui está a pergunta:
Dado um número n, n é divisível por cada um de seus dígitos?
Por exemplo, 128 será aprovado neste teste - é divisível por 1,2 e 8. Quaisquer números com zero desqualificam automaticamente o número. Embora você possa usar outras linguagens e publicar soluções com elas, se quiser, estamos mais interessados em ver como pessoas compactas podem criar o programa em Java, pois essa é a linguagem que usamos na classe. Até agora, nós dois temos 51. Aqui está o meu código atual:
public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters
// Breakdown:
// for(int p=n; Saves one semicolon to put declaration into for loop
// n%10>0;) Basic check-for-zero
// n/= Pretty simple, discarding one number off of n at a time
// p%(n%10)>0? If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10; Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1 If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.
Exigências
A assinatura do método pode ser o que você quiser. Apenas conte o corpo da função. Certifique-se, no entanto, de que o método retorne um valor booleano e passe apenas em um parâmetro numérico (não em uma string).
O código deve ser capaz de passar todos esses casos (para permanecer fiel às instruções da pergunta original, somente valores booleanos verdadeiros e falsos contam se o idioma suportar booleanos. Se e somente se o seu idioma não tiver variáveis booleanas, você pode representar false com 0 e true com qualquer número inteiro diferente de zero (de preferência 1 ou -1):
128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false
Além disso, não contamos o espaço em branco, portanto, sinta-se à vontade para fazer o mesmo, a menos que o espaço em branco seja essencial para o funcionamento do programa (para que as novas linhas em Java não sejam contadas, mas um único espaço entre int
e x=1
conte). Boa sorte !
true
efalse
ou são truthy / Falsas valores OK bem? 3. Ajava
tag não se aplica aqui, pois o desafio em si não está relacionado ao Java.0
dígitos que é um múltiplo de cada um deles), imagino que a maioria das respostas demoraria mais de uma maneira desinteressante para incluir uma verificação. Então, eu gosto mais do problema apresentado pelo título (divisível por seus dígitos, em vez de ser um múltiplo de seus dígitos, que exclui 0).Respostas:
Perl 6, 13
Usa a variável implícita
$_
-$_ %% .comb.all
é equivalente a$_ %% all($_.comb)
.%%
é o operador "é divisível" e,comb
sem argumento adicional, retorna uma lista dos caracteres em uma sequência. Como exemplo, se o argumento for 123, a função avaliaráqual é
autothreading de junção torna
qual é
o que é falso no contexto booleano porque é uma junção "todos" e claramente nem todos os seus elementos são verdadeiros.
Deve ser possível coagir o valor de retorno
Bool
e ocultar a junção dos chamadores fazendo a assinatura da funçãosub golf($_ --> Bool())
, mas as coerções nas assinaturas das funções ainda não funcionam no Rakudo. O valor de retorno ainda é corretamente verdadeiro ou falso, apenas não éTrue
ouFalse
.fonte
Bool
basta adicionarso
uma parte da frente do códigoso$_%%.comb.all
.C # e System.Linq - 26/40
Pelas regras, sem contar a própria declaração do método.
Mostrando que mais uma vez, o C # é a escolha superior quando o Java está sendo considerado ... Brincadeira, brincadeira!
Infelizmente, esta função (e muitas outras respostas) não produzirá resultados corretos para dados negativos. Podemos corrigir isso, mas a solução perde muito de seu charme (e cresce para 46 caracteres):
Edit : raspou um personagem com a sugestão de Tim.
Edit : com a introdução de membros com expressão no C # 6, podemos reduzir isso ainda mais cortando o
return
:para um total de 26 caracteres (na minha opinião,
=>
não deve ser incluído mais do que chaves). A versão que manipula números negativos pode ser reduzida de forma semelhante.fonte
.0
? Não há necessidade de nada além de módulo inteiro.i % 0
comi
um número inteiro dá aDivideByZeroException
.48d
é o mesmo que48.0
, mas um caractere a menos (d para o dobro).&
, precisamente porque&
não provoca um curto-circuito - você receberá uma exceção de divisão por zero no%
. Podemos consertar isso fazendo um duplo (comd
), mas perdemos um caractere novamente.APL (
(aparentemente os colchetes não contam)1311)Explicação:
⍎¨⍕⍵
: avalie cada caractere na representação de sequência de⍵
⍵|⍨
: para cada um deles, encontre o módulo e⍵
0∧.=
: veja se todos são iguais a0
Casos de teste:
fonte
X%0
? sem jogar?0|X
dáX
.(0∧.=⍎¨∘⍕|⊢)
Caracteres Python 2: 43
Verifica se o número tem algum resto diferente de zero, modula seus dígitos e gera a negação disso. Os dígitos zero são tratados de maneira estranha: como a computação
%0
causa um erro, os dígitos de0
são substituídos por.3
, o que parece sempre fornecer um resultado diferente de zero devido às imprecisões dos pontos flutuantes.O corpo da função é de 32 caracteres.
fonte
Perl - 27 bytes
Não contando a assinatura da função, conforme as instruções.
Uso da amostra:
Saída de amostra:
Dirigindo-se à especificação do problema: "Somente valores booleanos verdadeiros e falsos contam. Valores truthy / falsey não contam."
Saídas:
'True' e 'False' são definidos como
1
e""
.Errata:
Como Brad Gilbert aponta corretamente , o perl define verdadeiro como um escalar que é simultaneamente o número inteiro
1
e a sequência"1"
e falso como um escalar que é o número inteiro0
e a sequência""
simultaneamente.fonte
$_
:pop=~s///ger<1
. Não sei se o OP concordará com isso1
e""
são resultados válidos. Caso contrário, pode ser corrigido com mais dois bytes: basta adicionar|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
tem 26 bytes, incluindo o sinalizador|0
e-p
. Você não precisa usar uma função.dualvar(1,'1')
edualvar(0,'')
.SVIV
(int),SVNV
(duplo) eSVPV
(string).'abc'
como um número (supondo que você tenhause warnings;
habilitado.)CJam,
1110 bytesIsso define uma função nomeada
F
e descarta o bloco da pilha.Experimente online.
Casos de teste
Como funciona
fonte
JavaScript ES6,
393228 bytesObrigado core1024 pela sugestão de substituição
(""+v).split("")
por[...""+v]
, e abra ou feche por sugerir o uso daevery
função.A resposta atualmente não contém um pouco do meu código: O
Solução anterior
==""
não é uma maneira válida de verificar se uma matriz está vazia, pois[""]==""
retornatrue
, mas a matriz tem garantia de conter uma seqüência de caracteres não vazia, por isso funciona aqui.O restante são conversões de tipo abreviado bastante padrão em JavaScript.
fonte
(""+v).split("")
por[...""+v]
.every
método?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
retornaNaN
eNaN == false
, no seu caso, números que contêm 0, como10
, podem retornartrue
.Java 8, 46 bytes (corpo do método)
Usando a conversão de Jeroen Mostert para truque duplo.
fonte
Pitão, 12 bytes
Isso filtra os caracteres na cadeia de caracteres como sendo zero (
!vT
) ou não dividindo a entrada (%vzvT
) e, em seguida, assume o não lógico da lista resultante.Experimente aqui.
fonte
Ruby, 44 bytes (corpo da função: 37)
Provavelmente tem potencial para ser jogado mais.
Entrada obtida através da função
f
. Exemplo de uso:fonte
.to_i
para.hex
, pois os números de um dígito são iguais na base 16 e pode mudar==0
para<1
.Python -
59504947 bytesTenho certeza de que há uma maneira mais rápida ... tudo bem.
Editar - Obrigado a FryAmTheEggman pelas dicas de golfe.
Edit 2 - FryAmTheEggman pode muito bem ter escrito isso neste momento, oops
Edit 3 - Hands up, se você nem sabia que genexps eram uma coisa. ...Apenas eu?
fonte
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. E não há problema :)all
método.1>n%int(c)
?all(c>'0'and 0==n%int(c)for c in`n`)
faz exatamente o mesmo, com 2 caracteres a menos e até mesmo salvar a alocação da lista.Pitão 11
Isso combina as respostas de @ isaacg e @ xnor . Ele filtra os dígitos da entrada verificando o valor de
input % (eval(current_digit) or .3)
. Em seguida, verifica se a sequência resultante está vazia ou não.Me deparei com outras variantes do mesmo comprimento:
Experimente online.
fonte
Bash + coreutils, 44 bytes
A definição completa da função é:
Não sei como pontuar isso, pois normalmente as funções de shell usam um único conjunto de
{}
ou()
para conter o corpo da função. Eu descobri aqui que eu também poderia usar double(())
para conter o corpo da função que causa uma expansão aritmética, que é o que eu preciso aqui. Por enquanto, estou contando apenas um par desses colchetes - uma discussão mais aprofundada sobre isso é bem-vinda.Resultado:
fonte
true
/false
?J - 14 car
O corpo da função é a parte após o
=:
. Se queremos minimizar a contagem de caracteres para toda a função, esse é o valor de 15 caracteres*/@(0=,.&.":|])
.,.&.":
é o caminho mais curto em J para expandir como número em uma lista de seus dígitos decimais: converter em sequência, separar os dígitos e converter cada dígito novamente em um número.,.&.":|]
pega o número da entrada (]
) modulo (|
) esses dígitos.0*/@:=
retorna true se todos os resultados forem 0, caso contrário, fornece um false.fonte
Java -
121102977978 bytesEu só sei que isso será derrotado mais tarde. Ah bem.
Eu voltarei.
fonte
Haskell -
1005438Ainda aprendendo, críticas apreciadas
fonte
length
s, eles são desnecessários. 2) Substituat
por sua definição. 3)elem y s
é desnecessário. 4)/='0'
pode ser movido para o filtro esquerdo, no lugar deelem y s
. 5) Nesse caso,/='0'
é equivalente a>'0'
, uma vez que cada letra é um dígito. 6) Coloque asmod
costas, para que se torne infix. 7) Coloque tudo em uma única linha.s==filter(...)s
você deve usarall(...)s
. agora, comos
aparece apenas uma vez na expressão, você pode substituí-lo por sua definição e descartewhere
. Além disso, em vez de==0
você poderia usar<1
.all(\y->...)$show x
porand[...|y<-show x]
.CJam, 15 bytes
Este é um bloco, a coisa mais próxima de uma função no CJam. Estou apenas contando o corpo (ou seja, omitindo o aparelho). Você pode usá-lo da seguinte maneira:
Ou, se você quiser testar uma série de entradas, pode fazer
O bloco deixa
0
(falsy) ou1
(truth) na pilha para indicar o resultado. (CJam não tem um tipo booleano.)Teste aqui.
Explicação:
Alternativa, também 15 bytes
Explicação
fonte
CJam, 15 bytes
{}
é a coisa mais próxima de uma função no CJam. Estou apenas contando o corpo da funçãoUse-o assim:
Para obter
1
(se o número é divisível) ou0
(se o número não é divisível por seus dígitos).Experimente online aqui
Explicação
fonte
Ab
divide os dígitos? Parece apenas convertê-lo para a base 10. Além disso, como% sabe modificar pelo número e não apenas pelo próximo dígito, pois parece que o próximo dígito seria o próximo na pilha?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
basta pegar os dois últimos números (neste caso) e calcular o mod. Os últimos dois números aqui são o número e o dígito reais (sempre)C89, 43 bytes
C89 não tem um tipo booleano. Espero que funcione. Também usei um segundo parâmetro para passar uma cópia do número original pela pilha, mas a definição pode ser qualquer coisa. Para obter o resultado correto, basta chamar a função com o mesmo valor para os dois parâmetros (
d(128, 128)
).EDIT: edições sugeridas aplicadas por um usuário anônimo
fonte
C11 - 44 bytes no corpo da função
Outra versão C, não recursiva e sem uma exceção de ponto flutuante.
Isso também funcionará em C ++, Java e na maioria das outras linguagens C.
Editado para incluir a melhoria do comentário do primo.
fonte
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
um byte menor que o código do OP.Julia
322523Melhorado usando dígitos
Também corrige o problema com números negativos
Método antigo
Todos os dígitos se dividem se a soma de todos os demais for 0. Como outros, tem um problema com números negativos.
Resultado
O método aprimorado também lida com o BigInt
Contudo
Porque
fonte
C / C ++, 58 bytes (44 no corpo)
Invoca comportamento indefinido (ver comentários)
true
efalse
são 1 e 0, mas fique à vontade para adicionar um caractere à assinatura para retornar abool
.E por diversão, uma versão recursiva que é menor se você permitir chamadas do formulário
r(128,128)
Edit : Agora não permitido pelas regras:
C / C ++, 53 bytes (33 no corpo)
fonte
R:
726765A função
Agradecemos a @AlexA e @plannapus pela economia
Execução de teste
fonte
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
vez de fornecertoString(a)
o mesmo resultado.GNU Awk: 53 caracteres
A parte contada:
Toda a função:
Como o Awk não possui valores booleanos, retorna 1 para true e 0 para false.
fonte
JavaScript (ES6) 30
Função com um parâmetro numérico. Usando% e subtração, não é necessário o caso especial '0' porque 0% 0 é NaN em JavaScript.
Editar salvos 1 char thx DocMax
Apenas por diversão, abusando da regra de não contar a assinatura da função, 4
Teste no console do FireFox / FireBug
Resultado
fonte
of(t=n+'')
com apenasof t=n+''
para salvar 1.PHP: 85 bytes (64 bytes no corpo)
Para que essa função funcione, basta passar uma string ou um número.
0
retornará corretamente false.O código:
Por favor, NÃO AJUSTE O 2º PARÂMETRO!
Javascript: 76 bytes (61 bytes no corpo)
Esta é uma reescrita da função anterior.
Não mudou muito entre as duas versões.
Aqui está o código:
Poliglota: Javascript + PHP 187
217bytes (7684 bytes sem clichê):Por que eu fiz isso?
Por causa da razão e talvez porque eu possa!
Apenas ignore o erro no PHP: ele funciona de qualquer maneira!Não é mais necessário, isso foi corrigido com a remoção de 3 bytes.
Aqui está a obra-prima:
Você pode executar esse código no console e em um intérprete PHP!
Versão antiga:
fonte
Oitava, 33 (39 incluindo configuração de função)
Usando a conversão numérica em matriz:
Divida o número elemento a elemento pela matriz X, em que X é feito convertendo o número em sequência e subtraindo 48 para passar dos valores ASCII para números novamente. Tome o módulo 1 para obter a parte decimal de cada divisão, confirme que tudo isso é zero (se houver NaN por causa de / 0, a soma será NaN e, portanto, não é zero).
Exemplo de entrada usando www.octave-online.net:
Resultado:
fonte
f(123)
, que é divisível por 1, 2 e 3). Mas funciona para os casos de teste fornecidos.MATLAB - 39 caracteres
fonte
BASH - 117 caracteres
testes
fonte
PHP -
747164 caracteresGolfe:
Menos Golfe:
Resultado dos testes:
(Código)
(Resultado)
fonte