Números excluibles


8

Dado un número entero N, genera el Nnúmero positivo th Kcon la siguiente propiedad en base decimal:

Para cada dígito Ien la posición Pde K, el número formado Kal eliminar el Pdígito th (es decir I) es divisible por I.

Ejemplo y observaciones

324 es tal número:

  • 3 divide 24
  • 2 divide 34
  • 4 divide 32

Nota 1: suponemos que el número vacío es divisible por cualquier cosa, como 0. Por lo tanto 1, 2, 3, 4, 5, 6, 7, 8y 9son válidas.

Nota 2: K no puede contener el dígito 0, ya que no puede dividir por 0.

Entradas y salidas

  • Puede tomar la entrada como un argumento de función, a través STDIN, etc.
  • Puede devolver la salida de una función, a través de STDOUT, etc.
  • Puede indexar esos números a partir de 0(en ese caso N >= 0) o de 1(en ese caso N > 0), lo que más le convenga.

Casos de prueba

Esos ejemplos están indexados desde 0, así que si indexó desde 1, luego agregue 1a los números en la Ncolumna.

N    Output
0    1
4    5
8    9
15   77
16   88
23   155
42   742
47   1113
121  4244
144  6888
164  9999

Puntuación

Este es el , por lo que gana la respuesta más corta en bytes.


Aquí hay una implementación de @LeakyNun y @FryAmTheEggman (ambos en Python) si desea más casos de prueba.
Fatalize



Respuestas:


4

Jalea , 21 19 bytes

DLR©œ^€®ịDḌḍ@DPȧµ#Ṫ

La entrada está indexada en 1. Pruébalo en línea!

Cómo funciona

DLR©œ^€®ịDḌḍ@DPȧµ#Ṫ  Main link. No arguments.

                µ    Convert the chain to the left into a link.
                 #   Read n from STDIN and execute the link to the left for
                     k = 0, 1, 2, ... until n value return a truthy value.
D                      Convert D to base 10 (digit array).
 LR                    Construct the range from 1 to the length of the digit array.
   ©                   Copy the range to the register.
       ®               Yield the value of the register.
    œ^€                Take the multiset difference of each element of the range
                       and the range itself.
        ịD             Index into the digit array.
          Ḍ            Convert each list of digits to integer.
                       This yields all numbers with one suppressed digit.
           ḍ@D         Test each of these numbers for divisibility by the
                       suppressed digit from the digit array.
              P        Take the product of the resulting Booleans.
               ȧ       Logical AND with k (k would return 1).
                  Ṫ  Tail; extract the last (nth) element.

4

Pyth, 20

e.f!s.e.x%s.D`Zksb1`

Pruébelo aquí o ejecute Test Suite

N está indexado en 1 para esta respuesta.

Utiliza en gran medida la misma lógica que mi script de Python. Las diferencias notables se utilizan .Dpara eliminar el dígito de la cadena durante la prueba y el manejo de excepciones para tratar con cero dígitos.


2

Pyth, 26 bytes

e.f&!/J`Z\0!s%VsM.DLJUJjZT

Banco de pruebas.

e.f&!/J`Z\0!s%VsM.DLJUJjZT
e.f                          The n-th number (Z) where:
    !/J`Z\0                      Z does not contain "0"
   &                             and
           !s                    the following does not contain zero:
               sM.DLJUJ              generate the set of the digits removed
                       jZT           all the digits
             %V                      modulus in parallel
                                     if Z is 324,
                                     the first set would be [24,34,32]
                                     the second set would be [3,2,4]
                                     the third set would be [24%3, 34%2, 32%4]

2

Python 2, 93 bytes

n=input();r=0
while n:r+=1;k=t=1;exec't&=(r/k/10*k+r%k)%(r/k%10or r)<1;k*=10;'*r;n-=t
print r

Muy ineficiente La entrada está indexada en 1. Pruébalo en Ideone .

Versión alternativa, 100 bytes.

El código anterior realiza aproximadamente 10 x pruebas de divisibilidad donde solo se requiere x . A costa de sólo 7 bytes adicionales , la eficiencia puede mejorarse drásticamente, ya sea mediante la sustitución *rcon *len(`r`)o refactorización el código de la siguiente manera.

n=input();r=0
while n:
 r+=1;k=t=1
 for _ in`r`:t&=(r/k/10*k+r%k)%(r/k%10or r)<1;k*=10
 n-=t
print r

Esto maneja todos los casos de prueba con facilidad, incluso en Ideone .


2

JavaScript (ES6), 82 78 76 bytes

f=(n,k=0)=>n?f(n-!eval(/0/.test(++k)+`${k}`.replace(/./g,"|'$`$''%$&")),k):k

