O meu número é único


21

Nesse desafio , aprendemos uma maneira de codificar todo número inteiro positivo usando árvores fatoriais.

Aqui está como funciona:

  • A cadeia vazia tem o valor 1.

  • (S)onde Sé qualquer expressão com um valor de S é avaliada como a S ª prime.

  • ABonde Ae Bsão expressões arbirary com valores de A e B , respectivamente, têm valor A * B .

Por exemplo, se quiséssemos representar 7, faríamos

  7 -> (4) -> (2*2) -> ((1)(1)) -> (()())

Acontece que podemos representar todos os números inteiros usando esse método. De fato, alguns números podemos representar de várias maneiras. Como a multiplicação é comutativa, 10 são ambos

((()))()

e

()((()))

Ao mesmo tempo, alguns números podem ser representados apenas de uma maneira. Tome 8 por exemplo. 8 só pode ser representado como

()()()

E como todos os nossos átomos são os mesmos, não podemos usar a comutatividade para reorganizá-los.


Então agora a pergunta é "Quais números só podem ser representados de uma maneira?". A primeira observação é aquela que eu comecei a fazer lá atrás. Parece que poderes perfeitos têm algumas propriedades especiais. Sob investigação adicional, podemos encontrar 36, que é 6 2, é uma potência perfeita, mas tem múltiplas representações.

(())()(())()
(())()()(())
()(())()(())
()(())(())()
()()(())(())

E isso faz sentido, porque 6 já é reorganizável; portanto, qualquer número que fizermos de 6 também deve ser reorganizável.

Então agora temos uma regra:

  • Um número tem uma representação única se for a potência perfeita de um número com uma representação exclusiva.

Essa regra pode nos ajudar a reduzir a determinação se um número composto é exclusivo para determinar se um número primo é único. Agora que temos essa regra, queremos descobrir o que torna um número primo único. Isso é realmente muito evidente. Se tomarmos um número único e envolvê-la em parênteses, o resultado deve ser único, e, indo para o outro lado, se n tem múltiplas representações do n º nobre deve ter múltiplas representações. Isso produz a segunda regra:

  • O n º principal é único, se e somente se n é único.

Como essas regras são recursivas, precisamos de um caso básico. Qual é o menor número único? Pode-se ficar tentado a dizer 2 porque é apenas (), mas 1, a sequência vazia, é ainda menor e é única.

  • 1 é único.

Com essas três regras, podemos determinar se um número tem uma árvore de fatores exclusiva.

Tarefa

Você já deve ter percebido isso, mas sua tarefa é pegar um número inteiro positivo e determinar se é único. Você deve escrever um programa ou função que faça esse cálculo. Você deve emitir um dos dois valores possíveis, quais são esses valores, mas um deve representar "yes", sendo exibido quando a entrada for exclusiva e um deve representar "no", caso contrário.

Suas respostas devem ser pontuadas em bytes, com menos bytes sendo melhores.

Casos de teste

Aqui estão os primeiros números únicos:

1
2
3
4
5
7
8
9
11
16
17
19
23
25
27
31

Casos de teste sugeridos

5381 -> Unique

Parece que o OEIS A214577 está de alguma forma relacionado, portanto, se você precisar de mais casos de teste, tente lá, mas eu não sei que eles são os mesmos, portanto, use por seu próprio risco.


Eu acredito que os fatores principais tiveram que ser classificados, mas tanto faz.
N23

1
@ JonathanAllan não, está tudo aqui.
N23

Caso de teste sugerido: 5381
Nissa 23/12

@StephenLeppik Caso de teste adicionado, obrigado.
Assistente de trigo

1
@ H.PWiz Vou dizer que um programa completo pode ter erro como saída, porque essa é uma forma de saída para um programa, mas uma função deve retornar um valor.
Assistente de trigo

Respostas:


9

Casca , 11 10 bytes

Guardado um byte graças ao Zgarb!

Ωεo?oṗ←¬Ep

