Wyższy czy niższy Wythoff?


20

Najpierw porozmawiajmy o sekwencjach Beatty . Biorąc pod uwagę dodatnią liczbę niewymierną r , możemy skonstruować nieskończoną sekwencję poprzez pomnożenie dodatnich liczb całkowitych do r w kolejności i zabranie głosu za każde wynikowe obliczenie. Na przykład,
Beatty ciąg r

Jeśli r > 1, mamy specjalny warunek. Możemy utworzyć inną liczbę niewymierną s jako s = r / ( r - 1). To może następnie wygenerować jego własnej sekwencji Beatty, B y . Schludny Sztuką jest to, że B R i B s są komplementarne , co oznacza, że każda dodatnia jest dokładnie w jednym z dwóch sekwencji.

Jeśli ustawimy r = ϕ, złoty stosunek, otrzymamy s = r + 1 i dwie specjalne sekwencje. Mniejsza sekwencja Wythoff do R :

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

i górna sekwencja Wythoffa dla s :

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

Są to odpowiednio sekwencje A000201 i A001950 w OEIS.

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą wejściową 1 <= n <= 1000, wyślij jedną z dwóch różnych wartości wskazujących, czy dane wejściowe są w dolnej sekwencji Wythoffa czy w górnej sekwencji. Wartościami wyjściowymi mogą być -1i 1, truei false, upperi loweritd.

Chociaż przesłany algorytm musi teoretycznie działać dla wszystkich danych wejściowych, w praktyce musi on działać tylko z pierwszymi 1000 liczbami wejściowymi.

I / O i reguły

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Można założyć, że dane wejściowe i wyjściowe pasują do rodzimego typu liczb w twoim języku.
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

1
Zasadniczo jest to „golf dolną sekwencją Wythoffa”, ponieważ górna sekwencja Wythoffa wymaga 1 operacji większej niż dolna (kwadraty phi).
— Magic Octopus Urn

Odpowiedzi:


12

JavaScript (ES6), 50 35 bajtów

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>

Wyjścia 1dla dolnej i 0górnej. Objaśnienie: Częściowa wykazy wartości logicznych może być wykonana przy użyciu Fibonacciego jak tożsamość: podany dwa wykazy, począwszy 1i 10każda następna lista jest połączeniem dwóch poprzednich, w wyniku czego 101,10110 , 10110101itd. W tym przypadku jest to nieco golfier mieć fałszywy 0 wpis 0i użyj go do skonstruowania drugiego elementu listy.


4
Jak co ...
— AdmBorkBork

4
Uwielbiam sposób, w jaki wyjaśnienie pomogło mi zrozumieć mniej +1. Częściowe dziwki boolean kradną tożsamość mężczyzny o imieniu Fibbonacci, który jest następnie łączony ze swoimi wnukami, aby sfałszować wejście do budowy.
— Magic Octopus Urn

Byłem ciekawy, jak daleko ta 33-bajtowa wersja może działać, używając przybliżenia. Odpowiedź najwyraźniej wynosi n = 375 .
— Arnauld

7

Haskell , 26 bajtów

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

Wypróbuj online!

Bez pływaków, nieograniczona precyzja. Dzięki za H.PWiz za dwa bajty.


To byłoby również 26 bajtów, ale nie rozumiem, dlaczego to nie działa
— H.PWiz

@ H.PWiz Myślę, że dzieje się tak, ponieważ pusta lista jest stałym punktem.
— xnor

Ach, nie zastanawiałem się nad tym i porównałem go z „równoważną” metodą, która zastosowała ~(x:t). Dzięki
— H.PWiz

@ H.PWiz / xnor Technicznie w Haskell zastosowanym punktem jest najmniejszy denotacyjnie, tutaj u dołu / undefined. Fakt, że istnieją również dwa różne zdefiniowane, jest po prostu przypadkowy.
— Ørjan Johansen

7

Python , 25 bajtów

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

Wypróbuj online!

Wykorzystuje bardzo prosty warunek:

njest w dolnej sekwencji Wythoffa dokładnie, jeśli -n%phi<1.

Zauważ, że wynik modulo jest dodatni, chociaż -nujemny, co odpowiada modulo w Pythonie.

Dowód: Let a = -n%phi, który leży w przedziale 0 <= a < phi. Możemy podzielić -nmodulo phijak -n = -k*phi + ana pewną dodatnią liczbę całkowitą k. Zmień to nan+a = k*phi .

