Menor Expoente Diversificador


20

Um número pandigital é um número inteiro que contém todos os dígitos de 0 a 9 pelo menos uma vez. 1234567890, 1902837465000000 e 9023289761326634265 são todos pandigitais. Para os fins deste desafio, números como 123456789 não são pandigitais, pois não contêm um 0, mesmo que 123456789 = 0123456789.

Um par diverso de números inteiros é um par de números inteiros tal que é pandigital. é chamado expoente diversificador .(a,b)abb

Desafio: Dado um número inteiro , encontre o menor expoente diversificador correspondente . Este é um , portanto o programa mais curto em bytes vence.ab

(Você pode assumir que existe um expoente, ou seja, seu programa não receberá entrada inválida, como uma potência de 10.)

Sua solução deve poder manipular no mínimo os casos de teste fornecidos, mas teoricamente deve manipular todas as entradas válidas.

Este é o A090493 no OEIS.

Casos de teste

2 -> 68
3 -> 39
4 -> 34
5 -> 19
6 -> 20
7 -> 18
8 -> 28
9 -> 24
11 -> 23
12 -> 22
13 -> 22
14 -> 21
15 -> 12
16 -> 17
17 -> 14
18 -> 21
19 -> 17
20 -> 51
21 -> 17
22 -> 18
23 -> 14
24 -> 19
25 -> 11
26 -> 18
27 -> 13
28 -> 11
29 -> 12
30 -> 39
31 -> 11
32 -> 14
33 -> 16
34 -> 14
35 -> 19
36 -> 10
1234567890 -> 1

3
Quero apontar um caso especial 1234567890 -> 1.
Bubbler

@Bubbler Adicionado.
Conor O'Brien

expoentes negativos estão fora dos limites?
sudo rm -rf slash

1
Algo como 123456789conta como pandigital? É igual a 0123456789, que é definitivamente pandigital.
Wastl

1
@ Wastl não, não.
Conor O'Brien

Respostas:


9

Brachylog (v2), 9 bytes

;.≜^dl10∧

Experimente online!

Este é um envio de função. O link TIO contém um wrapper que transforma uma função em um programa completo.

Explicação

;.≜^dl10∧
 .≜        Brute-force all integers, outputting the closest to 0
;  ^         for which {the input} to the power of the number
    d        has a list of unique digits
     l10     of length 10
        ∧  (turn off an unwanted implicit constraint)

7

Python 2 , 44 bytes

f=lambda n,k=1:11>len(set(`k`))and-~f(n,n*k)

A entrada deve ser longa, pois ​`k`​se comporta de maneira diferente para comprimentos e entradas.

Experimente online!


5

Perl 6 , 32 bytes

{first ($_** *).comb.Set>9,1..*}

Experimente online!

Bastante auto-explicativo.

Explicação

{                              }  # Anonymous code block
first                     ,1..*   # First positive number that
      ($_** *)    # When the input is raised to that power
              .comb.Set    # The set of digits
                       >9  # Is longer than 9

4

JavaScript (Node.js) ,  51 46  43 bytes

Recebe a entrada como um literal BigInt. Retorna true em vez de 1 .

f=(n,k=n)=>new Set(n+'').size>9||1+f(n*k,k)

Experimente online!


2
Eu continuo esquecendo que JS tem bigint agora: D
Conor O'Brien

Eu sou um pouco duvidoso em relação a retornar true em vez de 1. Isso não parece coincidir com nada descrito em codegolf.meta.stackexchange.com/questions/9263/…
Sparr

3
@Sparr Aqui está o consenso atual.
Arnauld

Obrigado. Eu coloquei uma nova resposta no meu link referente a isso.
Sparr


4

Haskell, 50 bytes

f a=until(\b->all(`elem`show(a^b))['0'..'9'])(+1)1

Experimente online!

Contagem de mesmos bytes:

f a=[b|b<-[1..],all(`elem`show(a^b))['0'..'9']]!!0

3

J , 25 bytes

>:@]^:(10>#@~.@":@^)^:_&1

Experimente online!

Único verbo monádico. A entrada deve ser um número inteiro de precisão estendida (por exemplo 2x).

Como funciona

>:@]^:(10>#@~.@":@^)^:_&1    Monadic verb. Input: base a
    ^:              ^:_      Good old do-while loop.
                       &1    Given 1 as the starting point for b,
>:@]                         increment it each step
      (            )         and continue while the condition is true:
               ":@^          Digits of a^b
            ~.@              Unique digits
          #@                 Count of unique digits
       10>                   is less than 10

