Calcola A190810


27

Il tuo compito è piuttosto semplice, calcola l' ennesimo elemento di A190810 .

Gli elementi di A190810 sono calcolati secondo queste regole:

  1. Il primo elemento è 1
  2. La sequenza sta aumentando
  3. Se si xverifica nella sequenza, quindi 2x+1e 3x-1anche

È possibile utilizzare l'indicizzazione in base 1 o in base a 0, ma se si utilizza l'indicizzazione in base 0, si prega di dirlo nella risposta.

Casi test

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

Dato che si tratta di code-golf, vince la risposta più breve in byte!


2
È necessario aggiungere casi di test più grandi.
mbomb007,

7
Puoi spiegarlo un po 'più chiaramente? Sono un madrelingua inglese e non ho idea di cosa "... e se x è in a allora 2x + 1 e 3x-1 sono in a." dovrebbe significare.
gatto

1
@cat x ϵ A → (2*x) + 1 ϵ Ae x ϵ A → (3*x)-1 ϵ A, dove ϵsignifica "è un membro di" e può essere inteso come "implica".
Steven H.

3
Condizione implicita: la sequenza non contiene numeri non richiesti dalle altre regole. (Altrimenti $ a (i) = i $ sarebbe una sequenza valida)
Stig Hemmer

1
E ottieni risposte gratuite da Mathematica e Haskell a partire da :)
Smetti di danneggiare Monica il

Risposte:


9

Gelatina , 16 byte

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

Molto inefficiente. Provalo online!

Come funziona

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.

1
Possono essere 16 caratteri , ma non conosco alcuna codifica che lo rappresenti in meno di 30 byte .
rich remer

18
Jelly ha la sua codepage che consente a questi caratteri di essere 1 byte ciascuno.

15

Python 2, 88 83 72 byte

Potresti voler leggere i programmi in questa risposta in ordine inverso ...

Sempre più lento e più corto, grazie a Dennis:

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

Provalo online


Questo non funziona così velocemente, ma è più breve ( 83 byte ). Ordinando e rimuovendo i duplicati ogni iterazione, oltre a rimuovere il primo elemento, rimuovo la necessità di un indice nell'elenco. Il risultato è semplicemente il primo elemento dopo le niterazioni.

Potrei aver giocato a golf 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]

Provalo online


Questa versione di seguito ( 88 byte ) funziona molto velocemente, trovando il 500000 ° elemento in circa due secondi.

È abbastanza semplice Calcola gli elementi dell'elenco fino a quando non ci sono tre volte più elementi di n, poiché ogni elemento aggiunto può aggiungere al massimo altri 2 elementi univoci. Quindi rimuovere i duplicati, ordinare e stampare l' nelemento th (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]

Provalo online


8

Python 2, 59 byte

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

Basato sulla risposta Python di @ mbomb007 . Provalo su Ideone .


"Uno non supera semplicemente Dennis" ... Vorrei aver pensato di usare i set letterali. Sembra così ovvio ora. Questa risposta è ancora più veloce del mio programma "veloce" se passi dall'esecuzione di una stringa al codice effettivo?
mbomb007,

No. È più lento. Le operazioni impostate sono più costose.
mbomb007,

Sì, minè O (n) mentre l'indicizzazione dell'elenco è O (1) , quindi questa soluzione è almeno O (n²) ...
Dennis

8

Haskell, 76 73 69 byte

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

Utilizza un indice basato su 0. Esempio di utilizzo:(filter t[1..]!!) 54 -> 255.

Invece di costruire la lista inserendo ripetutamente 2x+1e 3x-1come si vede nella maggior parte delle altre risposte, passo attraverso tutti i numeri interi e controllo se possono essere ridotti 1applicando ripetutamente (x-1) / 2o (x+1) / 3se divisibili.


Questo non definisce davvero una funzione o uno snippet di codice valido, vero?
Zeta,

@Zeta L'ultima riga restituisce una funzione senza nome.
Zgarb,

@Zgarb Che è un errore in un file Haskell e nessun interprete di cui sono a conoscenza supporta questo tipo di funzionalità. Quindi, per favore, illuminami, come può un utente usarlo senza modificare in alcun modo il codice sopra? O potresti indicarmi un meta post che consente questo tipo di codice?
Zeta,

