Wythoff superiore o inferiore?


20

Innanzitutto, parliamo delle sequenze di Beatty . Dato un numero irrazionale positivo r , possiamo costruire una sequenza infinita moltiplicando gli interi positivi per r in ordine e prendendo la base di ogni calcolo risultante. Per esempio,
Sequenza Beatty di r

Se r > 1, abbiamo una condizione speciale. Possiamo formare un altro numero irrazionale s come s = r / ( r - 1). Questo può quindi generare la propria sequenza Beatty, B s . Il trucco è che B r e B s sono complementari , il che significa che ogni numero intero positivo si trova esattamente in una delle due sequenze.

Se impostiamo r = ϕ, il rapporto aureo, otteniamo s = r + 1 e due sequenze speciali. La sequenza Wythoff inferiore per r :

1, 3, 4, 6, 8, 9, 11, 12, 14, 16, 17, 19, 21, 22, 24, 25, 27, 29, ... 

e la sequenza Wythoff superiore per s :

2, 5, 7, 10, 13, 15, 18, 20, 23, 26, 28, 31, 34, 36, 39, 41, 44, 47, ... 

Queste sono le sequenze A000201 e A001950 su OEIS, rispettivamente.

La sfida

Dato un numero intero di input positivo 1 <= n <= 1000, emettere uno di due valori distinti che indicano se l'input è nella sequenza Wythoff inferiore o nella sequenza superiore . I valori di output potrebbero essere -1e 1, truee false, uppere lower, ecc.

Sebbene l'algoritmo inviato debba teoricamente funzionare per tutti gli input, in pratica deve funzionare solo con i primi 1000 numeri di input.

I / O e regole

  • L'input e l'output possono essere forniti con qualsiasi metodo conveniente .
  • Si può presumere che l'input e l'output si adattino al tipo di numero nativo della tua lingua.
  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

1
Fondamentalmente è "golf la sequenza Wythoff inferiore" perché la sequenza Wythoff superiore richiede 1 operazione in più rispetto a quella inferiore (phi quadrata).
Magic Octopus Urn,

Risposte:


12

JavaScript (ES6), 50 35 byte

f=(n,s="1",t=0)=>s[n-1]||f(n,s+t,s)
<input type=number min=1 oninput=o.textContent=this.value&amp;&amp;f(this.value)><pre id=o>

Uscite 1per inferiore e 0per superiore. Spiegazione: Lista parziale dei valori booleani può essere costruito utilizzando un Fibonacci-like identità: dato due liste, a cominciare 1e 10, ciascuna lista successiva è la concatenazione dei due precedenti, con conseguente 101, 10110, 10110101ecc In questo caso è leggermente Golfier avere una finta 0esima voce 0e la usa per costruire il secondo elemento della lista.


4
How the what ...
AdmBorkBork,

4
Adoro come la spiegazione mi abbia fatto capire meno +1. I whoozits parziali booleani rubano l'identità di un uomo di nome Fibbonacci, che viene quindi collegato con i suoi nipoti per falsificare l'ingresso della costruzione.
Magic Octopus Urn,

Ero curioso di sapere fino a che punto poteva funzionare questa versione a 33 byte usando un'approssimazione. La risposta è apparentemente fino a n = 375 .
Arnauld,

7

Haskell , 26 byte

(l!!)
l=0:do x<-l;[1-x..1]

Provalo online!

Nessun galleggiante, precisione illimitata. Grazie per H.PWiz per due byte.


Anche questo sarebbe di 26 byte, ma non capisco perché non funziona
H.Piz,

@ H.PWiz Penso che sia perché l'elenco vuoto è un punto fisso.
xnor

Ah, non l'avevo considerato e lo stavo confrontando con un metodo "equivalente" usato ~(x:t). Grazie
H.Pwiz,

@ H.PWiz / xnor Tecnicamente in Haskell il punto fisso utilizzato è il più piccolo denotazionalmente, qui in basso / undefined. Il fatto che ci siano anche due differenti definiti è solo accidentale.
Ørjan Johansen,

7

Python , 25 byte

lambda n:-n*2%(5**.5+1)<2

Provalo online!

Utilizza la condizione molto semplice:

nè nella sequenza Wythoff inferiore esattamente se -n%phi<1.

Si noti che il risultato del modulo è positivo anche se -nè negativo, corrispondente a come Python fa il modulo.