(]+10>#@=@":@^)^:_*
FrownyFrog


2

Raquete , 110 96 bytes

-14 bytes graças ao UltimateHawk!

(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))

Experimente online!


1
Isso pode ser reduzido para 96 ​​bytes, recorrendo à função em vez disso(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))
Ultimate Hawk

@UltimateHawk Thank you! Esqueci-me sobre os parâmetros padrão ... (embora a função auxiliar também usou parâmetro padrão b ...)
Galen Ivanov

2

Python 3 , 52 47 bytes

graças a @BMO

f=lambda n,i=1:len({*str(n**i)})>9or 1+f(n,i+1)

Experimente online!


Apenas um aviso, mas você pode remover o código antigo e colocar "<s> 52 </s> 47" na linha do cabeçalho. O log de edição vai manter as versões antigas, se alguém estiver curioso
Veskah

2

05AB1E (herdado) , 10 9 bytes

Economizou 1 byte graças ao Sr. Xcoder

XµINmÙgTQ

Experimente online!

Explicação

Xµ           # find the first positive integer N that
  INm        # when the input is raised to N
     Ù       # and duplicate digits are removed
      g      # has a length
       TQ    # equal to 10

1
O Legacy economiza 1 byte: 1µINmÙgTQ- Experimente online!
Sr. Xcoder

@ Mr.Xcoder: Ah, sim, tivemos a saída implícita da Népoca. Obrigado!
Emigna

1

Carvão , 19 bytes

WΦχ¬№IXIθLυIκ⊞υωILυ

Experimente online! Link é a versão detalhada do código. Explicação:

WΦχ¬№IXIθLυIκ⊞υω

Empurre repetidamente a sequência vazia para a lista vazia até que não haja dígitos que a potência da entrada no comprimento da lista não contenha.

ILυ

Imprima o comprimento da lista.


Por que o voto negativo?
Luis Mendo

1

K (ngn / k) , 76 bytes

