Calcular A190810

27

Sua tarefa é bem simples, calcule o n-ésimo elemento de A190810 .

Os elementos de A190810 são calculados de acordo com estas regras:

  1. O primeiro elemento é 1
  2. A sequência está aumentando
  3. Se xocorrer na sequência, então 2x+1e 3x-1também faça

Você pode usar a indexação com base em 1 ou em 0, mas se você usar a indexação com base em 0, diga-a na resposta.

Casos de teste

a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255

Como se trata de código-golfe, a resposta mais curta em bytes vence!

TuxCrafting
fonte
2
Você deve adicionar casos de teste maiores.
mbomb007
7
Você pode explicar isso um pouco mais claramente? Eu sou um falante nativo de inglês e não tenho idéia do que "... e se x está em um, então 2x + 1 e 3x-1 estão em um". é suposto significar.
cat
1
@cat x ϵ A → (2*x) + 1 ϵ Ae x ϵ A → (3*x)-1 ϵ A, where ϵsignifica "é um membro de" e pode ser entendido como "implica".
Steven H.
3
Condição implícita: a sequência não contém números não exigidos pelas outras regras. (Caso contrário $ a (i) = I $ seria uma sequência válida)
Stig Hemmer
1
E você obter gratuitamente Mathematica e Haskell respostas a começar a partir de :)
parar de prejudicar Monica

Respostas:

9

Gelatina , 16 bytes

×3’;Ḥ‘$;
1Ç¡ṢQ³ị

Muito ineficiente. Experimente online!

Como funciona

1Ç¡ṢQ³ị   Main link. Argument: n (integer)

1         Set the return value to 1.
 Ç¡       Execute the helper link n times.
   Ṣ      Sort the resulting array.
    Q     Unique; deduplicate the sorted array.
     ³ị   Retrieve its n-th element.


×3’;Ḥ‘$;  Helper link. Argument: A (array)

×3        Multiply all elements of A by 3.
  ’       Decrement the resulting products.
      $   Combine the two links to the left into a monadic chain.
    Ḥ     Unhalve; multiply all elements of A by 2.
     ‘    Increment the resulting products.
   ;      Concatenate 3A-1 and 2A+1.
       ;  Concatenate the result with A.
Dennis
fonte
1
Pode ter 16 caracteres , mas não conheço nenhuma codificação que represente isso em menos de 30 bytes .
50550 Remer rich remer
18
O Jelly possui sua própria página de códigos, que permite que esses caracteres tenham 1 byte cada.
15

Python 2, 88 83 72 bytes

Você pode ler os programas nesta resposta em ordem inversa ...

Mais lento e mais curto ainda, graças a Dennis:

L=1,;exec'L+=2*L[0]+1,3*L[0]-1;L=sorted(set(L))[1:];'*input()
print L[0]

Experimente online


Isso não é tão rápido, mas é mais curto ( 83 bytes .) Classificando e removendo duplicatas a cada iteração, além de remover o primeiro elemento, removo a necessidade de um índice na lista. O resultado é simplesmente o primeiro elemento após as niterações.

Eu posso ter jogado golfe com Dennis. : D

L=[1]
n=input()
while n:L+=[2*L[0]+1,3*L[0]-1];n-=1;L=sorted(set(L))[1:]
print L[0]

Experimente online


Esta versão abaixo ( 88 bytes ) roda muito rápido, localizando o 500000º elemento em cerca de dois segundos.

É bem simples. Calcule os elementos da lista até que haja três vezes mais elementos do que n, uma vez que cada elemento adicionado pode adicionar no máximo 2 elementos únicos. Em seguida, remova as duplicatas, classifique e imprima o nelemento th (indexado a zero).

L=[1]
i=0
n=input()
while len(L)<3*n:L+=[2*L[i]+1,3*L[i]-1];i+=1
print sorted(set(L))[n]

Experimente online

mbomb007
fonte
8

Python 2, 59 bytes

t={1}
exec'm=min(t);t=t-{m}|{2*m+1,3*m-1};'*input()
print m

