(Título con agradecimiento a @ChasBrown)
El fondo
Este desafío está inspirado en una pregunta que publiqué recientemente en Puzzling Stack Exchange . Siéntase libre de seguir el enlace si está interesado en la pregunta original. Si no, no te aburriré con los detalles aquí.
Los hechos
Cada carácter ASCII estándar imprimible tiene un valor decimal entre 32 y 126 inclusive. Estos se pueden convertir a sus números binarios correspondientes en el rango de 100000 a 1111110 inclusive. Cuando sumas los bits de estos números binarios, siempre terminarás con un número entero entre 1 y 6 inclusive.
El reto
Dado un entero entre 1 y 6 inclusive como entrada, escriba un programa o función que genere en cualquier formato aceptable todos los caracteres ASCII estándar imprimibles donde la suma de los bits de su valor binario sea igual al entero de entrada.
Los ejemplos / casos de prueba
1 -> ' @'
2 -> '!"$(0ABDHP`'
3 -> '#%&)*,1248CEFIJLQRTXabdhp'
4 -> ''+-.3569:<GKMNSUVYZ\cefijlqrtx'
5 -> '/7;=>OW[]^gkmnsuvyz|'
6 -> '?_ow{}~'
Aquí está disponible una implementación de referencia de Python no protegida (TIO) .
Las normas
- Suponga que la entrada siempre será un número entero (o representación de cadena de un número entero) entre 1 y 6 inclusive.
- Puede escribir un programa para mostrar los resultados o una función para devolverlos.
- La salida puede estar en cualquier formato razonable pero debe ser consistente para todas las entradas . Si elige generar una cadena entre comillas, se debe utilizar el mismo tipo de comillas para todas las entradas.
- Lagunas estándar prohibidas como de costumbre.
- Este es el código de golf, por lo que gana el código más corto en cada idioma.
63
vs?
)?'
) para la representación de cadena de una cadena por defecto, pero usa comillas dobles ("
) si la cadena contiene una comilla simple y no comillas dobles . No es que este caso específico importe mucho, ya que probablemente sea mejor que devuelva la cadena real en lugar de su representación, y de todos modos todavía puede usar comillas simples en dicha cadena para la entrada, pero creo que vale la pena mencionarlo aquí.« »
)? : DRespuestas:
8088 ensamblado, IBM PC DOS,
353029 bytesCodigo de maquina:
Listado:
Programa ejecutable PC DOS independiente, ingrese el número desde la línea de comandos. La salida se muestra en la ventana de la consola.
Descargue y pruebe ABCT.COM (AsciiBitCounT).
fuente
Conjunto CP-1610 ( Intellivision ), 20 DECLE 1 = 25 bytes
Tomanorte enR0y un puntero al búfer de salida enR4. Escribe todos los caracteres coincidentes en el búfer y marca el final de los resultados conNUL.
Salida para N = 2
NB: El paréntesis de apertura se parece mucho a un corchete de apertura en la fuente Intellivision. Sin embargo, ambos personajes son distintos.
captura de pantalla de jzIntv
1. Un código de operación CP-1610 está codificado con un valor de 10 bits, conocido como 'DECLE'. Esta rutina tiene una duración de 20 DECLE, desde $ 4819 hasta $ 482C (incluida).
fuente
Python 2 , 62 bytes
Pruébalo en línea!
fuente
sum(map(int,bin(i)[2:]))==n
puede llegarbin(i).count('1')==n
a ahorrar 7 bytes.05AB1E , 8 bytes
Pruébalo en línea!
Explicación
fuente
Perl 6 ,
4134 bytesPruébalo en línea!
Bloque de código anónimo que toma un número y devuelve una cadena de caracteres válidos.
Explicación:
Se puede demostrar que para cualquier númeronorte en la base si , n ≡ digitsum ( n )( modb - 1 ) (pista: recuerda quesi( modb - 1 ) = 1 ).
Podemos usar esto para obtener el dígito de nuestro número binario analizándolo como un número decimal y modulando por 9, lo cual es válido porque el rango de números que estamos utilizando tiene una garantía de menos de 9 bits. Esto se ve ayudado por la conversión automática de Perl 6 de la cadena binaria a un número decimal cuando se usa en un contexto numérico.
fuente
Jalea , 8 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) , 60 bytes
Usando el truco del módulo de Jo King
Pruébalo en línea!
JavaScript (Node.js) ,
7069 bytesPruébalo en línea!
Comentado
fuente
Brachylog , 7 bytes
Pruébalo en línea!
Un predicado que funciona como un generador , toma la entrada a través de su variable de salida y produce cada carácter a través de su variable de entrada. Porque Brachylog.
fuente
Japt , 9 bytes
Pruébalo o prueba todas las entradas
fuente
Excel (2016 o posterior), 76 bytes
Toma entradas de A1, salidas en cualquier celda en la que coloque esta fórmula. Esta es una fórmula de matriz, por lo que debe presionar Ctrl+ Shift+ Enterpara ingresarla. El "2016 o posterior" se debe a que necesita la
CONCAT
función (el obsoletoCONCATENATE
no tomará una matriz como argumento).fuente
C (biblioteca estándar),
7467 bytesUsando solo funciones de biblioteca estándar. Gracias a @gastropner por mejorar de 74 a 67 bytes.
Pruébalo en línea!
fuente
f(1)
caso (porque lo++i
omite).R ,
7768 bytesEnfoque utilizando para bucle
-9 bytes gracias a Giuseppe
Pruébalo en línea!
Previamente:
R ,
78 6966 bytes-12 bytes gracias a Giuseppe
Convierte los números 32 a 126 en una matriz de bits y luego suma a través de las filas para encontrar cuál coincide con el número de entrada.
Pruébalo en línea!
fuente
intToBits(x)>0
lugar deas.single
|0
y obtuve un error y simplemente asumí que los operadores lógicos no funcionarían.sapply
lugar dematrix
Java 10,
9897947067 bytes-24 bytes gracias a NahuelFouilleul .
Pruébalo en línea.
Explicación:
Contiene un carácter no imprimible con valor unicode
127
.fuente
n.bitCount
. :)Java 8,
13171 bytes-60 bytes gracias a todos en los comentarios
Devuelve un
java.util.stream.IntStream
código dePruébalo en línea!
Usando HashSet, 135 bytes. Devuelve a
Set<Object>
:Pruébalo en línea!
fuente
Long.toBinaryString(i)
puede serLong.toString(i,2);
C # (compilador interactivo de Visual C #) , 86 bytes
¡Gracias a @ExpiredData por darme la idea de usar
Sum()
! Cuando vuelva a mi PC, reemplazaré la cadena"0123456"
por no imprimibles, ahorrando tres bytes.Pruébalo en línea!
fuente
Sum()
!Dyalog APL Extended,
2422 bytesPruébalo en línea!
-2 bytes gracias a ngn
Alternativa de 22 bytes en Dyalog APL regular por ngn:
Pruébalo en línea!
fuente
(
expr)∘=
->⎕=
expr⎕ucs 32+⍸⎕=32↓+/↑,⍳7⍴2
(⎕io ← 0)Python 2 , 69 bytes
Pruébalo en línea!
fuente
Gaia , 10 bytes
Pruébalo en línea!
fuente
J ,
3127 bytes-4 bytes gracias a Galen
Pruébalo en línea!
Respuesta original
Pruébalo en línea!
2#:@i.@^8:
produce los números binarios del 0 al 255 (2 ^ 8
es 256)1#.
suma cada uno]=
produce una máscara binaria que muestra dónde la suma es igual a la entrada originala.#~ mask
usa esa máscara binaria para filtrar el alfabeto ascii completo de Ja.
&(95{.32}.])
pero antes de hacerlo, tome solo los elementos 32 ... 126 del alfabeto y la máscarafuente
[:u:32+[:I.]=1#.32#:@+i.@95
para 27 bytesi.@95
Perl 5
-a
,5043 bytes@NahuelFouilleul ahorra 7 bytes
Pruébalo en línea!
fuente
"@F"
lugar de$F[0]
%9
truco de @JoKingK (ngn / k) , 20 bytes
Solución:
Pruébalo en línea!
Explicación:
Evaluado de derecha a izquierda:
fuente
Conjunto 6502 (NES), 22 bytes
Codigo de maquina:
Montaje:
Programa completo . Probado con FCEUX 2.2.3, debería funcionar en cualquier emulador NES estándar.
Inspirado por la respuesta de Ryan Russell. Entrada dada en la dirección de la CPU $ 60. Salidas a la memoria de la unidad de procesamiento de imágenes de la consola.
fuente
Wolfram Language (Mathematica) , 70 bytes
Pruébalo en línea!
fuente
PowerShell , 83 bytes
Pruébalo en línea!
Toma entrada
$n
, construye un rango de32
a126
y saca esos números donde|?{}
: el número,convert
edToString
en la base2
;t
oCharArra convertidoy
;group
ed en0
sy1
s; tomando el[1]
índice de esa agrupación; tomando el.count
mismo y verificando que sea-eq
ual para nuestro número de entrada$n
. Esos números se lanzan como unachar
matriz y se dejan en la tubería. La salida es implícita, con nuevas líneas entre elementos.fuente
Ruby , 48 bytes
Pruébalo en línea!
fuente
Carbón , 10 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
PHP , 72 bytes
Pruébalo en línea!
fuente
count_chars(decbin($x),1)[49]
puede serdecbin($x)%9
Rojo , 92 bytes
Pruébalo en línea!
fuente
Octava con paquete de comunicaciones, 32 bytes
Pruébalo en línea!
fuente
Factor , 94 bytes
Pruébalo en línea!
fuente