Seu desafio, se você aceitar, é criar uma função ou um programa que emita "sim" se um determinado número for divisível por 13 e em "não" se não for.
Regras:
- Você não tem permissão para usar o número 13 em qualquer lugar.
- Nenhum sinônimo de cop-out para 13 também (como usar 15-2).
- Pontos de bônus serão concedidos por não usar o módulo, bônus adicional por não usar a divisão.
Pontuação:
- Sua pontuação será o número de bytes no seu código (espaço em branco não incluído) multiplicado pelo seu bônus.
- Se você não usou o módulo, esse bônus é 0,90; se você não usou a divisão, esse bônus é 0,90.
- Se você também não usou, esse bônus é 0,80.
- Quanto menor a sua pontuação, melhor.
A entrada sempre será um número inteiro maior que 0 e menor que 2 ^ 32.
Sua saída deve ser um simples "sim" ou "não".
Esclarecimentos:
- O uso de algum método indireto para gerar o número 13 para uso é aceitável. Sinónimos aritméticos simples como (10 + 3) não são permitidos.
- A função ou programa deve literalmente emitir "yes" ou "no", pois se o número especificado é divisível por 13.
- Como sempre, soluções inteligentes são recomendadas, mas não necessárias.
fonte
function f(n){return "yes"}
. Isso retornará 'yes' para todos os números que podem ser divididos por 13Using some roundabout method of generating the number 13 for use is acceptable.
Como você determina o que é "rotunda o suficiente"?Respostas:
Java (pontuação
60,859,2)Pontuação: (76 - 2 espaços em branco) caracteres * 0,8 = 59,2
fonte
println
->print
?ASM - x86 de 16 bits no shell de comando do WinXP
executável - 55 bytes * 0,8 = 44
fonte - 288 caracteres * 0,8 = 230,4
O número 13 nem aparece no arquivo .com montado.
Monte usando o A86.
fonte
The input will always be an integer greater than 0 and less than 2^32
. Você não pode usar 16 bitsPython 3.x: 54 * 0.8 = 43,2
Pode ser um cop-out ter uma sequência de comprimento 13, mas aqui vai:
Ele funciona construindo uma sequência de n espaços (a escolha do delimitador é arbitrária, mas eu escolhi o espaço por razões óbvias) e separando substrings de 13 espaços até que você fique com uma sequência contendo n% 13 espaços.
fonte
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
com' '*6+' '
a economia de 5 caracteres - mas então eu descobri que os espaços não contava em tudo ...GolfScript, 32 caracteres
Eu queria tentar algo diferente de todos os outros, então minha solução calcula a raiz digital base 14 do número, convertendo repetidamente o número em base 14 e somando os dígitos até que o resultado não fique menor. Isso é essencialmente o mesmo que calcular o restante módulo 13, exceto que o resultado estará no intervalo de 1 a 13 em vez de 0 a 12.
Como verificar se a raiz digital é igual a 13 seria difícil sem usar o próprio número 13 (ou alguma solução alternativa esfarrapada, como 12 + 1), o que realmente faço é incrementar o número de entrada em um antes do loop e diminuir o resultado posteriormente. Dessa forma, o resultado para números divisíveis por 13 será de fato zero, o que é muito mais fácil de verificar.
Aqui está uma versão comentada do programa:
Este programa vai realmente lidar com qualquer não-negativo inteiro entradas, desde GolfScript usa aritmética bignum. Obviamente, entradas extremamente grandes podem consumir tempo e / ou memória excessivos.
O código não usa módulos nem divisões diretamente, embora use o operador de conversão base do GolfScipt, que quase certamente faz alguma divisão e faz o restante internamente. Vou deixar para o GigaWatt decidir se isso me qualifica para o bônus ou não.
fonte
C, 68 * 0,8 = 54,4
Após 24 respostas, ninguém apresentou esse algoritmo óbvio ainda:
fonte
JavaScript (27.9)
Versão atual (31 caracteres * 0,90 de bônus = 27,9).
Demonstração: http://jsfiddle.net/9GQ9m/2/
Editar 1: Abandone o segundo bônus usando o módulo para diminuir consideravelmente a pontuação e evitar o
for
loop. Também elimine~~
e salve dois caracteres (obrigado@copy
).Versão mais antiga (48 caracteres * 0,80 de bônus = 38,4)
fonte
~~
entrada válida assumindo; caso contrárioprompt()<<1
, também funcionará.BrainFuck
Pontuação: 200 * 0.8 = 160
Lê de stdin. Provavelmente não é a solução mais inteligente, mas conseguir qualquer coisa que funcione no BF é bom. É bastante compacto.
fonte
Scala (38 * 0,9 = 34,2)
Igual a
0xD
(hex) ou015
(oct).O valor ASCII de
CR
é 13.fonte
Haskell, 28 * 0,8 = 22,4
fonte
Python:
Por exemplo
dá
fonte
20
) #f=lambda n:pow(8,n,79)-1 and "no" or "yes"
corrigi-lo, 43 * 0,8 = 34,4 #C, 54,4 == 68 * 0,8
80 * 0,8fonte
\r
- eu pensei que só é bom para o suporte do Windows. Mas por quec>0
quandoc
faria?>0
não é bom. Mas, em vez de perceber que sua função não as suporta, pensei que==
era bom.ECMAScript 6, 25 × 0,9 = 22,5
Sim, é uma maneira chata de conseguir 13 anos.
fonte
APL ((21-1) × 0,8 = 16)
⎕IO
deve ser definido como 0 para que isso funcione corretamente no Dyalog APL. Para gerar 13, pegamos o piso (⌊
) do logaritmo natural (⍟
) de 9 à potência de 6 (9*6
). Depois disso, encontramos o MDC (∨
) de nossa entrada (⎕
) e 13 e testamos se isso é igual a 1. Isso é usado para indexar ([...]
) o vetor de respostas.Se alguém quiser ser pedante sobre a menção de bytes na especificação de pontuação, a pontuação para a versão UTF-8 codificado desta é
(29 - 1) × 0.8 = 22.4
. :)fonte
C, 88
Truque de Fibonacci.
fonte
Perl - 44 × 0,8 = 35,2
Contando o shebang como um byte.
Estou um pouco atrasado para o jogo, mas pensei em compartilhar o algoritmo, pois nenhuma outra postagem até o momento o usou.
Isso funciona sob a observação de que se n é divisível por 13 , então ⌊ n / 10 ⌋ + n% 10 * 4 também é divisível por 13 . Os valores 13 , 26 e 39 alternam entre si. Todos os outros múltiplos de 13 eventualmente atingirão um desses valores em não mais que log 10 n iterações.
Em outras bases
É certo que
chop
é um pouco de bobagem. Com uma representação base 10, é equivalente adivmod
. Mas o algoritmo funciona bem em outras bases, por exemplo, base 4 ou 8.Pseudo-código no estilo Python do algoritmo acima (base 10):
Na base 2:
Na base 4:
Na base 8:
etc. Qualquer base menor que 13 funciona igualmente bem.
fonte
Javascript: 59 * 0.8 = 47.2 (?)
violino :
Incluindo a melhoria de mellamokb (57 * 0,8 = 45,6):
fonte
return n-c?'no':'yes'
e omitindo o segundo ponto e vírgula.prompt
para entrada ealert
saída, o que torna o programa interativo e economiza alguns caracteres.Perl: (51-4 espaços) * 0.9 = 42.3
fonte
Perl (19,8)
21 bytes * .9
Nota: Meu primeiro programa Perl. Dificilmente digitado é bom para o golfe, eu acho.
fonte
em C (K&R): 47 * 0,8 = 37,6
EDIT1: ok removeu todas as dependências de funções externas, o acima funcionará desde que você coloque essa linha na 13ª linha do arquivo! :) Se
__LINE__
for aceitável ser substituído por say0xd
, pode salvar mais 5 caracteres (pontuação: 33,6)fonte
J - 22,4 = 28 * 0,8
Baseado no método cíclico inteligente de mxmul .
Exemplos:
fonte
JavaScript (108 menos 0 para espaço em branco) => 108, x 0,8 (sem módulo, sem divisão) = 86,4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Este método usa o seguinte algoritmo: 1. Pegue o último dígito, multiplique por quatro, adicione-o ao restante do número truncado. 2. Repita a etapa 1 para 99 iterações ... 3. Teste-a mais uma vez usando a etapa 1, se o número resultante for o próprio, você encontrou um múltiplo de 13.
Atualização anterior, removida
var
e lógica reversa no alerta para remover mais caracteres usando condicional subtração-falso.Tecnicamente, o resultado final é que você chegará a um número de dois dígitos como 13, 26 ou 39 que, quando executado na etapa 1 novamente, fornecerá 13, 26 ou 39, respectivamente. Portanto, o teste para a iteração 100 ser o mesmo confirmará a divisibilidade.
fonte
Cheddar, 20 bytes (não-competitivo)
A pontuação é 20 * 0,9 = 18
Uma resposta direta.
fonte
Lisp comum (71 bytes * 0,8) = 56,8
Recursão simples, realmente.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Ungolfed:
fonte
Ruby (
5048 * 0,9 = 43,2)Maneira inteligente de usar
eval
fonte
D 56 caracteres 0,80 bônus = 44,8
isso pode ter sido um problema com o uso de 1/13 e um duplo pode armazenar qualquer número de 32 bits exatamente
edit: isso funciona multiplicando por 1/13 e verificando a parte fracionária se for diferente de 0 (permitindo erros de arredondamento) ou, em outras palavras, verifica a parte fracionária de i / 13
fonte
Python 2.7
(20 - 1 espaço em branco) * 0,9 (sem divisão) = 17,1
sim / não em vez de verdadeiro / falso: 31 * 0,9 (sem divisão) = 27,9
tira proveito do python
int
para converter outras bases de strings em números inteiros de base 10. você pode ver nas duas versões que eles usam uma base diferente (mas com o mesmo comprimento de caractere)edit: 1 char save na versão yes / no
edit2: outros 2 caracteres raspados!
edit3: obrigado novamente aos comentários! ainda mais caracteres cortados usando as representações octais internas do python (
015
==13
...) em vez da tradução base do intfonte
print['no','yes'][input()%int('d',14)==0
14-1
ou26/2
. Eu apenas tomei liberdade criativa para representar 13 #Perl, 95 * 0,8 = 76
As quebras de linha foram adicionadas para maior clareza. Eu provavelmente poderia ter tornado essa resposta muito mais curta, mas acho que essa resposta representa uma maneira única de abordar o problema.
fonte
Python - pontuação 27.9
(31 caracteres * 0,90) - renuncia a algum bônus por código mais curto.
versão anterior: (47 caracteres * 0,80) - cópia completa da resposta Javascript do mellamokb, mas em Python.
versão anterior: (60 caracteres * 0,80)
versão anterior: (105 caracteres * 0,80)
fonte
(1,10,9,12,3,4)
iria salvar um personagem, mas não iria resolver para um valor inferior a 13.Em Q:
fonte
Gramática linear direita - ∞ pontos
Então, dependendo de como você optar por 'executá-lo', ele exibirá 'yes' ou 'no'.
Não é uma entrada séria, apenas um pouco de diversão;)
Edição: Talvez eu deva explicar um pouco.
Uma gramática é um conjunto de regras (produções) que definem um idioma . Uma linguagem pode ser pensada como todas as seqüências possíveis formadas por um alfabeto, que estão em conformidade com as regras de sua gramática.
Aqui, o alfabeto é o conjunto de todos os dígitos decimais. As regras da gramática são que todas as seqüências de caracteres devem formar números decimais divisíveis por 13.
Podemos usar a gramática acima para testar se uma string pertence ao nosso idioma.
As regras da gramática contêm símbolos terminais (que são elementos no idioma), bem como símbolos não terminais que são substituídos recursivamente.
É mais fácil explicar o que está acontecendo com um exemplo:
Digamos, por exemplo, que a string que estamos testando seja 71955.
Sempre existe um símbolo de início (que não é terminal); no caso da gramática acima, é 'S'. Neste ponto, não lemos nenhum caractere da nossa string:
Agora, lemos o primeiro símbolo em nossa string que é '7', depois procuramos uma regra na gramática que possua qualquer um dos não terminais em nosso padrão atual no lado esquerdo do '->' e que tem o nosso símbolo no lado direito do '->'. Felizmente, existe um (S-> 7G), por isso substituímos os símbolos não terminais em nosso padrão atual pelo lado direito da nova regra:
Agora, temos o 'G' não terminal em nosso padrão, e o próximo símbolo a ser lido é '1'; portanto, procuramos uma regra em nossa gramática que começa com 'G-> 1 ". Descobrimos que existe um. (G-> 1F), substituímos o não terminal pelo RHS de nossa nova regra:
Continue repetindo este processo:
Próxima regra: F-> 9D
Próxima regra: D-> 5F
Próxima regra: F-> 5S
Neste ponto, não temos mais símbolos em nossa string, mas temos outro símbolo não terminal lá. Vemos pela primeira regra da gramática que podemos substituir 'S' pela string vazia (ε): S-> ε
Isso nos dá o padrão atual: 71955ε, que é equivalente a 71955.
Lemos todos os símbolos em nossa string e o padrão não contém símbolos não terminais. O que significa que a string pertence ao idioma e, portanto, 71955 é de fato divisível por 13.
Ou seja, o objetivo é ter pattern = string. Se você tiver algum símbolo não terminal, depois de ler todos os símbolos da sua string, ela não pertence ao idioma. Da mesma forma, se você ainda tiver mais símbolos em sua sequência para ler, mas não houver regras na gramática que permitam avançar, a sequência não pertence ao idioma.
fonte