Jeśli a<1takn = floor(n+a) = floor(k*phi) i tak jest w dolnej sekwencji Wythoffa.

W przeciwnym razie mamy 1 <= a < phito

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

dlatego nmieści się w szczelinie pomiędzy floor((k-1)*phi)a floor(k*phi) i pominięcia przez dolną sekwencji Wythoff.

Odpowiada to kodowi:

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

Wypróbuj online!

Oszczędzamy bajt, podwajając do -(n*2)%(phi*2)<2.


Czy możesz wyjaśnić, jak powstaje formuła? Próbowałem wyprowadzić to z definicji sekwencji, ale zgubiłem się w lesie.
— Sundar - Przywróć Monikę

@sundar Dodano dowód.
— xnor

5

05AB1E , 9 bajtów

L5t>;*óså

Wypróbuj online!


0 oznacza górny, 1 oznacza dolny. Wypróbuj pierwsze 100: Wypróbuj 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]]

Surowy zrzut poleceń:

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

Miałem to samo, ale używając ï:)
— Emigna

@emigna byłem zaskoczony, że phi nie ma stałych matematycznych. 5t>;do 2 bajtów może nie być tego warte ...
— Magic Octopus Urn

Tak, na wpół pamiętałem, że to mogło być (ale nie jest). Wygląda na to, że powinniśmy dodać.
— Emigna

@Emigna Jestem całkiem pewien, że odpowiedź Jelly jest słuszna, ale z wbudowanym phi hahah.
— Magic Octopus Urn

Haha, miałem to samo, ale używam ïi ¢lol :) Wszystkie nasze rozwiązania są tak ściśle powiązane
— Pan Xcoder

5

Galaretka , 5 bajtów

N%ØpỊ

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki xnor's Python golf .


Galaretka , 6 bajtów

×€ØpḞċ

Wypróbuj online!

Zwraca 1 dla dolnej i 0 dla górnej.

×€Ø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.φ


Zgaduję, że jedna z nich jest stałą 1-bajtową dla phi: P?
— Magic Octopus Urn

2
Nie, dwubajtowy:Øp
— Pan Xcoder

Hehe, lepszy niż mój 4-bajtowy w 05AB1E:5t>;
— Magic Octopus Urn

4

Brain-Flak , 78 bajtów

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

Wypróbuj online!

Nie wyprowadza nic dla dolnego i 0górnego. Przejście na bardziej rozsądny schemat wyjściowy kosztuje 6 bajtów.


4

Python 2 , 39 33 32 bajty

-6 bajtów dzięki Mr. Xcoder
-1 bajtów dzięki Zacharýmu

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

Wypróbuj online!

Zwraca Falsedolną i Truegórną


lambda n,r=(1+5**.5)/2:-~n//r<n/roszczędza 6 bajtów.
— Pan Xcoder,

1
Ponadto, lambda n,r=.5+5**.5/2:-~n//r<n/rpowinny działać jak dobrze golić jeden bajt
— Zachary

3

Julia 0.6 , 16 bajtów

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

Wypróbuj online!

Podczas zabawy z liczbami natknąłem się na tę właściwość: floor (n / φ) == floor ((n + 1) / φ), jeśli n jest w górnej sekwencji Wythoffa, a floor (n / φ) <floor ( (n + 1) / φ), jeśli n jest w dolnej sekwencji Wythoffa. Nie zorientowałem się, jak ta właściwość się pojawia, ale daje prawidłowe wyniki co najmniej do n = 100000 (i prawdopodobnie więcej).


Stara odpowiedź:

Julia 0.6 , 31 bajtów

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

Wypróbuj online!

Zwraca truedla dolnej i falsegórnej sekwencji Wythoffa.


Ponieważ n / φ liczb do n jest niższych, a pozostałe są wyższe, średnia różnica między kolejnymi niższymi liczbami wynosi φ; podzielenie niższych liczb przez φ daje sekwencję, w której średnia różnica wynosi 1; umożliwia to, że dolną częścią tej sekwencji są liczby całkowite. Moja matematyka nie jest jednak wystarczająco dobra, aby iść dalej.
— Neil


1

Wolfram Language (Mathematica) , 26 bajtów

#~Ceiling~GoldenRatio<#+1&

Wypróbuj online!

Liczba całkowita nznajduje się w dolnej sekwencji Wythoffa iff ceil(n/phi) - 1/phi < n/phi.

