Números hostis do divisor


31

Alguns divisores de números inteiros positivos realmente se odeiam e não gostam de compartilhar um ou mais dígitos comuns.

Esses números inteiros são chamados de números de divisor hostis ( HDN )

Exemplos

O número 9566tem 4divisores: 1, 2, 4783 and 9566
(como você pode ver, nenhum deles compartilha o mesmo dígito ).
Assim, 9566 é um H ostile D iVisor N úmero

O número NÃO9567 é HDN porque seus divisores ( ) compartilham alguns dígitos comuns. 1, 3, 9, 1063, 3189, 9567

Aqui estão os primeiros HDN

1,2,3,4,5,6,7,8,9,23,27,29,37,43,47,49,53,59,67,73,79,83,86,87,89,97,223,227,229,233,239,257,263,267,269,277,283,293,307,337...       


Tarefa

A lista acima continua e sua tarefa é encontrar o enésimo HDN

Entrada

Um número inteiro positivo nde 1a4000

Saída

O nth HDN

Casos de teste

Aqui estão alguns casos de teste indexados em 1 .
Indique qual sistema de indexação você usa em sua resposta para evitar confusão.

input -> output     
 1        1     
 10       23       
 101      853     
 1012     26053     
 3098     66686      
 4000     85009      

Isso é , então a pontuação mais baixa em bytes vence.

EDITAR

Boas notícias! Enviei minha sequência para o OEIS e ...
Os números dos divisores hostis agora são OEIS A307636


1
Eu acho que os números quadrados seriam os menos hostis .
— Frambot

3
@ JoeFrambach Isso eu não entendo. Há um HDN quadrado perfeito. Para um exemplo um tanto grande 94699599289, o quadrado de 307733, possui divisores [1, 307733, 94699599289]que mostram que é um HDN. Parece hostil para mim.
— Jeppe Stig Nielsen

@JeppeStigNielsen Para um exemplo muito menor, por que não apenas 49? Fatores [1, 7, 49]qualifica como hostil ... ou, bem, 4: [1, 2, 4]...
— Darrel Hoffman

@ DarrelHoffman Sem mencionar o número do quadrado 1com a lista do divisor [1]. (Talvez o HDN grande seja mais interessante?)
— Jeppe Stig Nielsen

Eu interpretei 49como tendo divisores [7, 7] , que não apenas compartilham dígitos, mas são os mesmos dígitos. 49tem fatores [1, 7, 49]
— Frambot

Respostas:


9

05AB1E , 12 10 bytes

µNNÑ€ÙSDÙQ

-2 bytes graças a @Emigna .

Indexado 1

Experimente online ou verifique a maioria dos casos de teste (os dois últimos casos são omitidos, pois atingem o tempo limite).

Explicação:

µ           # Loop while the counter_variable is not equal to the (implicit) input yet:
 N          #  Push the 0-based index of the loop to the stack
  NÑ        #  Get the divisors of the 0-based index as well
            #   i.e. N=9566 → [1,2,4783,9566]
            #   i.e. N=9567 → [1,3,9,1063,3189,9567]
    €Ù      #  Uniquify the digits of each divisor
            #   → ["1","2","4783","956"]
            #   → ["1","3","9","1063","3189","9567"]
      S     #  Convert it to a flattened list of digits
            #   → ["1","2","4","7","8","3","9","5","6"]
            #   → ["1","3","9","1","0","6","3","3","1","8","9","9","5","6","7"]
       D    #  Duplicate this list
        Ù   #  Unique the digits
            #   → ["1","2","4","7","8","3","9","5","6"]
            #   → ["1","3","9","0","6","8","5","7"]
         Q  #  And check if it is still equal to the duplicated list
            #   → 1 (truthy)
            #   → 0 (falsey)
            #  And if it's truthy: implicitly increase the counter_variable by 1
            # (After the loop: implicitly output the top of the stack,
            #  which is the pushed index)

2
Você me venceu desta vez. Eu tinha µNNÑ€ÙSDÙQpor 10.
— Emigna

2
@ Emigna Ah, eu estava apenas trabalhando em uma alternativa µ, para que você me salve o problema. ;)
— Kevin Cruijssen

isso é poeticamente eloquente
— don bright


6

JavaScript (ES6), 78 bytes

1 indexado.

n=>eval("for(k=0;n;n-=!d)for(s=d=++k+'';k%--d||d*!s.match(`[${s+=d,d}]`););k")

Experimente online!

Versão mais rápida, 79 bytes

n=>{for(k=0;n;n-=!d)for(s=d=++k+'';k%--d||d*!s.match(`[${s+=d,d}]`););return k}

Experimente online!

Quão?