{#{10>#?(+/|\0<|x)#x}{{+/2 99#,/|0 10\x,0}/+/99 99#,/a*\:x,0}\a::|(99#10)\x}

Experimente online!

{ } função com argumento x

|(99#10)\x representamos números como listas invertidas de 99 dígitos decimais - faça isso com o argumento

a::atribuir à variável global a(k não possui fechamentos. precisamos aser globais para que possamos usá-la em subfunções)

{ }{ }\ enquanto a primeira função retorna falsey, continue aplicando a segunda função (aka loop while), preservando resultados intermediários

a*\:xcada um dos adígitos multiplicado por cada um dos xdígitos ("produto externo")

99 99#a*\:x,0 adicione uma coluna extra de 0s e altere novamente para 99x99, isso muda a i-ésima linha por i itens para a direita, inserindo 0s à esquerda (isso funciona para os testes, para entradas maiores, 99x99 pode levar a estouros)

+/ soma

{+/2 99#,/|0 10\x,0}/ propagar carry:

  • { }/ continue aplicando até convergência

  • 0 10\x divmod por 10 (um par de listas)

  • |0 10\x moddiv by 10

  • 2 99#,/|0 10\x,0 moddiv por 10, com a parte "div" deslocada 1 dígito para a direita

  • +/ soma

{10>#?(+/|\0<|x)#x} - verifique (não) pandigital:

  • |x marcha ré x

  • 0< quais dígitos são diferentes de zero

  • |\ máximos parciais

  • +/ soma - isso conta o número de 0s iniciais em x

  • 10> eles são menos de 10?

# comprimento da sequência de poderes - este é o resultado


1

PowerShell , 107 bytes

param([bigint]$a)for([bigint]$b=1;-join("$([bigint]::pow($a,$b))"|% t*y|sort -u)-ne-join(0..9);$b=$b+1){}$b

Experimente online!

Bem simples, apenas uma pena que precisamos usar em [bigint]qualquer lugar. Nós recebemos a entrada $ae configuramos um forloop com o inicializador $b=1.

Cada iteração que incrementamos $bapós verificar se $a ^ $b(via pow) enviado toCharArra y, sorted com o -usinalizador nique, e depois -joineditado em uma string é -not equal ao intervalo 0..9também -joined em uma string.

Isso é um bocado. Por exemplo, este seria comparar 7 ^ 5 = 16807 --> "01678"contra "0123456789", determinar que eles não são iguais, e continuar o ciclo.

Uma vez que estamos fora do circuito, determinamos o que melhor se $badequa às nossas informações e, portanto, deixamos isso no pipeline. A saída está implícita.


1

Java, 108 bytes

a->{int b=0;while(new java.math.BigDecimal(a).pow(++b).toString().chars().distinct().count()<10);return b;};

Experimente online!

Explicação

Força bruta, fazendo um loop a ^ b até encontrar uma sequência com 10 (ou mais, mas isso é impossível, pois haverá apenas 0 a 9) caracteres únicos.

BigDecimalé necessário, porque Math.pownão é preciso o suficiente (falha no caso 11) e também porque converter um Doublepara uma String por padrão mostra notação científica, que quebra esse método de encontrar um número pandigital.


Os Java Vars não começam em 0 por padrão? Pode salvar 2 bytes, eliminando a inicialização.
Darrel Hoffman

As variáveis ​​de instância @DarrelHoffman sim, sim. Variáveis ​​com escopo local não.
Hypino

Ah tudo bem. Faz algum tempo desde que eu trabalhei em Java, esqueci essa tecnicidade.
Darrel Hoffman

Você pode salvar 6 bytes alterando new java.math.BigDecimal(a).pow(++b).toString()para (new java.math.BigDecimal(a).pow(++b)+"")(e o ponto e vírgula à direita não precisa ser contado para as funções lambda). Tente online
Kevin Cruijssen

1

Pitão, 10 8 bytes

fq;l{`^Q

Experimente online aqui .

fq;l{`^QT   Implicit: Q=eval(input())
            Trailing T inferred
f           Return (and print) the first positive integer where the following is true:
      ^QT     Raise input to the current number-th power
     `        Convert to string
    {         Deduplicate
   l          Take the length
 q            Is the above equal to...
  ;           10

Economizou 2 bytes graças a FryAmTheEggman, código anterior fq;l{j^QT;


Você pode usar o backtick para converter o número em uma string em vez de fazer a conversão base, o que deixará de fora a Toperação de energia.
FryAmTheEggman

0

Geléia , 12 11 bytes

1*@ṾØDfƑʋ1#

Experimente online!

Como funciona

1*@ṾØDfƑʋ1#  Main link. Argument: n

1            Set the return value to 1.
         1#  Call the link to the left for k = 1, 2, ... and with right argument n,
             until it returns a truthy value.
        ʋ      Combine the four links to the left into a dyadic chain.
 *@              Compute n**k.
   Ṿ             Convert it to its string representation.
    ØD           Yield "0123456789".
      fƑ         Filter and return 1 is the result is equal to the left argument.

0

Limpo , 107 101 bytes

import StdEnv,Data.Integer
$a=hd[b\\b<-[1..]|length(removeDup[c\\c<-:toString(prod(repeatn b a))])>9]

Experimente online!

Recebe entrada como Integer, retornaInt



0

Anexo , 27 bytes

${Generate{#Unique[x^_]>9}}

Experimente online!

Explicação

${Generate{#Unique[x^_]>9}}
${                        }    lambda, input: x
  Generate{              }     first natural number _ satisfying...
                   x^_             the input to that number
            Unique[   ]          unique digits of ^
           #                   length of ^
                       >9      is greater than 9
                               i.e.: has 10 distinct digits

Alternativas

28 bytes: ${Generate{Unique@S[x^_]@9}}

29 bytes: ${Generate{Unique[S[x^_]]@9}}

30 bytes: ${Generate{#Unique[S[x^_]]>9}}

31 bytes: Generate@${{#Unique[S[x^_]]>9}}

32 bytes: ${Generate[{#Unique[S[x^_]]>9}]}

33 bytes: ${If[#Unique[x^y]>9,y,x&$!-~y]}&0

34 bytes: ${If[#Unique[x^y]>9,y,$[x,y+1]]}&0

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.