2
@Zgarb Penso per l'ultima riga, assegnalo a un binding (come f=filter t[1..]!!), perché non penso che sia corretto.
TuxCrafting,

1
@ TùxCräftîñg Su questo post Meta , è stato stabilito che funzioni di supporto aggiuntive sono accettabili di default in questa situazione. Questo è anche il formato che di solito vedo per le risposte di Haskell qui. Certo, tu come autore della sfida hai l'autorità finale.
Zgarb,

7

Haskell, 77 74 byte

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

Ciò fornisce una funzione aper l'n-esima voce. È indicizzato zero. In alternativa, a=nub$f[1]creerà l'intero elenco (pigramente).

È una variante dell'elenco del Setcodice di Reinhard Zumkeller .


Perché non yinvece di xssalvare due byte? Inoltre, credo che potresti essere in grado di ridurre l'ultima riga a qualcosa del genere(!!)$nub.f[1]
Michael Klein,

@MichaelKlein: sono troppo abituato (x:xs), l' ho completamente dimenticato, grazie.
Zeta,

6

Python 2, 88 84 byte

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)

Provalo su Ideone .


13
Sei un professionista nel trasformare qualcosa di semplice in qualcosa di illeggibile.
mbomb007,


5

Brachylog , 45 byte

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

Calcola N = 1000in circa 6 secondi sulla mia macchina.

Questo è 1-indicizzato, ad es

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

Spiegazione

  • Predicato principale:

    :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
    
  • Predicato 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
           )
    

Si può notare che non passiamo alcun input al predicato 1 quando chiamiamo y - Yield. A causa della propagazione dei vincoli, troverà l'input giusto una volta raggiunta la 1.clausola che propagherà i valori di input corretti.


4

MATL, 19, 18 17 byte

1w:"tEQy3*qvSu]G)

Questo è un algoritmo estremamente inefficiente. L'interprete online esaurisce la memoria per input superiori a 13.

Un byte salvato, grazie a Luis Mendo!

Provalo online!

Questa versione è più lunga, ma più efficiente (21 byte)

1`tEQy3*qvSutnG3*<]G)

Provalo online

Spiegazione:

Il modo logico per farlo è aggiungere elementi all'array fino a quando non è abbastanza lungo da afferrare l'i elemento. Ecco come funziona quello efficiente. Il modo golfy (e inefficiente) per farlo, è semplicemente aumentare la dimensione dell'array i volte.

Quindi, prima, definiamo la matrice di partenza: 1. Quindi scambiamo i primi due elementi, in modo che l'input sia in primo piano. w. Ora, passiamo attraverso l'input con :". Quindi ho volte:

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.

Ora, abbiamo una gamma gigantesca della sequenza. (Molto più di quanto è necessario per calcolare) Quindi interrompiamo il looping ]e prendiamo l'i-esimo numero da questo array con G)(1-indicizzato)


@LuisMendo Grazie per la punta! Come lo riscriveresti con un ciclo while anziché con il ciclo for? (Forse sarebbe una domanda migliore per la chat room
MATL

Potrebbe essere fatto in questo modo: 1`tEQy3*qvuStnG<]G). La condizione del loop è tnG<(esci quando l'array ha già le dimensioni richieste)
Luis Mendo,

Non sei sicuro di quanto sia un imbroglio, ma nella forversione -loop puoi prendere l'input in unario come una stringa e rimuovere il:
Luis Mendo il

4

JavaScript (ES6), 63 byte

 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)

Probabilmente si arrende rapidamente a causa della ricorsione.


4

Retina, 57

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

Provalo online!

0-indicizzati. Segue l'algoritmo usato frequentemente: rimuove il valore minimo dall'insieme corrente, lo chiama xe aggiunge 2x+1e 3x-1all'insieme un numero di volte uguale all'input, quindi il numero iniziale è il risultato. Il "set" in Retina è solo un elenco che viene ripetutamente ordinato e creato per contenere solo elementi unici. Ci sono alcuni bit subdoli aggiunti all'algoritmo per il golf, che spiegherò una volta che ho avuto un po 'più di tempo.