Retorna 1para exclusivo, 0caso contrário

Experimente online! Ou retornando os primeiros 50

Explicação:

Ωε              Until the result is small (either 1 or 0), we repeat the following
         p     Get the prime factors
  o?           If ...
        E      they are all equal:
    ȯṗ←           Get the index of the first one into the primes
               Else:
       ¬          Not the list (since non-empty lists are truthy, this returns 0)

Ah, e sua explicação diz " ȯp←".
Erik the Outgolfer

@EriktheOutgolfer Boa captura, consertada #
H.PWiz

Eu acho que ṁ¬pode ser apenas ¬porque a lista não deve estar vazia nesse ramo.
Zgarb

@Zgarb Oh extravagante, eu acho que você me deu essa dica antes
H.PWiz

7

Gelatina , 10 bytes

Depois de muita brincadeira!

ÆET0ṪḊ?µl¿

Um link monádico que pega um número inteiro positivo e retorna 1se é exclusivo ou 0não.

Experimente online!

Quão?

ÆET0ṪḊ?µl¿ - Link: number, n     e.g. 11          or 13            or 20
         ¿ - while:
        l  - ...condition: (left) logarithm with base (right)
           -               note: x log 0 and x log 1 both yield None, which is falsey
       µ   - ...do the monadic chain: (first pass shown)
ÆE         -   prime exponent array   [0,0,0,0,1]    [0,0,0,0,0,1]    [2,0,1]
  T        -   truthy indexes         [5]            [6]              [1,3]
      ?    -   if:
     Ḋ     -   ...condition: dequeue (i.e. if length > 1)
   0       -   ...then: literal zero   -              -               0
    Ṫ      -   ...else: tail           5              6               -
           - end result                1              0               0

Espere, logaritmo, o que ?!

Vamos analisar alguns exemplos do loop.

Se n=31( 31 1 , o décimo primeiro primo):

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |       31 |        31 |    1.000 -> continue
         2 |       11 |        31 |    0.698 -> continue
         3 |        5 |        11 |    0.671 -> continue
         4 |        3 |         5 |    0.683 -> continue
         5 |        2 |         3 |    0.631 -> continue
         6 |        1 |         2 |    0.000 -> stop, yielding left = 1

Se n=625( 5 4 ):

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |      625 |       625 |    1.000 -> continue
         2 |        3 |       625 |    0.171 -> continue
         3 |        2 |         3 |    0.631 -> continue
         4 |        1 |         2 |    0.000 -> stop, yielding left = 1

Se n=225( 5 2 × 3 2 ):

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |      225 |       225 |    1.000 -> continue
         2 |     *  0 |       225 |-inf+nanj -> continue
         3 |     ** 0 |         0 |     None -> stop, yielding left = 0

*The dequeued list was not empty
**Tailing an empty list in Jelly yields 0

4

APL (Dyalog) , 42 bytes

CY'dfns'
{1≥⍵:11=≢∪r3pco⍵:∇11pcor0}

Usar ⎕CY'dfns'com dfnses não é muito viável.


Minha resposta saiu bastante semelhante ao seu, embora, eu escrevi a primeira versão em torno de 4 horas atrás
H.PWiz

@ H.PWiz parece cara, eu realmente não me importo quando as pessoas enviam no mesmo idioma, embora eu prefira comentar quando encontrar uma solução mais curta, mas isso é quase o mesmo. Não me importo de você mantê-lo, mas encontro respostas que parecem iguais. Sobre o tempo - é assim que funciona. Deixei dezenas de respostas porque alguém veio primeiro. Eu (e acredito que o resto) estou fazendo isso por diversão, não por uma competição real.
Uriel

Desculpe por demorar tanto, mas excluí minha resposta. Olhando para trás, parece que um comentário teria sido mais apropriado. Eu acho que, desde que eu era novo para APL no momento, como uma resposta exigida uma quantidade bastante significativa de esforço, e eu senti um comentário teria fez sentir como um desperdício
H.PWiz


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.