Entrada
Un entero n (≥ 1) y un dígito d (un entero tal que 0 ≤ d ≤ 9).
En cualquier orden; de stdin o parámetros o lo que sea; a un programa o función; etc.
Salida
Los enteros de 1 a n inclusive (en orden) cuyas representaciones decimales contienen un número par de d s. (Es decir, los enteros en la lista son los enteros que tienen, respectivamente, un número par de d s.)
En cualquier formato estándar, etc. En particular, la salida no necesita representarse en decimal.
Si sale como una sola cadena, los enteros deben estar separados de alguna manera (espacios, comas, líneas nuevas, bytes nulos, lo que sea).
Ejemplos
in(d,n) ↦ out
1,12 ↦ 2 3 4 5 6 7 8 9 11
0,111 ↦ 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69,71,72,73,74,75,76,77,78,79,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99,100,111
Gracias
A quintapia por el título.
Respuestas:
Jalea, 7 bytes
Pruébalo en línea!
Cómo funciona
fuente
05AB1E ,
1110 bytesCódigo:
Explicación:
Pruébalo en línea
Utiliza la codificación CP-1252 .
fuente
Haskell,
69635250 bytesSolución directa para mi primera publicación aquí. Se utiliza
show
para contar el número ded
's. No utilicé explícitamenteChar
como entrada parad
, lo que habría ahorrado126 (después de la edición de Damien) bytes.EDITAR: 11 bytes menos gracias a Damien! EDIT 2: otros 2 bytes menos gracias a nimi!
fuente
Befunge,
1080945 bytesSe da la puntuación de que contamos todo el cuadrado, incluidas las nuevas líneas, lo que tiene sentido. Puede copiar y pegar el código en el intérprete . Proporcione dos entradas, primero d y luego n . Esta solución no funciona para valores mayores que n > 999.
Obviamente, esto no será un candidato para el gran premio, pero he querido implementar un codegolf en Befunge durante un tiempo, así que decidí hacerlo. Me imagino que esto ni siquiera se acercará a una solución óptima de Befunge, ya que es lo primero que hago en Befunge. Por lo tanto, las sugerencias son bienvenidas, si necesita aclaraciones o más información, hágamelo saber en los comentarios.
Intento de explicación:
En la primera columna hacia abajo, leemos un número entero de la entrada, agregamos 48 (6 * 8, lo verá con más frecuencia) para convertirlo al valor ASCII correspondiente y ponerlo
(10, 0)
.&
- leer entrada68*+
- agregar 4855+0p
- poner el valor en(10, 0)
Tenga en cuenta que
d
at(1, 0)
es solo una manera fácil de obtener el número 100 en la pila.Después de eso, vamos al este y leemos otro número entero y nos dirigimos a lo que llamo el ASCIIfier. Esto convierte el número actual en una serie de caracteres ASCII. El ASCIIfier es la pieza rectangular de
(13, 12)
a(26, 17)
. Consiste en dos bucles, primero contando los cientos y luego las decenas y poniéndolos en los tres dígitos en(6, 0)
y(5, 0)
. Después de eso se pone el último dígito(4, 0)
. Entonces los números están en realidad en reversa.Después de poner el número entero actual en una serie de caracteres ASCII, vamos un poco más al sur para eliminar los ceros antepuestos. Por lo tanto, luego, lo que inicialmente son los tres ceros en la parte superior, será el número actual, sin ceros antepuestos.
Luego volvemos a subir, todo el camino hacia el norte, donde ponemos los tres dígitos en la pila. Repetimos los tres dígitos en el bucle superior, incrementando cada vez el contador ubicado en
(1, 1)
si el dígito actual corresponde con la entrada dCuando eso está hecho, vamos y verificamos si el contador que está ubicado en
(1, 1)
es impar o par. Si es par, sacamos el número actual y pasamos al gran bucle externo para disminuir el valor actual y comenzar de nuevo.fuente
Python 2, 50 bytes
Una función recursiva que toma el dígito
d
como una cadena y el límite superiorn
como un número.El recuento de dígitos
d
en 'sn
se prueba para ser aún tomándolo de bits complemento módulo 2, lo que da1
por uniforme y0
para odd. Este númeron
se agrega a la lista, y la función recurre an-1
, deteniéndose a través de un cortocircuito lógico en la lista vacía cuandon==0
.Si la salida se puede dar en orden decreciente, se puede guardar un byte, para 49 bytes:
Antigua solución de 51 bytes:
Una función anónima que toma el dígito
d
como una cadena y el límite superiorn
como un número.Se usan dos trucos:
range
está indexado a cero0...n-1
, por lo que agregamos uno a cada valor potencialx
. Entonces, para contard
que está enx+1
, se ahorra un personaje para utilizar su negación~x
en su lugar.~_%2
, qué primer bit cambia para cambiar la paridad, luego toma el último bit con&1
(igual que%2
aquí), produciendo un valor verdadero solo si el original era par.fuente
Pyth, 10 bytes
Pruébalo en línea. Banco de pruebas.
fuente
Lua, 86 bytes
Si se permite el uso de un separador inconsistente, podría reemplazarlo
io.write
porprint
, lo que significa que los números estarían separados por una o varias líneas nuevas.Se trata de un programa completo, que tiene que ser llamado como esto:
lua file.lua d n
.Elimina todos los
d
caracteres que no son del número actual y utiliza el tamaño de la cadena resultante para decidir si se debe superar o no.fuente
JavaScript (ES6) 64
Una función anónima con salida a la consola. Implementación sencilla usando
split
para contar los dígitos.El uso de salida
alert
sería de 6 bytes menos, pero realmente no me gusta (y no voy a superar los idiomas de juguete de todos modos)fuente
MATL ,
1210 bytesLa primera entrada es n , la segunda es d como una cadena. Por ejemplo:
Pruébalo en línea!
fuente
Ruby,
4742 bytesEjecutar con d y n como parámetros de línea de comandos, p. Ej.
fuente
?1
para"1"
. Y es menos bonito, pero un byte más corto que hacer en%2>0
lugar de.odd?
PowerShell,
6255editar: usar un bloque param en este caso es más corto. eliminado algo de espacio redundante
No es un lenguaje de golf, pero es el único que realmente conozco. Esto funcionaría guardado como un script y llamado así
M:\Scripts\cgNeverTellMeTheOdds.ps1 1 12
. El primer argumento es el dígito d y el segundo es el número entero n .Crea una matriz del número 1 a n . Para cada uno de esos convertir eso en una matriz de caracteres. 10 sería 1,0. Utilizando
-match
como operador de matriz, devuelve todos los elementos que coinciden con el dígito d . Cuente la cantidad de elementos devueltos y mod 2 el resultado. El resultado será 0 para pares y 1 para impares. 0 como booleano es falso, por lo que usamos!
para el bucle para evaluar los resultados impares a falso y los resultados pares a verdadero.La salida es una nueva línea delimitada en la consola.
fuente
Retina ,
99105 bytesTenga en cuenta los espacios finales.
<empty>
representa una línea vacíaToma entrada como
1 12
. La salida está separada por espacios en orden decreciente.Modifiqué
0*1(0|10*1)*
para que coincida con un número impar de\1
un número. Cambié0
a(?!\1)\d
, y1
para\1
crear la larga línea de expresiones regulares que ves arriba. Comprender cómo funciona la expresión regular vinculada es crucial.Pruébalo en línea
Explicación comentada de la versión anterior.
Si el orden descendente estuviera bien
fuente
1+
y$.0
para realizar la conversión de unario a decimal.Bash + GNU utilidades, 37
fuente
*
siguiente paréntesis de apertura parece ser redundante. Eliminarlo te ahorra 1 byte.Python 3.4,
92857985 bytesGuardado 7 bytes gracias a Mego
Guardado otros 6 bytes gracias a mbomb007 Recuperó
esos 6 bytes porque Python 3.x
Esta es mi primera oportunidad en el código de golf, ¡así que aquí no pasa nada!
fuente
`d`
lugar destr(d)
, y si asume que n es un número entero (<2 ** 32), puede usar en`i`
lugar destr(i)
.__repr__
python 2, se eliminaron en python 3. Probablemente debería cambiar su encabezado para reflejar esa restricción.Perl 6, 38 bytes
fuente
Brachylog , 32 bytes
Espera N como entrada y el dígito como salida, p. Ej.
brachylog_main(12,1).
Explicación
fuente
Mathematica, 54 bytes
fuente
Perl, 28
2931bytesIncluye +2 para
-an
Ejecute con el dígito de especificación y cuente con líneas consecutivas en STDIN:
fuente
Oracle SQL 11.2,
11182 bytesfuente
Kotlin, 136 bytes
Programa completamente funcional, toma argumentos como: nd
Pruébalo en línea!
fuente
Java 8, 84 bytes
Esta es una expresión lambda para a
BiConsumer< Integer, Integer>
:Explicación:
para cada número entre 1 yn, convierta el número en una cadena y divídalo usando d como delimitador. Si se dividió en un número impar de secciones, imprima el número seguido de una nueva línea.
fuente
Retina,
727155¡Muchas gracias a Martin, quien por accidente me recordó a los grupos de emparejamiento atómico!
Pruébalo en línea!
Explicación:
Reemplace el número, pero no el dígito, con su equivalente unario.
\B
coincide con cada posición (ancho cero) que no es un límite de palabra. Tenga en cuenta que esto no coincidirá con ninguno de los siguientes: el comienzo de la cadena, el final de la cadena o cualquier posición alrededor del carácter de coma. Cada uno de estos no límites se reemplaza con una nueva línea y luego la cadena que viene antes del partido ($`
). Esto da una lista como:¿Dónde
d
está cualquier dígito decimal único?Esto convierte todas las listas de
1
s en la representación decimal de sus longitudes. Esto convenientemente no afectará lo1
que podría estar antes de la coma, ya que su longitud siempre1
es igual.Aquí, se
G
activa el modo grep, lo que significa que se mantienen las líneas que coinciden con la expresión regular y se descartan otras líneas. Esta expresión regular es complicada, pero esencialmente coincide con grupos de 2 del dígito inicial (almacenado en el grupo de captura 1, por lo que podemos hacer referencia a él\1
).La clave aquí es que si falla al usar la coincidencia no codiciosa hasta las dos primeras apariciones de los dígitos, entonces simplemente retrocedería e intentaría nuevamente, haciendo
.
coincidir el dígito. Esto haría que números como 111 coincidan cuando nuestro dígito sea 1. Por lo tanto, usamos?>
para hacer que la coincidencia sea atómica, esencialmente evitando que la expresión regular retroceda antes de que coincida con este valor. Un emparejamiento atómico funciona de manera similar a como lo haría un emparejamiento posesivo en ciertos sabores. Como el*
metacaracteres es seguido por un,?
los.
caracteres coincidirán hasta que pueda coincidir con lo que almacenamos\1
. Luego, una vez que hacemos esto dos veces, la "memoria" de la expresión regular se destruye, evitando el comportamiento que normalmente ocurriría, donde regresa y tiene el.
coincide con un carácter adicional, nuestro\1
dígito, que crearía coincidencias no válidas.Luego, verificamos que desde la posición final, después de hacer coincidir grupos repetidos de dos dígitos de entrada, no podemos hacer coincidir otro dígito de entrada.
Aquí solo estamos eliminando el dígito y la coma de cada una de las cadenas, por lo que solo obtenemos nuestra buena respuesta.
fuente
Python 2,
5754 bytesUso
fuente
Julia, 44 bytes
Esta es una función que acepta dos enteros y devuelve una matriz.
Comenzamos con el conjunto de enteros del 1 al
n
, inclusive. Para cada número enteroi
, determinamos cuáles de sus dígitos decimales son igualesd
, lo que produce una matriz booleana. Hacemossum
esto para obtener el número de ocurrencias ded
como un dígitoi
yfilter
el rango original basado en la paridad de la suma.Pruébalo aquí
fuente
En serio, 17 bytes
Toma entradas como
n\n'd'
(entero, nueva línea, cadena).Pruébalo en línea!
Explicación:
fuente
Mathematica, 45 bytes
Utiliza el incorporado
DigitCount
.fuente
Japt,
1312 bytesLa entrada es n , luego d entre comillas. ¡Pruébelo en línea!
Cómo funciona
fuente
CJam, 38 bytes
Explicación
fuente
Scala, 66 bytes
fuente
R, 145 bytes (estoy seguro de que hay formas de acortar esto aún más) :)
fuente