Um repdigit é um número natural que pode ser gravado apenas repetindo o mesmo dígito. Por exemplo, 777
é um re-dígito, pois é composto exclusivamente pelo dígito 7
repetido três vezes.
Isso não se limita a números decimais (base 10), no entanto:
- Todo número de Mersenne (no formato M n = 2 n -1 ) é um re-dígito quando escrito em binário (base 2).
- Todo número é trivialmente um repdigit quando escrito em unário (base 1).
- Cada número
n
também pode ser trivialmente escrito como o repdigit11
na basen-1
(por exemplo,17
quando escrito em hexadecimal (base 16)11
, e3
quando escrito em binário (base 2) também11
).
O desafio aqui é encontrar outras bases nas quais o número de entrada possa ser um re-dígito.
Entrada
Um número inteiro positivo x > 3
, em qualquer formato conveniente.
Saída
Um número inteiro positivo b
em (x-1) > b > 1
que a representação de x
na base b
é um re-dígito.
- Se não
b
existir, saída0
ou algum valor falsey . - Se
b
existirem vários , você pode gerar um ou todos eles.
Regras
- A
(x-1) > b > 1
restrição é impedir as conversões triviais em unárias ou na base "subtrair uma". O número de saída pode ser escrito em uma base unária ou em qualquer base conveniente, mas a base em si não deve ser uma das conversões triviais. - A entrada / saída pode ser feita por qualquer método adequado .
- Aplicam-se restrições de brecha padrão .
Exemplos
In --> Out
11 --> 0 (or other falsey value)
23 --> 0 (or other falsey value)
55 --> 10 (since 55 is 55 in base 10)
90 --> 14 (since 90 is 66 in base 14 ... 17, 29, 44 also allowed)
91 --> 9 (since 91 is 111 in base 9 ... 12 also allowed)
code-golf
base-conversion
AdmBorkBork
fonte
fonte
b ≤ 36
(as funções básicas de conversão de base de muitos idiomas não aumentam)?b ≤ 36
severamente o escopo desse problema, e todas as respostas existentes lidam corretamente com bases maiores, então vou dizer que não, você não pode assumir um limite superiorb
além do que é dado.Respostas:
Geléia,
119 bytesRetorna uma lista de bases, que está vazia (falsy) se não houver nenhuma. Experimente online!
Como funciona
fonte
Pyth,
1110Aparentemente, o unário de Pyth
q
verifica se há uma lista com todos os valores únicos há cerca de 10 dias. Aparentemente, investigar os erros do Pyth melhora a pontuação do golfe.Filtra a lista
[2..input-1)
se o conjunto exclusivo de dígitos da entrada nessa base for o comprimento 1.Suíte de teste
Explicação:
fonte
Ruby,
876963 bytesEu tive que implementar a conversão de base manualmente, já que os componentes internos do Ruby só chegam à base 36 ...
Retorna
nil
para não encontrado.fonte
Python, 71
7278bytesSem recursão, apenas tenta todas as bases e gera um conjunto daquelas que funcionam.
É tentador codificar
b
ed
em um único número, mas são necessárias muitas expressões entre parênteses para extraí-las. 77 bytes:72 bytes:
Produz o primeiro
b
que funciona, ou0
se não houver.Um representante-unidade
x
ded
dígitos dec
em base deb
tem valorx==c*(b**d-1)/(b-1)
. Equivalentementex*(b-1)==c*(b**d-1)
.O valor
c
deve serx%b
o último dígito. Não vejo uma maneira de determinard
aritmeticamente, então o código tenta todas as possibilidades para ver se algum deles funciona.Salvo 5 bytes, copiando o truque de Dennis de dar uma saída Falsey quando
b
alcancesx-1
tomando o módulo de saídax-1
. Outro byte salvo de Dennis me lembrando que a exponenciação inexplicavelmente tem maior precedência disso~
.Uma solução de comprimento igual com em
in
vez deany
.fonte
Ruby, 50 bytes
Eu realmente gostaria de remover esse espaço irritante, mas como novato em ruby, ainda não estou familiarizado com suas peculiaridades sintáticas.
fonte
b?
seria um nome de método válido, portanto você não pode se livrar do espaço.Emojicode , 214 bytes
(77 caracteres):
Imprime os resultados na base 9.
Estou pensando em fazer um código de golfe com emojicode há algumas semanas, mas o idioma só recentemente se tornou estável o suficiente para realmente trabalhar com 😉. Como um bônus, esta pergunta faz uso da única parte da funcionalidade emojicode que é realmente boa: representar números inteiros em outras bases.
Ungolfed (👴 é um comentário de linha no emojicode)
fonte
Python 2, 79 bytes
Experimente em Ideone .
Idéia
Qualquer repdigito x da base b> 1 e dígito d <b satisfaz o seguinte.
Como d <b , o mapa (b, d) ↦ cb + d é injetivo.
Além disso, como b, x> 1 , temos c <x , então cb + d <cb + b = (c + 1) b ≤ xb .
Isso significa que, para encontrar valores adequados para c e d para uma dada base b , podemos iterar todo o i em [0,…, bx) e verificar se (b - 1) x == (i% b) (b i / b - 1) .
Código
O teste lambda f nomeado se (b - 1) x está no conjunto {(i% b) (b i / b - 1) | 0 ≤ i <bx} , começando com o valor b = 2 .
Se o teste foi bem sucedido, retornamos b .
Else, chamamos f novamente, com a mesma x e b incrementado por 1 .
Como b pode eventualmente chegar a x - 1 , tomamos o resultado final do módulo x - 1 para retornar 0 neste caso. Observe que isso não acontecerá se b = 2 satisfizer a condição, pois ela é retornada sem repetir. No entanto, a questão garante que b = 2 <x - 1 neste caso.
fonte
Perl 6,
454342 bytesExplicado (mais ou menos)
Para referência, uma variável
$^x
in{ ... }
é igual a fazer-> $x { ... }
Polymod (TL; DR):
$n.polymod($b xx *)
fornece uma lista invertida de dígitos / 'dígitos'$n
na base$b
Polymod (de verdade): O método polymod é quase como uma versão mais poderosa da
divmod
função do python .$n.polymod(*@args)
divide $ n por cada valor em * @ args, adicionando o restante ($n mod $x
) à lista que ele retorna e usando o quociente para a próxima divisão. Eu sinto que expliquei mal, então aqui estão alguns exemplos (escritos em perl 6, mas limpos o suficiente para serem entendidos pela maioria dos que espero):fonte
grep
método em vez dofirst
método.Dyalog APL , 28 bytes
{
...⍵
...}
função anónimo a ser aplicada ax
(representado por⍵
)b←1+⍳⍵-3
inteiros a partir de 2 - ⍵-2 armazenados comob
⍵{
...}¨
para cada elemento b (⍵
), aplicar a função{
...}
com X como argumento esquerda⍺
⍵⊥⍣¯1⊢⍺
convertido x para que a base1=≢∪
é um igual à contagem de dígito único?b/⍨
elementos de b onde verdadeiro (que existe apenas um dígito único).Casos de exemplo
Se não houver base, a saída está vazia (o que é falsey), como pode ser demonstrado por este programa:
Isso imprime 'False'
fonte
Pitão,
2619 bytesExperimente aqui!
Adicionará uma explicação depois que eu jogar isso.Veja esta resposta para uma implementação e explicação mais curtas.fonte
90
e91
nos meus exemplos!MATL ,
1514 bytesIsso funciona com a versão atual (14.0.0) do idioma / compilador.
Se não houver base, a saída está vazia (que é falsey).
Experimente online!
fonte
Mathematica, 55 bytes
Função anônima, não muito complicada. Apenas filtra as bases com base no repdigit-ness.
fonte
Python 2, 75 bytes
Um porto da minha resposta rubi. Imprime todas as bases válidas, se houver alguma.
fonte
Julia, 45 bytes
Esta é uma função anônima que aceita um número inteiro e retorna uma matriz inteira. Para chamá-lo, atribua-o a uma variável. Ele retornará todas as bases aplicáveis ou uma matriz vazia. Não há problemas com grandes bases.
Primeiro, geramos o intervalo inclusivo [2, n - 2], onde n é a entrada. Em seguida,
filter
listamos apenas números inteiros b para os quais n na base b tem menos de 2 dígitos únicos. Para fazer isso, para cada número inteiro b no intervalo, obtemos os dígitos de n na base b como uma matriz usandodigits
, obtemos itens exclusivos usando∪
e obtemos o índice do último elemento (ou seja, o comprimento) usandoendof
.fonte
Braquilog , 12 bytes
Experimente online! (como um gerador!)
Leva a entrada através da variável de entrada e gera uma base através da variável de saída, caso isso seja possível, caso contrário, falhará. Ao mesmo tempo, também funciona como um gerador que gera uma lista de todas as bases, onde essa lista pode estar vazia.
Idealmente, isso poderia parecer algo como
ḃ↙.=&>>
, possivelmente sacrificando a funcionalidade do gerador dessa forma ou semelhante (uma vez que eventualmente chegaria a ser unário), mas a partir de agora 12 bytes é o mais curto que eu sei como obtê-lo.fonte
Ruby ,
4643 bytesUtiliza a função Número inteiro # dígitos introduzida no Ruby 2.4 para evitar a necessidade de dividir manualmente.
-3 bytes graças a @Jordan.
Experimente online!
fonte
05AB1E , 7 bytes
Produz todos os valores possíveis ou uma lista vazia como valor de falsey (embora as saídas tecnicamente válidas também sejam falsey, pois somente
1
é verdade em 05AB1E e todo o resto é falsey).Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Perl 5
-Minteger -na
, 63 bytesExperimente online!
Produz todas as respostas possíveis ou nada, se não houver solução.
fonte