(Título com agradecimentos a @ChasBrown)
O fundo
Esse desafio é inspirado em uma pergunta que eu postei recentemente no Puzzling Stack Exchange . Por favor, sinta-se livre para seguir o link se você estiver interessado na pergunta original. Caso contrário, não vou aborrecê-lo com os detalhes aqui.
Os fatos
Cada caractere ASCII padrão imprimível tem um valor decimal entre 32 e 126, inclusive. Eles podem ser convertidos em seus números binários correspondentes no intervalo de 100000 a 1111110, inclusive. Quando você soma os bits desses números binários, sempre termina com um número inteiro entre 1 e 6, inclusive.
O desafio
Dado um número inteiro entre 1 e 6, inclusive como entrada, escreva um programa ou função que produzirá em qualquer formato aceitável todos os caracteres ASCII padrão imprimíveis, em que a soma dos bits de seu valor binário é igual ao número inteiro de entrada.
Os exemplos / casos de teste
1 -> ' @'
2 -> '!"$(0ABDHP`'
3 -> '#%&)*,1248CEFIJLQRTXabdhp'
4 -> ''+-.3569:<GKMNSUVYZ\cefijlqrtx'
5 -> '/7;=>OW[]^gkmnsuvyz|'
6 -> '?_ow{}~'
Uma implementação de referência Python não-gasta está disponível aqui (TIO) .
As regras
- Suponha que a entrada sempre será um número inteiro (ou representação de string de um número inteiro) entre 1 e 6, inclusive.
- Você pode escrever um programa para exibir os resultados ou uma função para devolvê-los.
- A saída pode estar em qualquer formato razoável, mas deve ser consistente para todas as entradas . Se você optar por gerar uma string entre aspas, o mesmo tipo de aspas deverá ser usado para todas as entradas.
- Brechas padrão proibidas como de costume.
- Este é um código de golfe, pelo que o código mais curto em cada idioma vence.
63
vs?
)?'
) para a representação de uma string por padrão, mas usa aspas duplas ("
) se a string contiver uma aspas simples e sem aspas duplas . Não que esse caso específico seja importante, pois é melhor você retornar a string real em vez de sua representação, e ainda assim você pode usar aspas simples nessa string para entrada, mas acho que vale a pena mencionar aqui.« »
)? : DRespostas:
Montagem 8088, IBM PC DOS,
353029 bytesCódigo da máquina:
Listagem:
Programa executável autônomo do PC DOS, número de entrada da linha de comando. A saída é exibida na janela do console.
Faça o download e teste o ABCT.COM (AsciiBitCounT).
fonte
Montagem CP-1610 ( Intellivision ), 20 DECLEs 1 = 25 bytes
Leva em R0 e um ponteiro para o buffer de saída em R4 . Grava todos os caracteres correspondentes no buffer e marca o final dos resultados com NUL .N
Saída para N = 2
NB: O parêntese de abertura se parece muito com um colchete de abertura na fonte Intellivision. Ambos os personagens são distintos, no entanto.
captura de tela do jzIntv
1. Um código de operação CP-1610 é codificado com um valor de 10 bits, conhecido como 'DECLE'. Essa rotina dura 20 DECLEs, começando em US $ 4819 e terminando em US $ 482C (incluído).
fonte
Python 2 , 62 bytes
Experimente online!
fonte
sum(map(int,bin(i)[2:]))==n
pode tornarbin(i).count('1')==n
- se para salvar 7 bytes.05AB1E , 8 bytes
Experimente online!
Explicação
fonte
Perl 6 ,
4134 bytesExperimente online!
Bloco de código anônimo que pega um número e retorna uma sequência de caracteres válidos.
Explicação:
Podemos usar isso para obter o dígito do nosso número binário, analisando-o como um número decimal e modulando por 9, o que é válido porque o intervalo de números que estamos usando é garantido para ter menos de 9 bits. Isso é ajudado pela conversão automática do Perl 6 da string binária para um número decimal quando usado em um contexto numérico.
fonte
Gelatina , 8 bytes
Experimente online!
fonte
JavaScript (Node.js) , 60 bytes
Usando o truque de módulo de Jo King
Experimente online!
JavaScript (Node.js) ,
7069 bytesExperimente online!
Comentado
fonte
Braquilog , 7 bytes
Experimente online!
Um predicado que funciona como um gerador , recebe entrada através de sua variável de saída e produz cada caractere através de sua variável de entrada. Porque Brachylog.
fonte
Japonês , 9 bytes
Experimente ou teste todas as entradas
fonte
Excel (2016 ou posterior), 76 bytes
Pega a entrada de A1, sai em qualquer célula que você coloca nesta fórmula. Esta é uma fórmula de matriz, então você precisa pressionar Ctrl+ Shift+ Enterpara inseri-la. O "2016 ou posterior" é porque precisa da
CONCAT
função (o obsoletoCONCATENATE
não aceita uma matriz como argumento).fonte
C (biblioteca padrão),
7467 bytesUsando apenas funções de biblioteca padrão. Agradecemos a @gastropner para melhorar de 74 a 67 bytes.
Experimente online!
fonte
f(1)
caso (porque o++i
ignora).R ,
7768 bytesAbordagem usando o loop for
-9 bytes graças a Giuseppe
Experimente online!
Anteriormente:
R ,
78 6966 bytes-12 bytes graças a Giuseppe
Transforma os números 32 a 126 em uma matriz de bits e depois soma nas linhas para descobrir qual corresponde ao número de entrada.
Experimente online!
fonte
intToBits(x)>0
vez deas.single
|0
e obtive um erro e presumi que os operadores lógicos não funcionariam.sapply
vez dematrix
Java 10,
9897947067 bytes-24 bytes graças a NahuelFouilleul .
Experimente online.
Explicação:
Contém um caractere não imprimível com valor unicode
127
.fonte
n.bitCount
. :)Java 8,
13171 bytes-60 bytes graças a todos nos comentários
Retorna um
java.util.stream.IntStream
dos pontos de códigoExperimente online!
Usando HashSet, 135 bytes. Retorna a
Set<Object>
:Experimente online!
fonte
Long.toBinaryString(i)
pode serLong.toString(i,2);
C # (compilador interativo do Visual C #) , 86 bytes
Obrigado a @ExpiredData por me dar a ideia de usar
Sum()
! Quando voltar ao meu PC, substituirei a string"0123456"
por não imprimíveis, economizando três bytes.Experimente online!
fonte
Sum()
!Dyalog APL estendido,
2422 bytesExperimente online!
-2 bytes graças a ngn
Alternativa 22 bytes no Dyalog APL regular por ngn:
Experimente online!
fonte
(
expr)∘=
->⎕=
expr⎕ucs 32+⍸⎕=32↓+/↑,⍳7⍴2
(←io ← 0)Python 2 , 69 bytes
Experimente online!
fonte
Gaia , 10 bytes
Experimente online!
fonte
J ,
3127 bytes-4 bytes graças a Galen
Experimente online!
Resposta original
Experimente online!
2#:@i.@^8:
produz os números binários de 0 a 255 (2 ^ 8
é 256)1#.
soma cada um]=
produz uma máscara binária mostrando onde a soma é igual à entrada originala.#~ mask
usa essa máscara binária para filtrar o alfabeto ascii completo de Ja.
&(95{.32}.])
mas antes de fazer isso, pegue apenas os elementos 32 ... 126 do alfabeto e da máscarafonte
[:u:32+[:I.]=1#.32#:@+i.@95
para 27 bytesi.@95
Perl 5
-a
,5043 bytes@NahuelFouilleul salva 7 bytes
Experimente online!
fonte
"@F"
vez de$F[0]
%9
trick por @JoKingK (ngn / k) , 20 bytes
Solução:
Experimente online!
Explicação:
Avaliada da direita para a esquerda:
fonte
6502 assembly (NES), 22 bytes
Código da máquina:
Montagem:
Programa completo . Testado com o FCEUX 2.2.3, deve funcionar em qualquer emulador NES padrão.
Inspirado pela resposta de Ryan Russell. Entrada fornecida no endereço da CPU $ 60. Saídas para a memória da unidade de processamento de imagens do console.
fonte
Wolfram Language (Mathematica) , 70 bytes
Experimente online!
fonte
PowerShell , 83 bytes
Experimente online!
Recebe entrada
$n
, constrói um intervalo de32
até126
e retira esses números onde|?{}
: o número,convert
edToString
na base2
;t
oCharArra convertidoy
;group
ed em0
s e1
s; tomando o[1]
índice desse agrupamento; pegando o.count
mesmo e verificando se é-eq
útil para o nosso número de entrada$n
. Esses números são lançados como umachar
matriz e deixados no pipeline. A saída é implícita, com novas linhas entre elementos.fonte
Ruby , 48 bytes
Experimente online!
fonte
Carvão , 10 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
PHP , 72 bytes
Experimente online!
fonte
count_chars(decbin($x),1)[49]
pode apenas serdecbin($x)%9
Vermelho , 92 bytes
Experimente online!
fonte
Oitava com pacote de comunicações, 32 bytes
Experimente online!
fonte
Fator , 94 bytes
Experimente online!
fonte