Dado um número inteiro k>0 , construímos a string s como a concatenação de todos os divisores de k .

Como k é sempre um divisor de si mesmo, s é inicializado como k (coagido a uma string) e o primeiro divisor que tentamos é d=k−1 .

dkdsd

Exemplos

  • s="956647832"d=1"956647832".match(/[1]/)
  • s="9567"d=3189"9567".match(/[3189]/)

Comentado

Esta é a versão sem eval(), para facilitar a leitura

n => {                   // n = input
  for(                   // for() loop:
    k = 0;               //   start with k = 0
    n;                   //   go on until n = 0
    n -= !d              //   decrement n if the last iteration resulted in d = 0
  )                      //
    for(                 //   for() loop:
      s =                //     start by incrementing k and
      d = ++k + '';      //     setting both s and d to k, coerced to a string
      k % --d ||         //     decrement d; always go on if d is not a divisor of k
      d *                //     stop if d = 0
      !s.match(          //     stop if any digit of d can be found in s
        `[${s += d, d}]` //     append d to s
      );                 //
    );                   //   implicit end of inner for() loop
                         // implicit end of outer for() loop
  return k               // return k
}                        //

6

Gelatina , 10 bytes

ÆDQ€FQƑµ#Ṫ

Experimente online!

-1 byte graças a ErikTheOutgolfer

Recebe informações do STDIN, o que é incomum para o Jelly, mas normal onde nfindé usado.

ÆDQ€FQƑµ#Ṫ  Main link
         Ṫ  Get the last element of
        #   The first <input> elements that pass the filter:
ÆD          Get the divisors
  Q€        Uniquify each (implicitly converts a number to its digits)
    F       Flatten the list
     QƑ     Does that list equal itself when deduplicated?

Indexado em 2


isso é 2 indexado? Está tudo bem comigo, mas por favor indique para os outros
— J42161217 03/05


3
Não, não é. 101 retorna 839. e 102 -> 853. Funciona bem, mas é indexado em 2
— J42161217

1
@ J42161217 espera o que? Eu acho que quando mudei o nfindmudou a indexação lol
— HyperNeutrino

1
⁼Q$é o mesmo que QƑ.
— Erik the Outgolfer

4

Perl 6 , 53 bytes

{(grep {/(.).*$0/R!~~[~] grep $_%%*,1..$_},^∞)[$_]}

Experimente online!

1 indexado.

/(.).*$0/ corresponde a qualquer número com um dígito repetido.

grep $_ %% *, 1 .. $_retorna uma lista de todos os divisores do número que $_está sendo verificado no momento para associação à lista.

[~]concatena todos esses dígitos juntos e, em seguida, R!~~combina a string à direita com o padrão à esquerda. ( ~~é o operador de correspondência usual, !~~é a negação desse operador e Ré um metaoperador que troca os argumentos de !~~.)




3

Wolfram Language 103 bytes

Usa indexação 1. Estou surpreso por ter exigido muito código.

