Wyliczanie liczb całkowitych zawrotnych


25

Waszym wyzwaniem jest dziś wyprowadzenie danego terminu z wyliczenia wszystkich liczb całkowitych. Sekwencja jest następująca: Jeśli mamy funkcję indeksowaną przez zero, która generuje sekwencję f(n)i ceil(x)jest funkcją pułapu, to f(0) = 0; abs(f(n)) = ceil(n/2); sign(f(n))jest dodatni, gdy ni ceil(n/2)są nieparzyste lub oba nieparzyste.

Aby zrozumieć tę sekwencję, pierwsze kilka terminów jest następujących: 0 1 -1 -2 2 3 -3 -4 4 5 -5 -6 6 7 -7...

Twoim zadaniem jest napisanie programu, który pobierze liczbę całkowitą ni wyświetli nth termin ciągu. Dane wejściowe mogą mieć tylko indeks 0 lub 1.

Przypadki testowe (indeksowane 0):

0  =>  0
1  =>  1
2  => -1
3  => -2
4  =>  2
5  =>  3

To jest , wygrywa najmniej bajtów!



Wydaje się, że jest odwrotnością funkcji składania
sergiol

Odpowiedzi:


8

SOGL V0.12 , 8 6 bajtów

I».»⌡±

Wypróbuj tutaj! lub wypróbuj pierwsze kilka liczb (nieco zmienione, aby działało)
0-indeksowane.

Wyjaśnienie:

I       increment the input
 »      floor divide by 2
  .     push the original input
   »    floor divide by 2
    ⌡   that many times
     ±    negate

Lub prościej:

(input + 1) // 2 negated input // 2 times
        I     »     ±      .     »    ⌡

3
NIE MIAŁO JEDNEJ MINUTY!
NieDzejkob

6
Ja ».»jestem na telefonie I».»⌡±.
Jonathan Allan

@JonathanAllan Nie rozumiem ._.
Pavel



4

C, 25 bajtów

f(n){return~n/2*~-(n&2);}

Możesz zapisać 4 bajty, przypisując wartość zwracaną do pierwszego parametru zamiast używać słowa kluczowego return. f(n){n=~n/2*~-(n&2);}
cleblanc

5
@cleblanc Nie tak działa C.
orlp

2
gcc -O0ponieważ x86-64 kompiluje wersję @ cleblanc do instrukcji, które powodują pozostawienie wyniku mnożenia eax( godbolt.org/g/dztKPV ), ale wtedy byłaby to x86-64 gcc -O0odpowiedź, a nie odpowiedź C. Nie głosuję w górę odpowiedzi C, które łamią się z włączoną optymalizacją, szczególnie nie to głupie ostatnie wyrażenie jako bzdura zwracanej wartości. Nawet jeśli tak działa gcc, to nie tak działa C.
Peter Cordes,

Zrób wskaźnik. Nie potrzebujesz optymalizacji, jeśli oryginalne i końcowe wartości nie znajdują się na stosie.
mreff555

1
@ mreff555 To byłaby niestandardowa (choć dopuszczalna) metoda IO i nie byłaby krótsza.
orlp


3

Pyke , 6 bajtów

heQeV_

Wypróbuj tutaj!

Wykorzystuje podejście dzaima ... Beats Ties Jelly!

Wyjaśnienie

h      - Increment the input, which is implicit at the beginning.
 e     - Floor halve.
  Q    - Push the input.
   e   - Floor halve.
    V_ - Apply repeatedly (V), ^ times, using negation (_).
       - Output implicitly.

Hex kodowane bajtów równoważne to: 68 65 51 65 56 5F.




3

Mathematica, 24 bajty

