Baş döndürücü tamsayı sayımı


25

Bugünkü zorluğunuz, tüm tamsayıları numaralandıran bir dizi terim üretmektir. Dizi aşağıdaki gibidir: Diziyi oluşturan 0 dizinli bir işleve sahipsek f(n)ve ceil(x)tavan işlevi ise f(0) = 0; abs(f(n)) = ceil(n/2); sign(f(n))ne zaman nve ceil(n/2)hatta her ikisi de garip olduğu zaman pozitifdir.

Bu diziyi anlamaya yardımcı olmak için ilk birkaç terim şöyledir: 0 1 -1 -2 2 3 -3 -4 4 5 -5 -6 6 7 -7...

Göreviniz bir tamsayı alan nve ndizinin üçüncü terimini çıkaran bir program yazmaktır . Giriş yalnızca 0 veya 1 indeksli olabilir.

Test durumları (0 indeksli):

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

Bu , en az bayt kazanıyor!



Bir tersini görünüyor Katlanabilir fonksiyonu
sergiol

Yanıtlar:


8

SOGL V0.12 , 8 6 bayt

I».»⌡±

Burada dene! ya da ilk çift sayılarını deneyin (biraz çalışması için değiştirildi)
.

Açıklama:

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

Veya daha basit:

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

3
BİR TEK DAKİKA ALMAYACAK!
NieDzejkob

6
Ben ».»telefonda duyuyorum I».»⌡±.
Jonathan Allan

@JonathanAllan Anlamadım ._.
Pavel



4

C, 25 bayt

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

Return değerini anahtar sözcük dönüşünü kullanmak yerine ilk parametreye atayarak 4 bayt kaydedebilirsiniz. f(n){n=~n/2*~-(n&2);}
cleblanc

5
@cleblanc C böyle işlemez.
orlp

2
gcc -O0çünkü x86-64 @ cleblanc'ın versiyonunu çarpma sonucunu bırakacak olan talimatlara göre derliyoreax ( godbolt.org/g/dztKPV ), fakat o zaman x86-64 gcc -O0C cevabı değil bir cevap olurdu . Ben optimizasyon etkin kırdı C cevaplar, özellikle geri dönüş değeri saçma olarak aptal son ifade değil oy vermiyorum. Gcc'nin başına gelse bile, C bu şekilde çalışmaz .
Peter Cordes

İşaretçi yap. Orijinal ve son değerler yığında değilse, optimizasyonlara ihtiyacınız yoktur.
mreff555 16:17

1
@ mreff555 Standart olmayan (kabul edilebilir olsa da) bir GÇ yöntemi olurdu ve daha kısa olamazdı.
orlp





3

Mathematica, 24 bayt

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

-14 bytes @Misha Lavrov


1
Tek sayıları 1'e ve hatta sayıları 0'a çevirme etkisinin kullanılması Booleve OddQetkisi vardır, ancak burada buna ihtiyacınız yoktur: -1'in güçleri zaten tüm tek sayılar için size doğru cevabı verir. Böylece bu adımı (-1)^Tr@{#,s}ya da sadece kesebilirsin (-1)^(#+s).
Misha Lavrov

3

Haskell , 25 43 42 bayt

((do a<-[0..];[[-a,a],[a,-a]]!!mod a 2)!!)

Çevrimiçi deneyin!1 endeksli.

Düzenle: Önceki sürümde işaretler yanlış sıralanmıştı, işaret için @ Potato44. 18 byte için düzeltildi ...

Düzenleme 2: -1 bayt için BMO'ya teşekkürler!


Do-notasyonu kullanarak 1 bayt tasarruf edebilirsiniz, çevrimiçi deneyin!
04'te

@BMO Teşekkürler! ...
Laikoni





2

Toplu iş, 29 bayt

@cmd/cset/a"%1/2^(%1<<30>>30)

2

JavaScript (ES6), 18 bayt

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 endeksli.



2

Kübik olarak , 23 bayt

(1 endeksli)

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

Çevrimiçi deneyin!

Cubically kod yazarken ana zorluk şunlardır:

  • Yalnızca 1 yazma özel değişkeni var ve
  • Sabit almak zor.

Yani, bu çözüm hesapla

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

burada /bölme tam sayı O anlamına gelir. Bu sadece 1 geçici değişkene ve 1 ve 2 sabitlerine ihtiyaç duyar.