(k=1;u=Union;n=2;l=Length;While[k<#,If[l[a=Join@@u/@IntegerDigits@Divisors@#]==l@u@a&@n,k++];n++];n-1)&

Você pode adicionar um link TIO para que todos possam verificar sua resposta?
— J42161217

95 bytes: (n=t=1;While[t<=#,If[!Or@@IntersectingQ@@@Subsets[IntegerDigits@Divisors@n,{2}],t++];n++];n-1)&não estou planejando postar uma resposta, portanto deixarei isso aqui
— J42161217

@ J42161217, estou tentando fazer com que o código funcione no TIO sem sucesso. Deve haver algum truque que estou perdendo.
— DavidC

@ J42161217, seu código parece funcionar, mas leva três vezes o tempo de execução. Você pode enviá-lo como seu. (Talvez eu aprenda a implementar o TIO a partir do seu exemplo.)
— DavidC

Muito rápido mesmo! aqui está o seu link Experimente online!
— J42161217

3

PowerShell , 112 bytes

for($a=$args[0];$a-gt0){$z=,0*10;1..++$n|?{!($n%$_)}|%{"$_"|% t*y|sort -u|%{$z[+"$_"]++}};$a-=!($z|?{$_-ge2})}$n

Experimente online!

Recebe entrada indexada em 1 $args[0], armazena isso em $a, faz um loop até que seja atingido 0. A cada iteração, zeramos uma matriz de dez elementos $z(usada para armazenar nossas contagens de dígitos). Então construímos nossa lista de divisores com 1..++$n|?{!($n%$_)}. Para cada divisor, convertemos para uma string "$_", toCharArra ye sortesses dígitos com o -usinalizador nique (porque não nos importamos se o próprio divisor possui dígitos duplicados). Em seguida, incrementamos a contagem de dígitos apropriada $z. Então, decrementamos $aapenas se $zcontiver 0s e 1s (ou seja, encontramos um HDN). Se terminamos nosso forloop, significa que encontramos o número apropriado de HDNs, então deixamos $no pipeline e a saída está implícita.


você pode salvar alguns bytes: em $a-=!($z-ge2)vez disso$a-=!($z|?{$_-ge2})
— mazzy


3

Python 3 , 115 bytes

Indexado 1

f=lambda n,x=1,s="",l="",d=1:n and(d>x+1and f(n-1,x+1)or{*s}&{*l}and f(n,x+1)or f(n,x,s+l,(1-x%d)*str(d),d+1))or~-x

Experimente online!

Isso usa muita recursão; mesmo com o aumento do limite de recursão, não é possível f(30). Eu acho que pode ser ainda mais jogável, e tentei encontrar algo para substituir o (1-x%d), mas não consegui encontrar nada ( -~-x%dtem a precedência errada). Quaisquer bytes que possam ser raspados são muito apreciados.

Como funciona

# n: HDNs to go
# x: Currently tested number
# s: String of currently seen divisor digits
# l: String of digits of last tried divisor if it was a divisor, empty string otherwise
# d: Currently tested divisor

f=lambda n,x=1,s="",l="",d=1:n and(                    # If there are still numbers to go
                             d>x+1and f(n-1,x+1)or     # If the divisors have been
                                                       #  exhausted, a HDN has been found
                             {*s}&{*l}and f(n,x+1)or   # If there were illegal digits in
                                                       #  the last divisor, x isn't a HDN
                             f(n,x,s+l,(1-x%d)*str(d),d+1)
                                                       # Else, try the next divisor, and
                                                       #  check this divisor's digits (if
                                                       #  if is one) in the next call
                             )or~-x                    # Else, return the answer

2

Braquilog (v2), 14 bytes

;A{ℕfdᵐc≠&}ᶠ⁽t

Experimente online!

Envio de função; entrada da esquerda, saída para a direita. (O link TIO contém um argumento de linha de comando para executar uma função como se fosse um programa completo.)

Explicação

"Esse é um número divisor hostil?" código do :

ℕfdᵐc≠
ℕ       number is ≥0 (required to match the question's definition of "nth solution")
 f      list of all factors of the number
   ᵐ    for each factor
  d       deduplicate its digits
    c   concatenate all the deduplications with each other
     ≠  the resulting number has no repeated digits

Isso acabou basicamente o mesmo que o do @ UnrelatedString, embora eu tenha escrito de forma independente.

Wrapper "nésima solução para um ":

;A{…&}ᶠ⁽t
    &      output the successful input to
  {  }ᶠ    the first n solutions of the problem
       ⁽   taking <n, input> as a pair
;A         form a pair of user input and a "no constraints" value
        t  take the last solution (of those first n)

Esse é um daqueles casos em que o wrapper necessário para produzir a enésima saída é significativamente maior que o código necessário para testar cada saída por vez :-)

Eu vim com esse invólucro independentemente do @ UnrelatedString. É do mesmo tamanho e funciona com o mesmo princípio, mas de alguma forma acaba sendo escrito de maneira bastante diferente. Ele tem mais possibilidades de aprimoramento, pois poderíamos adicionar restrições sobre quais valores estávamos procurando gratuitamente, substituindo-os Apor alguma variável de restrição, mas nenhuma das possíveis variáveis ​​de restrição salva bytes. (Se houvesse uma variável de restrição "número inteiro não negativo", você poderia substituí A-lo por ela e salvar um byte, tornando ℕdesnecessário.)


É 2 indexado?
— FrownyFrog

2

Java 10, 149 139 138 126 125 120 119 bytes

n->{int r=0,i,d;for(;n>0;n-=d){var s="1";for(r+=d=i=1;i++<r;)if(r%i<1){d=s.matches(".*["+i+"].*")?0:d;s+=i;}}return r;}

-10 bytes usando em .matchesvez de .containspor dígito, inspirado na resposta JavaScript de @Arnauld .
-5 bytes graças a @ValueInk
-1 byte graças a @ceilingcat

Indexado 1

Experimente online.

Explicação:

n->{                 // Method with integer as both parameter and return-type
  int r=0,           //  Result-integer, starting at 0
      i,             //  Index integer
      d;             //  Decrement integer
  for(;n>0;          //  Loop until the input `n` is 0:
      n-=d){         //    After every iteration: decrease `n` by the decrement integer `d`
    var s="1";       //   Create a String `s`, starting at "1"
    for(r+=d=i=1;    //   (Re)set the decrement and index integers to 1,
                     //   and increase the result by 1 as well
        i++<r;)      //   Inner loop `i` in the range [2, r]:
      if(r%i<1){     //    If `r` is divisible by `i`:
        d=s.matches(".*["+i+"].*")?
                     //     If string `s` contains any digits also found in integer `i`:
           0         //      Set the decrement integer `d` to 0
          :d;        //     Else: leave `d` unchanged
        s+=i;}}      //     And then append `i` to the String `s`
  return r;}         //  After the loops, return the result `r`


@ValueInk Thanks! :)
— Kevin Cruijssen

1

Braquilog , 16 bytes

g{∧0<.fdᵐc≠∧}ᵘ⁾t

Experimente online!

Muito lento e o dobro do tempo, se isso fosse um . 1 indexado.

                    The output
               t    is the last
             ᵘ⁾     of a number of unique outputs,
g                   where that number is the input,
 {          }       from the predicate declaring that:
     .              the output
    <               which is greater than
   0                zero
  ∧                 (which is not the empty list)
      f             factorized
        ᵐ           with each factor individually
       d            having duplicate digits removed
          ≠         has no duplicate digits in
         c          the concatenation of the factors
           ∧        (which is not the output).

1
Se você acabou de ler essa explicação como uma frase ...
— FireCubez

Eu tento escrever minhas explicações como o inglês comum, que normalmente acaba dificultando a leitura
— String não relacionada


1

Japt v2.0a0, 17 bytes

_=â ®sâìUµZ¶â}f1

Tente

Porta desta resposta Brachylog .

Crédito: economia total de 4 bytes graças a Shaggy, que também sugeriu que havia uma solução melhor, levando a muito mais bytes :)


Resposta original abordagem de 28 bytes:

Èâ¬rÈ«è"[{Y}]" ©X+Y}Xs)«U´Ãa