Prova: Let a = -n%phi, che si trova nella gamma 0 <= a < phi. Possiamo dividere il -nmodulo phicome -n = -k*phi + aper un numero intero positivo k. Riorganizzare quello a n+a = k*phi.

Se a<1, quindi n = floor(n+a) = floor(k*phi), e così è nella sequenza Wythoff inferiore.

Altrimenti, abbiamo 1 <= a < phicosì

n+1 = floor(n+a) = floor(k*phi)
n > n+a-phi = k*phi - phi = (k-1)*phi

così ncade nel divario tra floor((k-1)*phi)e floor(k*phi) ed è perso dalla sequenza Wythoff inferiore.

Questo corrisponde a questo codice:

lambda n:-n%(5**.5/2+.5)<1

Provalo online!

Salviamo un byte raddoppiando a -(n*2)%(phi*2)<2.


Potresti spiegare come nasce la formula? Ho cercato di ricavarlo dalle definizioni della sequenza, ma mi sono perso nei boschi.
Sundar - Ripristina Monica il

@sundar Aggiunta una prova.
xnor

5

05AB1E , 9 byte

L5t>;*óså

Provalo online!


0 significa superiore, 1 significa inferiore. Prova i primi 100: provalo online!


    CODE   |      COMMAND      # Stack (Input = 4)
===========+===================#=======================
L          | [1..a]            # [1,2,3,4]
 5t>;      | (sqrt(5) + 1)/2   # [phi, [1,2,3,4]]
     *     | [1..a]*phi        # [[1.6,3.2,4.8,6.4]]
      ó    | floor([1..a]*phi) # [[1,3,4,6]]
       så  | n in list?        # [[1]]

Dump di comando non elaborato:

----------------------------------
Depth: 0
Stack: []
Current command: L

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4]]
Current command: 5

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], '5']
Current command: t

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], 2.23606797749979]
Current command: >

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], 3.23606797749979]
Current command: ;

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], 1.618033988749895]
Current command: *

----------------------------------
Depth: 0
Stack: [[1.618033988749895, 3.23606797749979, 4.854101966249685, 6.47213595499958]]
Current command: ó

----------------------------------
Depth: 0
Stack: [[1, 3, 4, 6]]
Current command: s

----------------------------------
Depth: 0
Stack: [[1, 3, 4, 6], '4']
Current command: å
1
stack > [1]

Ho avuto lo stesso, ma usando ï:)
Emigna il

@emigna Sono stato sorpreso che il phi non fosse nelle costanti matematiche. 5t>;a un byter 2 potrebbe non valerne la pena però ...
Magic Octopus Urn,

Sì, stavo quasi ricordando che avrebbe potuto essere (ma non lo è). Sembra qualcosa che dovremmo aggiungere.
Emigna,

@Emigna Sono abbastanza sicuro che la risposta di Jelly sia legittimamente questa, ma con un phi incorporato ahah.
Magic Octopus Urn,

Haha ho avuto lo stesso, ma usando ïe ¢lol :) Tutte le nostre soluzioni sono così strettamente correlate
Mr. Xcoder

5

Gelatina , 5 byte

N%ØpỊ

Provalo online!

Salvato 1 byte grazie al golf Python di xnor .


Gelatina , 6 byte

×€ØpḞċ

Provalo online!

Restituisce 1 per inferiore e 0 per superiore.

×€ØpḞċ – Full Program / Monadic Link. Argument: N.
×€     – Multiply each integer in (0, N] by...
  Øp   – Phi.
    Ḟ  – Floor each of them.
     ċ – And count the occurrences of N in that list.

(0,N]Zφ>1N>00<N<Nφ


Immagino che una di queste sia una costante di 1 byte per phi: P?
Magic Octopus Urn,

2
No, a due byte:Øp
Mr. Xcoder

Hehe, meglio del mio 4 byte in 05AB1E:5t>;
Magic Octopus Urn

4

Brain-Flak , 78 byte

([{}]()){<>{}((([()]))){{<>({}())}{}(([({})]({}{})))}<>([{}]{}<>)}<>({}()){{}}

Provalo online!

Non emette nulla per inferiore e 0per superiore. Passare a uno schema di output più sensato costerebbe 6 byte.


4

Python 2 , 39 33 32 byte

-6 byte grazie a Mr. Xcoder
-1 byte grazie a Zacharý

lambda n,r=.5+5**.5/2:-~n//r<n/r