La entrada está indexada en 1. Funciona construyendo una cadena del formulario false|'24'%3|'34'%2|'32'%4y evaluándolo. Las cadenas se usan porque siguen siendo sintácticamente válidas en el caso de un solo dígito.

La recursividad limita esto a aproximadamente n = 119. Versión iterativa para 88 84 82 bytes:

n=>{for(k=0;n;n-=!eval(/0/.test(++k)+`${k}`.replace(/./g,"|'$`$''%$&")));return l}

Editar: Guardado 2 bytes gracias a @ Dennis ♦.


"|'$`$''%$&"Guarda dos bytes.
Dennis

@ Dennis Gracias, sabía que tenía que haber una mejor manera de manejar ese caso extremo.
Neil

2

Rubí, 90

f=->n,s=?0{0while s.next![?0]||s[1]&&/t/=~s.gsub(/\d/){eval"#$`#$'%#$&>0"};n<1?s:f[n-1,s]}

Enfoque similar a la respuesta Javascript de Neil, pero significativamente más largo debido a la falta de conversión de tipo implícita (excepto que los booleanos se convierten en cadenas por gsub, lo cual es bueno).


1

Ruby, 109 bytes

->n{i=s=1;n.times{s=?0;s="#{i+=1}"while s[?0]||(0...x=s.size).any?{|i|(s[0,i]+s[i+1,x]).to_i%s[i].to_i>0}};s}

1

Hoon , 246 bytes

=+
x=0
|=
n/@
=+
k=<x>
=+
%+
levy
%+
turn
(gulf 0 (dec (lent k)))
|=
a/@
=+
(trim +(a) k)
=+
(rash (snag a p) dit)
?:
=(- 0)
|
=(0 (mod (fall (rust (weld (scag a p) q) dem) x) -))
(curr test &)
?:
=(- &)
?:
=(0 n)
x
$(n (dec n), x +(x))
$(x +(x))

Sin golf:

=+  x=0
|=  n/@
=+  k=<x>
=+  %+  levy
  %+  turn  (gulf 0 (dec (lent k)))
  |=  a/@
  =+  (trim +(a) k)
  =+  (rash (snag a p) dit)
  ?:  =(- 0)
    |
  =(0 (mod (fall (rust (weld (scag a p) q) dem) x) -))
(curr test &)
?:  =(- &)
  ?:  =(0 n)
    x
  $(n (dec n), x +(x))
$(x +(x))

Esto ... es realmente terrible. Me siento sucio por publicar esto.

Establezca kla forma de cadena del número actual, asigne sobre la lista [0...(length k)-1]dividiendo la cadena en ese índice ( a). Obtenga el acarácter, analícelo en un número y, si es, 0devuelva no. Obtenga el prefijo de ay suelde a la otra mitad de la división, analice un número, verifique si el índice lo divide de manera uniforme.

++levydevuelve yes iff llamando a la función en todos los elementos de la lista también es yes. En este caso, la función ++testcurry con yes, por lo que verifica que todos los caracteres kfuncionen.

Si estamos en el valor 0, devolvemos el número actual, o de lo contrario repetimos con n decrementado (e incremento x)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.