Tente

Porta desta resposta JavaScript .



Bom - eu não tinha usado o «atalho antes :) Eu acho que se o Shaggy só estiver melhorando minha pontuação com um punhado de bytes, devo estar ficando (um pouco) decente nisso?
— dana

Isso pode ser feito em 20 (talvez menos) b7, empregando um método ligeiramente diferente.
— Shaggy

Hah - acho que falei cedo demais :) sim, alguns dos outros langs do golfe têm soluções muito mais curtas.
— dana


0

Ícone , 123 bytes

procedure f(n)
k:=m:=0
while m<n do{
k+:=1
r:=0
s:=""
every k%(i:=1 to k)=0&(upto(i,s)&r:=1)|s++:=i
r=0&m+:=1}
return k
end

Experimente online!

1 indexado. Muito lento para grandes entradas.





0

J , 87 59 bytes

-28 bytes graças ao FrownFrog

0{(+1,1(-:~.)@;@(~.@":&.>@,i.#~0=i.|])@+{.)@]^:(>{:)^:_&0 0

Experimente online!

original

J , 87 bytes

[:{:({.@](>:@[,],([:(-:~.)[:-.&' '@,/~.@":"0)@((]#~0=|~)1+i.)@[#[)}.@])^:(#@]<1+[)^:_&1

Experimente online!

Caramba.

Isso é atrozmente longo para J, mas não estou vendo ótimas maneiras de derrubá-lo.

explicação

Ajuda a introduzir alguns verbos auxiliares para ver o que está acontecendo:

d=.(]#~0=|~)1+i.
h=. [: (-:~.) [: -.&' '@,/ ~.@":"0
  • d retorna uma lista de todos os divisores de seu argumento
  • hdiz que essa lista é hostil. Ele especifica e deduplica cada número ~.@":"0, que retorna uma matriz quadrada na qual números mais curtos são preenchidos com espaços. -.&' '@,/nivela a matriz e remove espaços e, finalmente, (-:~.)informa se esse número se repete ou não.

Com esses dois ajudantes, nosso verbo não-gobrado se torna:

[: {: ({.@] (>:@[ , ] , h@d@[ # [) }.@])^:(#@] < 1 + [)^:_&1

Aqui mantemos uma lista cuja cabeça é o nosso "candidato atual" (que começa em 1) e cuja cauda são todos os números hostis encontrados até agora.

Nós incrementamos o cabeçalho da lista >:@[em cada iteração e apenas anexamos o "candidato atual" se for hostil h@d@[ # [. Nós continuamos fazendo isso até que o nosso comprimento lista atinge 1 + n: ^:(#@] < 1 + [)^:_.

Finalmente, quando terminamos, retornamos o último número desta lista, [: {:que é o enésimo número hostil.




Isso é ótimo, muito obrigado. Vai passar por isso e atualizar hoje à noite
— Jonah

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.