Com base na resposta Python de @ mbomb007 . Teste em Ideone .

Dennis
fonte
"Não se supera simplesmente Dennis" ... Eu gostaria de ter pensado em usar literais de conjunto. Parece tão óbvio agora. Essa resposta é ainda mais rápida que o meu programa "rápido" se você mudar de executar uma string para um código real?
mbomb007
Não. É mais lento. As operações de set são mais caras.
mbomb007
Sim, miné O (n) enquanto lista indexação é O (1) , de modo que esta solução é, pelo menos, O (N²) ...
Dennis
8

Haskell, 76 73 69 bytes

a#b=mod a b<1&&t(div a b)
t x=x<2||(x-1)#2||(x+1)#3
(filter t[1..]!!)

Usa um índice baseado em 0. Exemplo de uso: (filter t[1..]!!) 54-> 255.

Em vez de criar a lista inserindo repetidamente 2x+1e, 3x-1como visto na maioria das outras respostas, analiso todos os números inteiros e verifico se eles podem ser reduzidos 1aplicando repetidamente (x-1) / 2ou (x+1) / 3se são divisíveis.

nimi
fonte
Isso realmente não define uma função ou um trecho de código válido, define?
Zeta
@Zeta A última linha é avaliada como uma função sem nome.
Zgarb
@ Zgarb Que é um erro em um arquivo Haskell, e nenhum intérprete que conheço é compatível com esse tipo de recurso. Então, por favor, esclareça-me, como um usuário deve usar isso sem modificar o código acima de alguma forma? Ou você poderia me indicar uma meta post que permita esse tipo de código?
Zeta
2
@ Zgarb Eu acho que para a última linha, atribua-a a uma ligação (como f=filter t[1..]!!), porque não acho que isso esteja correto.
TuxCrafting
1
@ TùxCräftîñg Nesta publicação do Meta , foi determinado que funções auxiliar adicionais são aceitáveis ​​por padrão nesta situação. Este também é o formato que eu costumo ver nas respostas Haskell aqui. Obviamente, você como autor do desafio tem a autoridade final.
Zgarb
7

Haskell, 77 74 bytes

import Data.List
i=insert
f(x:y)=x:f(i(2*x+1)$i(3*x-1)y)
a=(!!)(nub$f[1])

Isso fornece uma função apara a n-ésima entrada. É zero indexado. Como alternativa, a=nub$f[1]criará a lista inteira (preguiçosamente).

É uma variante da lista do Setcódigo de Reinhard Zumkeller .

Zeta
fonte
Por que não, em yvez de xssalvar dois bytes? Além disso, eu acredito que você pode ser capaz de cortar a última linha para algo como(!!)$nub.f[1]
Michael Klein
@ MichaelKlein: Estou muito acostumado (x:xs), esqueci completamente isso, obrigado.
Zeta
6

Python 2, 88 84 bytes

g=lambda k:g(k%2*k/2)|g(k%3/2*-~k/3)if k>1else k
f=lambda n,k=1:n and-~f(n-g(k),k+1)

Teste em Ideone .

Dennis
fonte
13
Você é um profissional em transformar algo simples em algo ilegível.
mbomb007
6

Pitão, 20 19 bytes

