Há um tempo, estou enfrentando um problema ao contar nos dedos, especificamente, que só posso contar até dez. Minha solução para esse problema foi contar binário em meus dedos, colocando meu polegar para um, meu indicador para dois, polegar e indicador para três, etc. No entanto, encontramos um pouco de problema quando chegamos o número quatro. Especificamente, exige que levantemos o dedo médio, o que resulta em um gesto bastante infeliz, que normalmente não é aceito na sociedade. Este tipo de número é um número rude . Chegamos ao próximo número grosseiro aos 36, quando levantamos o polegar na segunda mão e o dedo médio da primeira mão. A definição de um número grosseiro é qualquer número que, sob este sistema de contagem, resulta em nos colocar-se unicamenteo dedo médio de qualquer mão. Depois de passarmos o 1023 (o número máximo alcançável em uma pessoa, com duas mãos de cinco dedos cada), suponha que continuemos com uma terceira mão, com as mãos adicionais adicionadas conforme necessário.
Sua tarefa:
Escreva um programa ou função que receba uma entrada e emita um valor de verdade / falsidade com base no fato de a entrada ser um número rude.
Entrada:
Um número inteiro entre 0 e 10 9 (inclusive).
Resultado:
Um valor de verdade / falsidade que indica se a entrada é um número rude.
Casos de teste:
Input: Output:
0 ---> falsy
3 ---> falsy
4 ---> truthy
25 ---> falsy
36 ---> truthy
127 ---> falsy
131 ---> truthy
Pontuação:
Isso é código-golfe , então a pontuação mais baixa em bytes vence.
fonte
assume we continue with a third hand
Quando se trata de ser rude, o trabalho em equipe faz o sonho funcionar.Respostas:
APL (dzaima / APL) , 5 bytes
Experimente online!
4∊
é 4 um membro de32⊤
to-base-32?fonte
Regex (ECMAScript), 37 bytes
A entrada é unária, como o comprimento de uma sequência de
x
s.^((?=(x+)(\2{31}x*))\3)*(x{32})*x{4}$
Experimente online!
fonte
JavaScript (SpiderMonkey) , 23 bytes
Experimente online!
Esta é uma solução trivial, você só deseja converter para a base 32 e verificar se há um 4 nela.
JavaScript (SpiderMonkey) , 26 bytes
Experimente online!
É interessante que
/4/.test(...)
custa mais um byte que....match(4)
.fonte
Japt , 5 bytes
Experimente online!
Explicação
fonte
Ruby,
3619 bytesExperimente online!
Economizou 17 bytes com o método @tsh .
fonte
100010011111
00100
.->n{n.to_s(32)=~/4/}
?10001
, a segunda00111
e a terceira11
? Nenhum deles tem apenas o dedo do meio levantadoAPL + WIN, 10 bytes
Solicita a entrada de número inteiro
A observação de seis ponteiros é necessária para representar 10 ^ 9 convertidos em vetor de 6 elementos da representação base 32 e verifica se 4 existe em algum elemento.
fonte
Perl 6 , 16 bytes
Experimente online!
Verifica se existe uma representação
4
na base 32 do número. Retorna Nil como false ou um Match contendo a4
.Você pode provar isso pelo fato de25= 32 modo que cada dígito é o estado de cada ponteiro.
fonte
Python 2 ,
3432 bytesExperimente online!
2 bytes graças a tsh
fonte
Código da máquina x86, 17 bytes
Os bytes acima definem uma função que aceita o número como entrada no
EAX
registro e retorna o resultado como um valor booleano noEAX
registro (EAX
== 0 se a entrada não for um número rude;!EAX
= 0 se a entrada for um número rude )Em mnemônicos de montagem legíveis por humanos:
Experimente online!
fonte
idiv
, no entanto. Não vejo melhorias incrementais nisso. Mas veja minha resposta : 14 bytes para um loop de deslocamento que usa MOV / AND / SUB / JZ para verificar os baixos 5 bits quanto a grosseria.Julia 1.0 , 25 bytes
Experimente online!
Julia 1.0 , 26 bytes
Alternativa com 1 caractere mais curto, mas 1 byte mais, que pena que
∈
consome 3 bytes em unicode.Experimente online!
fonte
n->n%32...
para sua primeira resposta por 2 bytes mais curto?05AB1E , 5 bytes
Porto da resposta APL de @ Adám (dzaima / APL) .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
₆
é 36, não 32.Catholicon , 4 bytes
Pega um número como uma string de base 256.
Experimente online!
Suíte de teste
fonte
<<
e>>
permite números maiores que 255, como mostrado na suíte de testes.C # (compilador interativo do Visual C #) , 31 bytes
Saídas lançando uma exceção. A maneira como você converte um número de decimal para outra base é dividir o número decimal por essa base repetidamente e usar o restante como um dígito. É isso que fazemos, e verificamos se algum dos dígitos tem valor 4 na base 32;
Experimente online!
fonte
n>31
->n>0
J , 12 bytes
Experimente online!
fonte
R ,
50bytes 48Experimente online!
Agora, usa uma abordagem baseada em matriz pura (cortesia de @Giueseppe). Ele gera uma matriz de bits 5x7, converte isso em uma série de números inteiros base 32 e verifica se há 4s.
fonte
intToBits
mas então podemos trabalhar emints
vez deraw
que acaba economizando um byte - veja, por exemplo, isso comintToBits
4
em um número de base 32 é, oh, 29 bytes .Python 3 , 43 bytes
Verifica cada pedaço de 5 bits para ver se é rude (igual a 4).
Experimente online!
fonte
C (gcc) , 34 bytes
Experimente online!
fonte
Carvão , 6 bytes
Experimente online!Link é a versão detalhada do código. Saídas
-
s de acordo com a grosseria do número. Explicação:Eu uso a conversão de base de string para evitar ter que separar os literais numéricos para
32
e4
.fonte
Arrumado , 18 bytes
Experimente online! Verifica se
4
é um elemento debase(32,x)
(conversão de base).fonte
Haskell , 31 bytes
Experimente online!
fonte
Cubix , 26 bytes
Experimente online!
Envolve em um cubo com o comprimento da aresta 3 da seguinte maneira
Veja-o correr
Uma implementação bastante básica, sem todos os redirecionamentos que faz:
IS
inicia o programa pressionando a entrada e 32 na pilha%4-!
obtém o restante e verifica se é 4 por subtração1O@
saída 1 se fosse 4 e parar;;,
limpe a pilha e divida o número inteirop;?
limpe a parte inferior da pilha e verifique o resultado div para 0O@
se div resultar zero saída e parars
Troque a parte superior da pilha e comece na etapa 2 acimafonte
MATL , 8 bytes
Experimente online!
fonte
G
(não sei por que o incluí em primeiro lugar), mas isso é apenas um byte (obrigado por descobrir isso!). Mudar32YA52
para32_YA4
é o mesmo número de bytes, certo?'32_YA4'n'32YA52'n-
Lote,
7745 bytesCom base nesses pequenos truques . Explicação: Apenas 6 ponteiros precisam ser verificados devido ao alcance limitado (30 bits) da entrada que precisa ser suportado. O número mágico
m
é equivalente a111111
na base 32, de modo que a primeira operação alterna os bits rudes no número de entrada. Resta então descobrir qual das 6 mãos agora é zero.fonte
código de máquina x86, 14 bytes
(o mesmo código de máquina funciona em 16, 32 e 64 bits. No modo de 16 bits, ele usa AX e DI em vez de EAX e EDI no modo de 32 e 64 bits.)
Algoritmo: marque baixos 5 bits com
x & 31 == 4
, em seguida, desloque-se à direita em 5 bits e repita se o resultado da mudança for diferente de zero.É possível chamar de C com de
char isrude(unsigned n);
acordo com a convenção de chamada do System V x86-64. 0 é verdadeiro, não-0 é falso (isto é asm, não C 1 ).Isso tira proveito da
op al, imm8
codificação abreviada de AND e SUB. Eu poderia ter usadoXOR al,4
para produzir 0 na igualdade, mas o SUB é mais rápido, porque ele pode se fundir com o JZ em um único suboperador e ramificação na família Sandybridge.Curiosidade: usar o resultado da flag de um turno em mais de 1 será lento na família P6 (barracas de front-end até o turno se aposentar), mas tudo bem.
Nota de rodapé 1: Esta é uma função da linguagem assembly, e o x86 asm possui ambos
jz
ejnz
, conforme meta eu posso escolher de qualquer maneira. Não pretendo que isso corresponda a verdade / falsidade.Era conveniente retornar em AL em vez de EFLAGS, para que possamos descrever a função para um compilador C sem um wrapper, mas minha escolha de verdade / falsidade não é restrita usando um chamador C para testá-lo.
fonte
ES6,
313026 bytesSinta-se livre para dizer idéias sobre como reduzir isso ainda mais, se houver.
fonte
test
, na verdade, você pode salvar dois bytes comparando com4
um número e deixandomatch
converter isso em uma string e, em seguida, em um RegExp para você .Retina 0.8.2 , 31 bytes
Experimente online! O link inclui casos de teste. Emite zero, a menos que o número seja rude. Funciona convertendo a entrada em base unária e, em seguida, codificada em unária 32 e contando o número de
4
s no resultado.fonte
Java 8,
4033 bytesPorto da resposta APL de @ Adám (dzaima / APL) .
Experimente online.
Explicação:
fonte
> <> , 28 bytes
As saídas 4 para números rudes lançam uma exceção para números não rudes.
Experimente online!
fonte
Wolfram Language (Mathematica) ,
37 bytes36 bytes29 bytes-2 bytes por Jonathan Frech
Experimente online!
Solução de 31 bytes:
Experimente online!
fonte
...#...&
geralmente usada no Mathematica).[n]
no final, apenas o&
. Além disso, como as postagens têm histórico de edições, é bom deixar de fora as entradas anteriores, e a convenção para pontuações antigas é<s>40</s> <s>36</s>
Java 8,
282221 bytesInspirado na resposta de @ kevin-cruijssen . Só funciona para 2 mãos.
Experimente online!
Explicação:
fonte