Dowód, że ceil(n/phi) - 1/phi < n/phi...

Wystarczający:

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

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

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

  4. Dlatego też n <= ceil(n/phi) * phi < n + 1.

  5. Ponieważ ni ceil(n/phi)są liczbami całkowitymi, odwołujemy się do definicji floor i state floor(ceil(n/phi) * phi) == n, i nznajduje się w dolnej sekwencji Wythoffa.

Niezbędny; dowód antykoncepcyjny:

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

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

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

  4. Stąd n > (ceil(n/phi) - 1) * phi.

  5. Ponieważ (ceil(n/phi) - 1) * phi < n < n + 1 <= ceil(n/phi) * phi, nnie jest w dolnej sekwencji Wythoff.


To również nie ma błędu zaokrąglania.
— user202729,

1

Japt , 10 bajtów

Zwraca true dla dolnej i false dla górnej.

õ_*MQ fÃøU

Wypróbuj online!

Wyjaśnienie:

õ_*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
Miałem to również na 10 bajtów.
— Shaggy

1

Java 10, 77 53 52 bajty

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

Odpowiedź na Python 2 dla portu @ Rod .
-1 bajt dzięki @ Zacharý .

Wypróbuj online.


Stara 77 76 bajtów odpowiedź:

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

-1 bajt dzięki @ovs za coś co poleciłem sobie w zeszłym tygodniu .. xD

Zwroty 1 za niższe;0do cholewki.

Wypróbuj online.

Wyjaśnienie:

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*Phijest obliczany na podstawie wzięcia (sqrt(5)+1)/2 * i, a następnie wprowadzamy wartość podłogową, rzucając ją na liczbę całkowitą w celu obcięcia dziesiętnego.


1
++i<=nna twojej starej odpowiedzi może być i++<n.
— ovs


1
Myślę, że to powinno działać dla -1 bajtów:n->{var r=Math.sqrt(5)/2+.5;return(int)(-~n/r)<n/r;}
— Zacharý

@ Zacharý To prawda, dzięki!
— Kevin Cruijssen

1

Haskell , 153 139 126 79 bajtów

Nieograniczona precyzja!

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

Wypróbuj online!

Wyjaśnienie

Zamiast używać przybliżenia złotego współczynnika do obliczania wyniku, co oznacza, że ​​są podatne na błędy wraz ze wzrostem wielkości wejściowej. Ta odpowiedź nie. Zamiast tego wykorzystuje wzór podany w OEIS, który ajest unikalną sekwencją taką, że

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

gdzie bjest zamówiony komplement.


1
„Wszystko” nie było nawet prawdą, zanim zostałeś wyrzucony z golfa ...
— Neil

@Neil Dobry punkt. Musiałem przegapić twoją odpowiedź.
— Wheat Wizard

Chociaż twoja odpowiedź jest ograniczona faktem, że javascript nie ma typu integralnego?
— Wheat Wizard

No cóż, zabraknie mu pamięci wcześniej ...
— Neil

1

Brachylog , 8 bajtów

≥ℕ;φ×⌋₁?

Wypróbuj online!

Predykat się powiedzie, jeśli dane wejściowe znajdują się w dolnej sekwencji Wythoffa, a porażki, jeśli będą w górnej sekwencji Wythoffa.

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

Jeśli niepowodzeniem zakończenia jest poprawna metoda wyjściowa, pierwszy bajt można pominąć.


Jest to prawdopodobnie pierwszy raz φw programie Brachylog. Nareszcie!
— Fatalize

0

MATL , 8 bajtów

t:17L*km

Wypróbuj online!

Wyjaśnienie

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 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

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 bajtów

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

Wejście jest w Ans.
Wyjście jest włączone Ansi jest drukowane automatycznie.
Wydruki1 jeśli dane wejściowe są w dolnej sekwencji lub0 jeśli jest w górnej sekwencji.

Przypadkowo ten program będzie działał tylko dla 0<N.<1000 .

Przykład:

27
             27
prgmCDGFA
              1
44
             44
prgmCDGFA
              0

Wyjaśnienie:

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

Uwaga: TI-BASIC jest językiem tokenizowanym. Liczba znaków nie jest równa liczbie bajtów.


0

cQuents , 5 bajtów

?F$`g

Wypróbuj online!

Wyjaśnienie

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

 F        floor (
  $               index * 
   `g                     golden ratio
     )                                 ) implicit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.