(s=⌈#/2⌉)(-1)^(#+s)&  

-14 bajtów od @Misha Lavrov


1
Użycie Boolei OddQpowoduje konwersję liczb nieparzystych na 1, a parzystych na 0, ale tutaj nie jest to potrzebne: moc -1 daje i tak właściwą odpowiedź na wszystkie liczby nieparzyste. Możesz więc ograniczyć ten krok do (-1)^Tr@{#,s}lub po prostu (-1)^(#+s).
Misha Lavrov







2

JavaScript (ES6), 18 bajtów

f=
n=>n/2^(n<<30>>30)
<input type=number min=0 value=0 oninput=o.textContent=f(this.value)><pre id=o>0

0-indeksowane.



2

Sześciennie , 23 bajty

(1-indeksowany)

FDF'$:7+8/0_0*0-8*7/0%6

Wypróbuj online!

Główną trudnością podczas pisania kodu w Cubically są:

  • Jest tylko 1 zmienna możliwa do zapisu, oraz
  • Zdobycie stałych jest trudne.

To rozwiązanie oblicza

((((n+1)/2)%2)*2-1)*n/2

gdzie /oznacza dzielenie całkowite. Potrzebuje tylko 1 zmiennej tymczasowej oraz stałych 1 i 2.

Wyjaśnienie:

FDF'$:7+8/0_0*0-8*7/0%6
FDF'                      Set face value of face 0 to 2, and value of memory index 8 (cube is unsolved) to 1 (true = unsolved)
    $                     Read input
     :7                                 input
       +8                                + 1
         /0                        (        ) /2
           _0                     (             ) %2
             *0                  (                  ) *2
               -8                                        -1
                 *7             (                          ) *n
                   /0                                          /2
                     %6   Print

2

TI-Basic (TI-84 Plus CE), 20 bajtów

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2

Pełny program, który nazywa się jak 5:prgmNAME.

TI-Basic jest tokenizowanym językiem , wszystkie użyte tutaj tokeny mają jeden bajt, z wyjątkiem remainder(dwóch. reprezentuje token regatywny, który jest wpisywany za pomocą (-)klawisza.

Przykłady:

0:prgmNAME
 => 0
1:prgmNAME
 => 1
2:prgmNAME
 => -1
#etc

Wyjaśnienie:

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2
‾int(‾Ans/2)                           # -int(-X) is ciel(X), so ciel(Ans/2)
                          int(Ans/2)   # int(X) is floor(X), so floor(Ans/2)
                remainder(int(Ans/2),2 # 1 if floor(Ans/2) is odd else 0
            (1-2remainder(int(Ans/2),2 # -1 if floor(Ans/2) is odd, else 1
_int(_Ans/2)(1-2remainder(int(Ans/2),2 # -ciel(Ans/2) if floor(Ans/2) is odd, else ciel(Ans/2)

Ta sama formuła co funkcja Y-var:

Y1= ‾int(‾X/2)(1-2remainder(int(X/2),2


2

Java 8, 15 bajtów

n->~n/2*~-(n&2)

EDYCJA: Czy Java jest naprawdę najkrótszym językiem nie golfowym ?! o.Ô

Wyjaśnienie:

Wypróbuj tutaj.

Wykorzystam poniższą tabelę jako odniesienie do tego, co się dzieje.

  1. ~njest równy -n-1.
  2. Ponieważ dzielenie liczb całkowitych w Javie automatycznie tworzy podłogi na dodatnich liczbach całkowitych i pułapach na ujemnych liczbach całkowitych, ~n/2spowoduje to sekwencję0,-1,-1,-2,-2,-3,-3,-4,-4,-5,-5,...
  3. n&2spowoduje albo, 0albo 2, w sekwencji0,0,2,2,0,0,2,2,0,0,2,...
  4. ~-xjest równe (x-1), więc ~-(n&2)( ((n&2)-1)) powoduje sekwencję-1,-1,1,1,-1,-1,1,1,-1,-1,1,...
  5. Pomnożenie dwóch sekwencji ~n/2i ~-(n&2)daje prawidłową sekwencję zadaną w wyzwaniu:0,1,-1,-2,2,3,-3,-4,4,5,-5,...

Tabela przeglądowa:

n       ~n      ~n/2    n&2     ~-(n&2)     ~n/2*~-(n&2)
0       -1      0       0       -1          0
1       -2      -1      0       -1          1
2       -3      -1      2       1           -1
3       -4      -2      2       1           -2
4       -5      -2      0       -1          2
5       -6      -3      0       -1          3
6       -7      -3      2       1           -3
7       -8      -4      2       1           -4
8       -9      -4      0       -1          4
9       -10     -5      0       -1          5
10      -11     -5      2       1           -5

2

Brain-Flak , 86 74 72 70 bajtów

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

Wypróbuj online!

Wyjaśnienie

Ten kod składa się z dwóch części. Pierwsza część

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

robi saldo obliczeń. To określaceil(n/2) i czy negować wyjście.

Aby wyjaśnić, jak to działa, najpierw wyjaśnię, jak można to obliczyć ceil(n/2). Można to zrobić za pomocą następującego kodu

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

Odlicza się od n za każdym razem, gdy wykonuje not ( ([{}]())) na liczniku i dodaje licznik do wyniku. Ponieważ licznik wynosi zero, czas zwiększa się tylko co drugi bieg, zaczynając od pierwszego.

Teraz chcę również obliczyć znak naszych wyników. Aby to zrobić, uruchamiamy kolejny licznik. Ten licznik zmienia stan tylko wtedy, gdy pierwszy licznik jest wyłączony. W ten sposób otrzymujemy pożądany wzór. Kładziemy te dwa żetony na stosie, aby ułatwić ich przenoszenie, gdy nadejdzie czas.

Teraz, kiedy zakończymy obliczenia, nasz stos będzie wyglądał następująco

          parity(n)
ceil(n/2) sign

Musimy więc popracować, aby uzyskać zamierzony efekt w drugiej części.

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



1

QBIC , 27 26 bajtów

g=(:+1)'\2`~(a-g)%2|?-g\?g

Wyjaśnienie

g=          set worker var 'g' to
(:+1)           our index (plus one for the ceil() bit)
'\2`            integer divided by 2 (the int div needs a code literal: '..`
~(a-g)%2    IF index - temp result is odd (index 2 minus result 1 = 1)
|?-g        THEN PRINT g negated
\?g         ELSE PRINT g

1

Clojure 122 bajty

Pełen werwy, nawet podczas gry w golfa. Idę na głosowanie na współczucie tutaj ... :-)

Gra w golfa:

(defn d[n](let[x(int(Math/ceil(/ n 2)))y(cond(or(and(even? n)(even? x))(and(odd? n)(odd? x)))(Math/abs x):else(- 0 x))]y))

Nie golfowany:

(defn dizzy-integer [n]
  (let [x   (int (Math/ceil (/ n 2)))
        y   (cond
                (or (and (even? n) (even? x))
                    (and (odd? n)  (odd? x))) (Math/abs x)
                :else (- 0 x)) ]
    y))

1

Excel VBA 32-bit, 39 37 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z komórki A1i dane wyjściowe do bezpośredniego okna VBE

?[Sign((-1)^Int(A1/2))*Int((A1+1)/2)]

Ograniczony do wersji 32-bitowej, ponieważ A^Bnie jest prawidłowy w wersji 64-bitowej ( A ^Bjest tak blisko, jak to możliwe)


Czy przestrzeń między (-1)i ^[Intpotrzebne?
Pavel

@Pavel przynajmniej dla 64-bitowej wersji Excel VBA, tak; Ale to powiedziawszy, przysięgam, że nie dotyczy wersji 32-bitowej, ale niestety nie mogę przetestować tego na żadnym sprzęcie, który mam pod ręką
Taylor Scott

@Pavel - obejrzałem go w systemie 32-bitowym (domyślna specyfikacja instalacji) i pod tym systemem miejsce nie jest wymagane - ograniczyłem rozwiązanie do wersji 32-bitowej, aby z tego skorzystać
Taylor Scott

1
Fajne! Jednak zapomniałeś dodać poprawioną liczbę bajtów.
Pavel

Ups, dzięki @Pavel - Teraz naprawione
Taylor Scott

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.