hutS{+G,hyhGt*3hGQ0

Experimente online. Suíte de teste.

Usa indexação baseada em zero.

PurkkaKoodari
fonte
1
@Jakube Obrigado. Eu me pergunto como não descobri isso quando tentei 1e, obviamente, não funcionou.
PurkkaKoodari
5

Braquilog , 45 bytes

:1-I,?:?*:1ydo:Im.
1.|:1-:1&I(:3*:1-.;I*:1+.)

Computa N = 1000em cerca de 6 segundos na minha máquina.

Isso é indexado em 1, por exemplo

run_from_file('code.brachylog',1000,Z).
Z = 13961 .

Explicação

  • Predicado principal:

    :1-I,               I = Input - 1
         ?:?*           Square the Input
             :1y        Find the first Input*Input valid outputs of predicate 1
                do      Remove duplicates and order
                  :Im.  Output is the Ith element
    
  • Predicado 1:

    1.                  Input = Output = 1
    |                   Or
    :1-:1&I             I is the output of predicate 1 called with Input - 1 as input
           (            
             :3*:1-.      Output is 3*I-1
           ;            Or
             I*:1+.       Output is 2*I+1
           )
    

Você pode observar que não passamos nenhuma entrada para o predicado 1 quando chamamos y - Yield. Por causa da propagação de restrição, ele encontrará a entrada correta ao atingir a 1.cláusula que propagará os valores de entrada corretos.

Fatalizar
fonte
4

MATL, 19, 18 17 bytes

1w:"tEQy3*qvSu]G)

Este é um algoritmo extremamente ineficiente. O intérprete online fica sem memória para entradas maiores que 13.

Um byte salvo, graças a Luis Mendo!

Experimente online!

Esta versão é mais longa, mas mais eficiente (21 bytes)

1`tEQy3*qvSutnG3*<]G)

Experimente online

Explicação:

A maneira lógica de fazer isso é adicionar elementos à matriz até que seja longo o suficiente para capturar o i-ésimo elemento. É assim que o eficiente funciona. A maneira mais eficiente (e ineficiente) de fazer isso é apenas aumentar o tamanho do array i vezes.

Então, primeiro, vamos definir a matriz de início: 1. Em seguida, trocamos os dois principais elementos, para que a entrada fique no topo. w. Agora, passamos pela entrada com :". Então eu vezes:

t             %Duplicate our starting (or current) array.
 EQ           %Double it and increment
   y          %Push our starting array again
    3*q       %Multiply by 3 and decrement
       v      %Concatenate these two arrays and the starting array
        Su    %Sort them and remove all duplicate elements.

Agora, temos uma matriz gigantesca da sequência. (Muito mais do que o necessário para calcular) Então, paramos de repetir ], e agarramos o i-ésimo número dessa matriz com G)(1-indexado)

DJMcMayhem
fonte
@LuisMendo Obrigado pela dica! Como você reescreveria isso com um loop while em vez do loop for? (Talvez isso seria uma pergunta melhor para a sala de chat do MATL)
DJMcMayhem
Pode ser feito desta forma: 1`tEQy3*qvuStnG<]G). A condição de ciclo é tnG<(saída quando a matriz já tem o tamanho necessário)
Luis Mendo
Não tenho certeza quanto batota que é, mas na forversão -loop você pode tirar a entrada em unário como uma string e remover o:
Luis Mendo
4

JavaScript (ES6), 63 bytes

 f=(n,a=[1],i=0)=>a[i++]?--n?f(n,a,a[i*2]=a[i*3-2]=1):i:f(n,a,i)

Provavelmente desiste rapidamente devido à recursão.

Neil
fonte
4

Retina, 57