Provalo online!

Restituisce Falseper inferiore e Trueper superiore


lambda n,r=(1+5**.5)/2:-~n//r<n/rsalva 6 byte.
Mr. Xcoder,

1
Inoltre, lambda n,r=.5+5**.5/2:-~n//r<n/rdovrebbe funzionare anche per radere un byte
Zacharý

3

Julia 0.6 , 16 byte

n->n÷φ<-~n÷φ

Provalo online!

Mentre giocavo con i numeri, mi sono imbattuto in questa proprietà: floor (n / φ) == floor ((n + 1) / φ) se n è nella sequenza Wythoff superiore e floor (n / φ) <floor ( (n + 1) / φ) se n è nella sequenza Wythoff inferiore. Non ho capito come nasce questa proprietà, ma dà i risultati corretti almeno fino a n = 100000 (e probabilmente oltre).


Vecchia risposta:

Julia 0.6 , 31 byte

n->n∈[floor(i*φ)for i1:n]

Provalo online!

Restituisce trueper la falsesequenza Wythoff inferiore e superiore.


Poiché n / φ dei numeri fino a n sono inferiori e gli altri sono superiori, la differenza media tra i numeri inferiori successivi è φ; la divisione dei numeri inferiori per φ ti dà una sequenza in cui la differenza media è 1; questo rende possibile che il piano di quella sequenza sia il numero intero. La mia matematica non è abbastanza buona per andare oltre.
Neil,


1

Wolfram Language (Mathematica) , 26 byte

#~Ceiling~GoldenRatio<#+1&

Provalo online!

Un intero nè nella iff Wythoff Sequence inferiore ceil(n/phi) - 1/phi < n/phi.

Prova che ceil(n/phi) - 1/phi < n/phiè ...

Sufficiente:

  1. Let ceil(n/phi) - 1/phi < n/phi.

  2. Poi, ceil(n/phi) * phi < n + 1.

  3. Nota n == n/phi * phi <= ceil(n/phi) * phi.

  4. Quindi, n <= ceil(n/phi) * phi < n + 1.

  5. Poiché ne ceil(n/phi)sono numeri interi, invochiamo la definizione di floor e state floor(ceil(n/phi) * phi) == ned nè nella sequenza Wythoff inferiore.

Necessario; prova del contrapositivo:

  1. Let ceil(n/phi) - 1/phi >= n/phi.

  2. Poi, ceil(n/phi) * phi >= n + 1.

  3. Nota n + phi > (n/phi + 1) * phi > ceil(n/phi) * phi

  4. Quindi n > (ceil(n/phi) - 1) * phi.

  5. Da allora (ceil(n/phi) - 1) * phi < n < n + 1 <= ceil(n/phi) * phi, nnon è nella sequenza Wythoff inferiore.


Anche questo non ha alcun errore di arrotondamento.
user202729,

1

Japt , 10 byte

Restituisce vero per inferiore e falso per superiore.

õ_*MQ fÃøU

Provalo online!

Spiegazione:

õ_*MQ fÃøU
             // Implicit U = Input
õ            // Range [1...U]
 _           // Loop through the range, at each element:
  *MQ        //   Multiply by the Golden ratio
      f      //   Floor
       Ã     // End Loop
        øU   // Return true if U is found in the collection

1
Ho avuto questo anche per 10 byte.
Shaggy,

1

Java 10, 77 53 52 byte

n->{var r=Math.sqrt(5)/2+.5;return(int)(-~n/r)<n/r;}

Python 2 di Port of @ Rod .
-1 byte grazie a @ Zacharý .

Provalo online.


I vecchi 77 76 byte rispondono:

n->{for(int i=0;i++<n;)if(n==(int)((Math.sqrt(5)+1)/2*i))return 1;return 0;}

-1 byte grazie a @ovs 'per qualcosa che mi sono raccomandato la scorsa settimana .. xD

Restituisce 1per inferiore; 0per tomaia.

Provalo online.

Spiegazione:

n->{                    // Method with integer as both parameter and return-type
  for(int i=0;++i<=n;)  //  Loop `i` in the range [1, `n`]
    if(n==(int)((Math.sqrt(5)+1)/2*i))
                        //   If `n` is equal to `floor(Phi * i)`:
      return 1;         //    Return 1
  return 0;}            //  Return 0 if we haven't returned inside the loop already