Açıklama:

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 bayt

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

Gibi denilen tam bir program 5:prgmNAME.

TI-Basic, tokenize bir dildir , burada kullanılan tüm jetonlar remainder(, iki tanesi hariç, bir bayttır . tuşu ile yazılan regülatörü belirtir (-).

Örnekler:

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

Açıklama:

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

Y-var işlevi ile aynı formül:

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


2

Java 8, 15 bayt

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

EDIT: Java gerçekten golf oynamayan dillerden en kısa mı ?! o.o

Açıklama:

Burada dene.

Neler olduğunu referans olarak aşağıdaki tabloyu kullanacağım.

  1. ~neşittir -n-1.
  2. Java’da tamsayı bölme otomatik olarak pozitif tamsayılara ve negatif tamsayılara tavanlara dayandığından ~n/2, sekansla sonuçlanacaktır.0,-1,-1,-2,-2,-3,-3,-4,-4,-5,-5,...
  3. n&2sırayla ya 0da 2, ya sonuçlanacak0,0,2,2,0,0,2,2,0,0,2,...
  4. ~-xeşittir (x-1), yani ~-(n&2)( ((n&2)-1)) diziyle sonuçlanır-1,-1,1,1,-1,-1,1,1,-1,-1,1,...
  5. İki dizinin ~n/2ve verinin çoğaltılması, ~-(n&2)zorlukta sorulan doğru dizilimdir:0,1,-1,-2,2,3,-3,-4,4,5,-5,...

Genel bakış tablosu:

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 bayt

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

Çevrimiçi deneyin!

açıklama

Bu kodun iki bölümü var. İlk bölüm

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

hesaplama Brawn yapar. ceil(n/2)Çıktıyı olumsuzlayıp olumsuzlaştırmayacağını belirler .

Nasıl çalıştığını açıklamak için önce nasıl hesaplanacağını açıklayacağım ceil(n/2). Bu, aşağıdaki kodla yapılabilir

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

Bu, her gerçekleştirdiğinde n'den geriye doğru sayar (([{}]()) , bir sayaçta ) ve sayacı bir sonuca ekler. Sayaç, zamanın yarısı sıfır olduğu için, ilk çalıştırmadan başlayarak diğer tüm koşuları artırıyoruz.

Şimdi sonuçlarımızın işaretini de hesaplamak istiyorum. Bunu yapmak için başka bir sayaç başlatırız. Bu sayaç yalnızca ilk sayaç kapalı olduğunda durumu değiştirir. Bu şekilde istenen modeli elde ederiz. Bu iki sayacı, zamanı geldiğinde hareket ettirmeyi kolaylaştırmak için kapalı yığına koyarız.

Şimdi bir kez bu hesaplamayı tamamladığımızda yığımız böyle gözüküyor

          parity(n)
ceil(n/2) sign

Bu nedenle, amaçlanan sonucu elde etmek için biraz çalışmamız gerekiyor, bu ikinci bölüm bunu yapıyor.

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



1

QBIC , 27 26 bayt

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

açıklama

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 bayt

Verbose, golf oynarken bile. Buradaki sempati oyu için gidiyorum ... :-)

golfed:

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

Ungolfed:

(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 Bayt

Hücreden girdi alan A1ve VBE acil durum penceresine çıkan anonim VBE acil pencere işlevi

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

A^B64-Bit'te geçerli olmadığı için 32-Bit ile sınırlıdır ( A ^Belde edilebilecek en yakın)


Arasındaki boşluktur (-1)ve ^[Intgerekli?
Pavel

@ Excel VBA'nın 64-Bit Sürümünde en azından Pavel, evet; Ancak, bunun 32-bit Sürüm için olmadığına yemin ettiğimi söyledi, ancak ne yazık ki elimde olan donanımların hiçbirinde bunu test edemiyorum
Taylor Scott

@Pavel - 32-Bit Sistem (varsayılan kurulum spec) altında baktım ve bu sistem altında alan gerekli değil - Bundan yararlanmak için çözümü 32-Bit ile sınırlandırdım
Taylor Scott

1
Güzel! Yine de düzeltilmiş bayt sayısını eklemeyi unuttun.
Pavel

Hata! Teşekkürler @Pavel - Şimdi düzeltildi
Taylor Scott

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.