^.+
$*¶¶1
¶¶(1(1*))
¶1$1$1¶$2$1$1
O`
}`(¶1+)\1\b
$1
G2`
1

Experimente online!

Indexado a 0. Segue o algoritmo usado com freqüência: remova o valor mínimo do conjunto atual, chame-o xe adicione 2x+1e 3x-1ao conjunto um número de vezes igual à entrada e, em seguida, o número inicial é o resultado. O "conjunto" no Retina é apenas uma lista que é repetidamente classificada e criada para conter apenas elementos exclusivos. Existem alguns bits sorrateiros adicionados ao algoritmo para o golfe, que explicarei assim que tivermos mais tempo.

Muito obrigado a Martin por jogar em torno de 20 bytes!

FryAmTheEggman
fonte
4

Clojure, 114 108 bytes

#(loop[a(sorted-set 1)n 1](let[x(first a)](if(= n %)x(recur(conj(disj a x)(+(* 2 x)1)(-(* 3 x)1))(inc n)))))

Eu não ficaria surpreso se isso pudesse ser reduzido / reduzido em um montante significativo, mas setnão apoiar n realmente prejudicou minha linha de pensamento.

Experimente o online

Versão com espaços:

#(loop [a (sorted-set 1)
        n 1]
  (let [x (first a)]
    (if (= n %)
      x
      (recur (conj (disj a x) (+ (* 2 x) 1) (- (* 3 x) 1)) (inc n))
      )))
Chris F
fonte
4

05AB1E, 18 17 bytes

Usa a codificação CP-1252 .

$Fз>s3*<)˜Ù}ï{¹è

Explicação

$                  # initialize with 1
 F          }      # input number of times do
  Ð                # triplicate current list/number
   ·>              # double one copy and add 1
     s3*<          # multiply one copy by 3 and subtract 1
         )˜Ù       # combine the 3 lists to 1 list and remove duplicates
             ï{    # convert list to int and sort
               ¹è  # take the element from the list at index input

Experimente online para pequenos números

Muito devagar.
Usa indexação baseada em 0.

Emigna
fonte
3

C ++, 102 bytes

[](int i){int t;map<int,int>k;for(k[1];i--;k.erase(t))t=k.begin()->first,k[t*2+1],k[t*3-1];return t;};

Essa função lambda requer #include <map>e using std::map.

O mapaqui é apenas uma coleção de chaves; seus valores são ignorados. Uso mappara me beneficiar do código conciso para inserção:

k[1]; // inserts the key 1 into the map

Graças à ordem classificada de map, o menor elemento é extraído por k.begin()->first.

anatolyg
fonte
1
Ligeiramente mais curto (97) usando sete initializer listas: [](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};.
nwn 15/07/16
3

Na verdade, 27 bytes

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E

Experimente online!

Este programa usa indexação baseada em 0. A abordagem é de força bruta, portanto, não espere que ela funcione no intérprete online para obter contribuições maiores.

Explicação:

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E
╗                            save input (n) in register 0
 1#                          push [1]
   ╜                         push n
    `;;2*1+)3*1@-#++╔S`n     do the following n times:
     ;;                        make two copies of the list
       2*1+                    apply 2x+1 to each element in one copy
           )3*1@-              and 3x-1 to each element in the other copy
                 #             workaround for a weird list bug
                  ++           append those two lists to the original list
                    ╔S         uniquify and sort
                        ╜@E  get the nth element (0-indexed)
Mego
fonte
2

CJam (25 bytes)

ri1a1${{_2*)1$3*(}%_&}*$=

Demonstração online . Observe que isso usa indexação baseada em zero.

Isso usa uma abordagem semelhante à maioria: aplique os ntempos de transformação e, em seguida, classifique e extraia o nitem th. Como um sinal de eficiência, a desduplicação é aplicada dentro do loop e a classificação é aplicada fora do loop.