i*Phiviene calcolato prendendo (sqrt(5)+1)/2 * i, e quindi lo pavimentiamo lanciandolo su un numero intero per troncare il decimale.


1
++i<=nsulla tua vecchia risposta può essere i++<n.
Ovs,


1
Penso che dovrebbe funzionare per -1 byte:n->{var r=Math.sqrt(5)/2+.5;return(int)(-~n/r)<n/r;}
Zacharý

@ Zacharý Lo fa davvero, grazie!
Kevin Cruijssen,

1

Haskell , 153 139 126 79 byte

Precisione illimitata!

l=length
f a c|n<-2*l a-c,n<0||l a<a!!n=c:a|1>0=a
g x=x==(foldl f[][1..x+1])!!0

Provalo online!

Spiegazione

Invece di utilizzare un'approssimazione del rapporto aureo per calcolare il risultato, il che significa che sono soggetti a errori man mano che la dimensione dell'input aumenta. Questa risposta no. Invece utilizza la formula fornita sull'OEIS che aè la sequenza univoca tale

n . b(n) = a(a(n))+1

dov'è bil complimento ordinato.


1
"Tutto" non era nemmeno vero prima che tu venissi sconfitto ...
Neil,

@Neil buon punto. Devo aver perso la tua risposta.
Wheat Wizard

Sebbene la tua risposta sia limitata dal fatto che javascript non ha un tipo integrale?
Wheat Wizard

Bene, finirà la memoria molto prima di allora ...
Neil,

1

Brachylog , 8 byte

≥ℕ;φ×⌋₁?

Provalo online!

Il predicato ha esito positivo se l'input si trova nella sequenza Wythoff inferiore e non riesce se si trova nella sequenza Wythoff superiore.

 ℕ          There exists a whole number
≥           less than or equal to
            the input such that
  ;φ×       multiplied by phi
     ⌋₁     and rounded down
       ?    it is the input.

Se la mancata chiusura è un metodo di output valido, è possibile omettere il primo byte.


Questa è probabilmente la prima volta che φviene utilizzata in un programma Brachylog. Finalmente!
Fatalizza il

0

MATL , 8 byte

t:17L*km

Provalo online!

Spiegazione

t      % Implicit input. Duplicate
:      % Range
17L    % Push golden ratio (as a float)
*      % Multiply, element-wise
k      % Round down, element-wise
m      % Ismember. Implicit output

0

K (oK) , 20 byte

Soluzione:

x in_(.5*1+%5)*1+!x:

Provalo online!

Spiegazione:

x in_(.5*1+%5)*1+!x: / the solution
                  x: / save input as x
                 !   / generate range 0..x
               1+    / add 1
              *      / multiply by
     (       )       / do this together
           %5        / square-root of 5
         1+          / add 1
      .5*            / multiply by .5
    _                / floor
x in                 / is input in this list?

0

TI-BASIC (TI-84), 18 byte

max(Ans=iPart((√(5)+1)/2randIntNoRep(1,Ans

L'ingresso è in Ans.
L'output è attivo Anse viene stampato automaticamente.
Stampa 1se l'input è nella sequenza inferiore o 0se è nella sequenza superiore.

0<N<1000

Esempio:

27
             27
prgmCDGFA
              1
44
             44
prgmCDGFA
              0

Spiegazione:

max(Ans=iPart((√(5)+1)/2randIntNoRep(1,Ans    ;full program, example input: 5
                        randIntNoRep(1,Ans    ;generate a list of random integers in [1,Ans]
                                               ; {1, 3, 2, 5, 4}
              (√(5)+1)/2                      ;calculate phi and then multiply the resulting
                                              ;list by phi
                                               ; {1.618 4.8541 3.2361 8.0902 6.4721}
        iPart(                                ;truncate
                                               ; {1 4 3 8 6}
    Ans=                                      ;compare the input to each element in the list
                                              ;and generate a list based off of the results
                                               ; {0 0 0 0 0}
max(                                          ;get the maximum element in the list and
                                              ;implicitly print it

Nota: TI-BASIC è un linguaggio tokenizzato. Il conteggio dei caratteri non equivale al conteggio dei byte.


0

cQuents , 5 byte

?F$`g

Provalo online!

Spiegazione

?         output true if in sequence, false if not in sequence
          each term in the sequence equals:

 F        floor (
  $               index * 
   `g                     golden ratio
     )                                 ) implicit
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.