Grazie mille a Martin per aver giocato a golf a circa 20 byte!


4

Clojure, 114 108 byte

#(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)))))

Non sarei sorpreso se questo potesse essere golfato / ridotto di una quantità significativa, ma setnon supporta l'ennesimo danno davvero al mio treno di pensieri.

Prova online

Versione con spazi:

#(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))
      )))

4

05AB1E, 18 17 byte

Utilizza la codifica CP-1252 .

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

Spiegazione

$                  # 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

Provalo online per piccoli numeri

Molto lento.
Utilizza l'indicizzazione basata su 0.


3

C ++, 102 byte

[](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;};

Questa funzione lambda richiede #include <map>e using std::map.

Il mapqui è solo una raccolta di chiavi; i loro valori vengono ignorati. Uso mapper trarre vantaggio dal codice terse per l'inserimento:

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

Grazie all'ordine ordinato di map, viene estratto l'elemento più piccolo k.begin()->first.


1
Leggermente più corto (97) utilizzando sete initializer liste: [](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

3

In realtà, 27 byte

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

Provalo online!

Questo programma utilizza l'indicizzazione basata su 0. L'approccio è molto bruto, quindi non aspettarti che funzioni nell'interprete online per input più grandi.

Spiegazione:

╗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)

2

CJam (25 byte)

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

Demo online . Si noti che questo utilizza l'indicizzazione in base zero.

Questo utilizza un approccio simile alla maggior parte: applicare i ntempi di trasformazione e quindi ordinare ed estrarre l' nelemento th. Come cenno all'efficienza, la deduplicazione viene applicata all'interno del loop e l'ordinamento viene applicato all'esterno del loop.


2
22: 1ari{(_2*)\3*(@||$}*0=(Anche molto più efficiente.)
Martin Ender,

2

Retina , 48 byte

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

Provalo online!

Ispirato da risposta di nimi ho pensato di provare un approccio diverso per Retina, facendo uso del backtracking del motore regex per capire se un dato numero (unario) è nella sequenza o no. Si scopre che ciò può essere determinato con un regex a 27 byte, ma utilizzarlo costa un po 'di più, ma finisce per essere più breve dell'approccio generativo.

Ecco una soluzione alternativa a 48 byte:

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

E usando l'I / O unario possiamo fare 42 byte, ma sto cercando di evitarlo e anche l'altra risposta Retina usa il decimale:

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

2

Rubino, 70 byte

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

Spiegazione

->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]
}

1
Quel *1trucco è pulito
TuxCrafting

1

J, 31 byte

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

Utilizza l'indicizzazione in base zero. Molto inefficiente dalla memoria.

Spiegazione

{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

1

Ottava, 68 byte

function r=a(n)s=1;for(i=1:n)r=s(i);s=union(s,[r*2+1 r*3-1]);end;end

Puoi rimuovere la finale;end
Luis Mendo il

Nella versione che uso, almeno (4.0.0) non puoi ...
dcsohl,

1

Perl, 173 132 byte +1 per -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];

Probabilmente posso fare di meglio se ci pensassi di più, ma questo è quello che mi è venuto in mente dopo pochi minuti. La mia prima volta a giocare a golf, quindi è stato molto divertente!

Grazie a @Dada e @ TùxCräftîñg (e un mucchio di ottimizzazioni di byte minori) per -40 byte


1
Penso che puoi lasciare gli spazi dopo la mys, la returne la print(Non posso provare, non ho il perl)
TuxCrafting,

1
@ TùxCräftîñg ha ragione return. Il printpuò essere sostituito da a say. La maggior parte dei mynon sono necessari (è necessario solo quello prima $anella funzione credo. Non inizializzare né dichiarare @b. Probabilmente si può cadere l'inizializzazione $ise si fa $i++all'inizio del, mentre invece alla fine. popÈ più breve di shift. Ricorda che c'è molto di più perl golf che non solo la rimozione di spazi bianchi e newline ...
Dada,

0

JavaScript (ES6), 58

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

Meno golf

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
}

Test

Informazioni su tempo e memoria: elemento 500000 in ~ 20 sec e 300 MB utilizzati dal mio FireFox alfa a 64 bit

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.