Peter Taylor
fonte
2
22: 1ari{(_2*)\3*(@||$}*0=(. Também muito mais eficiente)
Martin Ender
2

Retina , 48 bytes

.+
$*
+1`^(((!*)!(!|\3)(?=\3!1))*!)1|\b
!$1
-2`.

Experimente online!

Inspirado pela resposta de nimi pensei em tentar uma abordagem diferente para o Retina, usando o retorno do mecanismo regex para descobrir se algum número (unário) está na sequência ou não. Acontece que isso pode ser determinado com um regex de 27 bytes, mas usá-lo custa um pouco mais, mas ainda acaba sendo mais curto que a abordagem generativa.

Aqui está uma solução alternativa de 48 bytes:

.+
$*
{`1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!

E usando E / S unárias, podemos fazer 42 bytes, mas estou tentando evitar isso e a outra resposta da Retina também usa decimal:

1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!
1
Martin Ender
fonte
2

Ruby, 70 bytes

->n{a=*1
n.times{a<<a.map{|i|([2*i+1,3*i-1]-a).min||1.0/0}.min}
a[-2]}

Explicação

->n{
    # Magical, golfy way of initializing an array. Equivalent to a = [1].
    a=*1
    n.times{
        # Generate the next element in the sequence, by...
        a<<
            # ... finding the minimal term that will appear at some point.
            a.map{|i|
                ([2*i+1,3*i-1]-a).min||1.0/0
            }.min
    }
    # We generated n+1 elements, so we'll take the *second* to last one.
    a[-2]
}
m-chrzan
fonte
1
Esse *1truque é legal
TuxCrafting
1

J, 31 bytes

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]

Usa indexação baseada em zero. Muito ineficiente em memória.

Explicação

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]  Input: n
                              ]  Identity function, gets n
 1                               The constant 1
  (                      )^:[~   Repeat n times with an initial array a = [1]
                       >:          Increment each in a
                     2*            Multiply by 2 to get 2a+2
             3&*                   Multiply each in a by 3 to get 3a
                 &:<:              Decrement both x and y to get 2a+1 and 3a-1
                ,                  Join them
    ]                              Identity function, gets a
            ,                      Join a with 2a+1 and 3a-1
         ~.@                       Take the distinct values
     /:~@                          Sort up
   ]                               Return the sorted list
{                                Select the value from the list at index n and return it
milhas
fonte
1

Oitava, 68 bytes

function r=a(n)s=1;for(i=1:n)r=s(i);s=union(s,[r*2+1 r*3-1]);end;end
dcsohl
fonte
Você pode remover a final;end
Luis Mendo
Na versão que eu uso, pelo menos (4.0.0) você não pode ...
dcsohl
1

Perl, 173 132 bytes +1 para -n = 133

sub c{my$a=pop;return($a==1||($a%2&&c(($a-1)/2))?1:$a%3!=2?0:$a%3==2?c(($a+1)/3):1)}while($#b<$_){$i++;@b=(@b,$i)if c$i}say$b[$_-1];

Ungolfed:

my @array = ();
my $n = <>;
sub chk {
    my $a = shift;
    return 1 if ($a == 1);
    if ($a % 2 == 0) {
        if ($a % 3 != 2) {
            return 0;
        } else {
            return chk(($a + 1) / 3);
        }
    } else {
        if (chk(($a - 1) / 2) == 0) {
            if ($a % 3 != 2) {
                return 0;
            } else {
                return chk(($a + 1) / 3);
            }
        } else {
            return 1
        }
    }
}
my $i = 1;
while ($#array < $n-1) {
    push(@array,$i) if (chk($i) == 1);
    $i++;
}
print $array[$n];

Provavelmente, posso fazer melhor se pensar mais sobre isso, mas foi o que descobri depois de alguns minutos. Minha primeira vez jogando golfe, então isso foi bem divertido!

Obrigado a @Dada e @ TùxCräftîñg (e várias otimizações de bytes menores) por -40 bytes

Gabriel Benamy
fonte
1
Eu acho que você pode deixar cair os espaços depois dos mys, o returneo print(pode não teste, não tem perl)
TuxCrafting
1
@ TùxCräftîñg está certo sobre o return. O printpode ser substituído por um say. Na maioria das mynão são necessários (você só precisa do anterior $ana função que eu penso. Não inicialize nem declarar @b. Provavelmente, você pode soltar a inicialização de $ise fazer $i++no início da enquanto em vez de no final. popÉ mais curto do que shiftTenha em mente que há muito mais para jogar golfe perl do que apenas a remoção de espaços em branco e quebras de linha ....
Dada
0

JavaScript (ES6), 58

n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

Menos golfe

n=>{
  a=[];
  a[1] = 1;
  for(i = 0; n;)
  {
    ++i
    if (a[i])
    {
      a[2*i+1] = 1;
      a[3*i-1] = 1;
      --n;
    }
  }
  return i
}

Teste

Sobre tempo e memória: elemento 500000 em ~ 20 s e 300 MB usado pelo meu alfa de FireFox de 64 bits

F=
n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

function test() {
  var n=+I.value, t0=+new Date
  O.textContent = F(n)
  console.log((+new Date-t0)/1000,'sec')
}  

test()
#I { width:5em}
<input id=I type=number value=10 oninput="test()"> 
<span id=O></span>

edc65
fonte