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.