Aritmetik Çevrim


13

Giriş:

Tam sayı nolduğu >=0ya da >=1( f(0)isteğe bağlı olarak)

Çıktı:

Aşağıdaki sıradaki n'sayı' VEYA n'numaraya kadar olan sayı' ya kadar .

Sıra:

(0),1,-1,-3,0,5,-1,-7,0,9,-1,-11,0,13,-1,-15,0,17,-1,-19,0,21,-1,-23,0,25,-1,-27,0,29,-1,-31,0,33,-1,-35,0,37,-1,-39,0,41,-1,-43,0,45,-1,-47,0,49,-1,-51,0,53,-1,-55,0,57,-1,-59,0,61,-1,-63,0,65,-1,-67,0,69,-1,-71,0,73,-1,-75,0,77,-1,-79,0,81,-1,-83,0,85,-1,-87,0,89,-1,-91,0,93,-1,-95,0,97,-1,-99

Bu dizi nasıl oluşturulur?

f(n=0) = 0(isteğe bağlı)
f(n=1) = f(0) + nveya f(n=1) = 1
f(n=2) = f(1) - n
f(n=3) = f(2) * n
f(n=4) = f(3) / n
f(n=5) = f(4) + n
vs.

Veya sözde kodda:

function f(integer n){
  Integer result = 0
  Integer i = 1
  Loop as long as i is smaller than or equal to n
  {
    if i modulo-4 is 1:
      result = result plus i
    if i modulo-4 is 2 instead:
      result = result minus i
    if i modulo-4 is 3 instead:
      result = result multiplied with i
    if i modulo-4 is 0 instead:
      result = result integer/floor-divided with i
    i = i plus 1
  }
  return result
}

Ancak belirtmiş olabileceğiniz gibi, dizide iki desen vardır:

0, ,-1,  ,0, ,-1,  ,0, ,-1,   ,0,  ,-1,   ,0,  ,-1,   ,...
 ,1,  ,-3, ,5,  ,-7, ,9,  ,-11, ,13,  ,-15, ,17,  ,-19,...

dolayısıyla aynı sekansla sonuçlanan diğer yaklaşımlar da elbette tamamen iyidir.

Zorluk kuralları:

  • 0 dizinli ve 1 dizinli girişler aynı sonuca neden olur (bu nedenle, f(0)eklemek istediğinizde 0 dizinli girişler için isteğe bağlıdır).
  • nBu sıranın 'nci sayısını çıkarmanıza izin verilir . Ya da dizinin tamamı yukarı ve n"numara" dahil . (Yani f(5)ya 5da ile sonuçlanabilir 0,1,-1,-3,0,5.)
    • nSekansı 'sayıya kadar ' dahil etmeyi seçerseniz , çıktı formatı esnektir. Liste / dizi, virgül / boşluk / yeni satırla ayrılmış dize olabilir veya STDOUT'a vb. Yazdırılabilir.
  • Divide ( /), 0'a yuvarlanan tamsayı / kat bölümüdür (bazı dillerde olduğu gibi negatif sonsuza doğru değil).

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, gerekirse bir açıklama ekleyin.

Yukarıdaki ek test örnekleri n=100:

Input     Output

1000      0
100000    0
123       -123
1234      -1
12345     12345
123456    0

1
Bunu oeis.org'da bulamadım, bu yüzden oraya göndermek isteyebilirsiniz. İlginç bir dizi, kimsenin kaydetmediğine şaşırdım.
boru

1
@pipe oldukça keyfi görünüyor
qwr

Yanıtlar:


20

JavaScript (ES6), 19 bayt

n=>[0,n,-1,-n][n&3]

Çevrimiçi deneyin!

Kanıt

Diyelim ki 4'ün n katları için aşağıdaki ilişkilere sahibiz . Bu ilişkiler, dizinin ilk terimleri için önemsiz bir şekilde doğrulanmıştır.

f(n)   = 0
f(n+1) = n+1
f(n+2) = -1
f(n+3) = -(n+3)

Ve N = n + 4 olsun . Sonra tanım gereği:

f(N)   = f(n+4) = f(n+3) // (n+4) = -(n+3) // (n+4) = 0
f(N+1) = f(n+5) = f(n+4) + (n+5)  = 0 + (n+5)       = N+1
f(N+2) = f(n+6) = f(n+5) - (n+6)  = (n+5) - (n+6)   = -1
f(N+3) = f(n+7) = f(n+6) * (n+7)  = -1 * (n+7)      = -(N+3)

Bu, matematiksel tümevarım ile ilişkilerin 4'ün N katları için geçerli olduğunu kanıtlar .


2
Cevapların çoğu bu çözümün bağlantı noktaları olduğundan, kanıtlanabilir olduğunu doğruladığımı eklemek istiyorum.
Erik the Outgolfer


Ah, fındık, çok benzer bir şey üzerinde çalışırken dikkatini dağıttı. +1
Shaggy

Meraktan, "n% 4" yerine "n & 3" ü tercih etmek için bir neden var mı?
IanF1

2
@ IanF1 Sanırım bu sadece düşük seviyeli bir programlama alışkanlığı (bitsel olarak hesaplamak VE montajda bir modulo hesaplamaktan daha kolay ve hızlı). Ama burada pek bir anlam ifade etmiyor ve aslında bunu daha n%4sonra değiştirmek için yarı heyecanlandım, böylece 32 bit'ten büyük sayılarla çalışır.
Arnauld

4

05AB1E , 8 bayt

nthSayıyı çıktılar

ÎD(®s)sè

Çevrimiçi deneyin!

05AB1E , 14 bayt

Sekanstaki desenleri kullanarak N'ye kadar bir sayı listesi çıkarır

ÅÉāÉ·<*āÉ<‚øí˜

Çevrimiçi deneyin!

açıklama

N = 7 kullanan örnek

ÅÉ               # List of odd numbers upto N
                 # STACK: [1,3,5,7]
  ā              # Enumerate 1-based
   É             # is odd?
                 # STACK: [1,3,5,7],[1,0,1,0]
    ·<           # double and decrement
                 # STACK: [1,3,5,7],[1,-1,1,-1]
      *          # multiply
                 # STACK: [1,-3,5,-7]
       āÉ<       # enumerate, isOdd, decrement
                 # STACK: [1,-3,5,-7],[0,-1,0,-1]
          ‚ø     # zip
                 # STACK: [[1, 0], [-3, -1], [5, 0], [-7, -1]]
            í    # reverse each
             ˜   # flatten
                 # RESULT: [0, 1, -1, -3, 0, 5, -1, -7]



3

TIS -n 2 1 , 123 bayt

İçin nth sayısını çıktılar 0 <= n <= 999. (Üst sınır dil sınırlamalarından kaynaklanmaktadır).

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
JRO -5
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY
HCF

Çevrimiçi deneyin!


TIS -n 2 1 , 124 bayt

İçin nth sayısını çıktılar 0 <= n <= 999. (Üst sınır dil sınırlamalarından kaynaklanmaktadır). nBoşluk ile ayrılmış olarak birden fazla bilgi sağlanabilir.

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
MOV ACC ANY
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

Çevrimiçi deneyin!


TIS -n 3 1 , 192 bayt

Değerleri Çıkışlar 0..niçin 0 <= n <= 999. (Üst sınır dil sınırlamalarından kaynaklanmaktadır).

@0
MOV UP ACC
ADD 1
MOV ACC ANY
JRO -1
@1
SUB UP
JLZ C
HCF
C:ADD UP
MOV ACC ANY
ADD 1
SWP
ADD 1
MOV ACC ANY
SUB 4
JEZ W
ADD 4
W:SWP
@2
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

Çevrimiçi deneyin!


Tümü sayısal G / Ç ( -nbayrak) kullanır. İlk iki çözüm, biri diğerinin üzerinde bulunan iki hesaplama düğümü kullanır. Üçüncüsünde üç düğümlü bir yığın vardır.

İlk iki çözüm için, üst düğüm girişi okur, orijinal numarayı gönderir, sonra negatif olana kadar tekrar tekrar 4 çıkarır, sonra atlama tablonuzun dizinine 5 ekler. Bu eşdeğerdir (n % 4) + 1.

Üçüncü çözüm bu görevi iki düğüme böldü; üstteki zaman sınırına kadar sınırı tekrarlar ve orta düğüm indekse (bu sınıra kıyasla) ve yukarıdaki gibi modülo paralel olarak sayar.

Her üç çözümün alt düğümü aynıdır; bir atlama masası var ve sihir burada gerçekleşiyor. Orijinal numarayı ACC, daha sonra JRO(muhtemelen J ump R selektif O ffset) 1, yukarıdaki düğümün söylediklerine bağlı olarak 2, `` 3veya 4'' olarak ilerletiriz .

Geri çalışma:

  • 4olacak bir ) NEGyedi ACCve B hareket) ACCçıkış için aşağı.
  • 3koyacağız 1içine ACC, daha sonra adımları 4bir ve 4b .
  • 2doğrudan 4b adımına atlayacaktır .
  • 1olacak SUBgastrointestinal sistem ACC(etkili sıfırlama kendi kapalı ACC), daha sonra adım yapmak 2atlar, 4b .

2

C (gcc) , 62 bayt

f(n,k){k=~-n;n=n?n%4?k%4?n-2&3?f(k)*n:f(k)-n:f(k)+n:f(k)/n:0;}

Çevrimiçi deneyin!


OlivierGrégoire'in Java cevabının bir portunu oluşturarak bayt sayınızı (31 bayt) tam olarak yarıya indirebilirsiniz : f(n){n=n%2>0?n*(2-n%4):n%4/-2;}Yine de ikinci bir cevap olarak ekleyeceğim, çünkü özyinelemeli yaklaşımınızı da seviyorum. :)
Kevin Cruijssen

@KevinCruijssen İki dilin aritmetik sözdizimleri çok benzer olduğu için Java 10 çözümlerini gördüm ve kısalığını fark ettim, ancak çözümlerini kopyalamak istemedim.
Jonathan Frech



1

Retina , 46 bayt

.+
*
r`(____)*$
_$.=
____
-
___.*
-1
__

_.*
0

Çevrimiçi deneyin! Açıklama:

.+
*

Tekli'ye dönüştür.

r`(____)*$
_$.=

Ondalık biçime geri dön, ancak n%4+1alt çizgi bırak .

____
-

4 olması durumunda, sonuç şudur -n.

___.*
-1

Durum 3: -1

__

Durum 2: n

_.*
0

Dava 1: 0



1

APL (Dyalog Klasik) , 22 12 bayt

Outgolfer Erik'in sözleri nedeniyle büyük 10 bayt kurtardı. Teşekkür ederim!

4∘|⊃0,⊢,¯1,-

Çevrimiçi deneyin!

N'inci sayıyı çıkarır

APL'yi bilmiyorum, sadece Arnauld'un J portumu Dyalog APL'deki çözümünü yapmaya çalıştım.


2
İyi girişim! Birkaç açıklama: 1) (0,⍵,¯1,-⍵)ile değiştirebilirsiniz (0⍵¯1,-⍵). 2) Sistem değişkeninin atandığını 1+varsayarak (evet, buna izin verilir) öğesini kaldırabilirsiniz . 3) İşlevleri gönderirken genellikle parçayı saymayız. 4) İndeksleme yerine fonksiyonu kullanabilirsiniz . Hepsi birlikte bunu oluşturur: ( ⎕IO0f←[]⎕IO←0{(4|⍵)⊃0⍵¯1,-⍵}
saymayın

@ Outgolfer'a teşekkürler Teşekkürler!
Galen Ivanov

2
Daha gelişmiş golf Bu yaklaşıma dayanmaktadır: 4∘|⊃0,⊢,¯1,-.
Outgolfer Erik

1
@ Outgolfer'ı öldür - Evet, gerçekten! Sanırım 4∘|⊃0,⊢,¯1,- J çözümüm 4&|{0,],_1,-APL'de tam olarak böyle görünüyor. Tekrar teşekkürler!
Galen Ivanov

1
Aslında, J bir APL varyantıdır, ancak Dyalog ve NARS2000 gibi diğer APL benzeri olanlardan daha uzaktır.
Outgolfer Erik

1

Cubix , 20 19 bayt

Iun:^>s1ns:u@Ota3s0

Çevrimiçi deneyin!

Aynı yaklaşım cubix için de geçerlidir.

Bir küp üzerinde:

    I u
    n :
^ > s 1 n s : u
@ O t a 3 s 0 .
    . .
    . .

İlk bit ^Iu:n>s1ns:u0syığını oluşturur ve daha sonra 3atuygun öğeyi TOS'a kopyalar, sonra Oçıktıyı verir ve @programı sonlandırır.


0

Boşluk, 84 83 bayt

[S S S N
_Push_0][S N
S _Duplicate_0][T   T   S _Store][S S S T   S N
_Push_2][S S T  T   N
_Push_-1][T T   S _Store][S S S T   N
_Push_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][S S S T T   N
_Push_3][S S S T    N
_Push_1][T  T   T   ][S S T T   N
_Push_-1][T S S N
_Multiply][T    T   S _Store][T T   T   _Retrieve_input][S S S T    S S N
_Push_4][T  S T T   _Modulo][T  T   T   _Retrieve_result][T N
S T _Print_as_integer]

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklendi.
[..._some_action]yalnızca açıklama olarak eklendi.

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Port of @Arnauld'un JavaScript yanıtı .

Açıklama (örnek giriş n=7):

Command   Explanation         Stack        Heap                  STDIN   STDOUT   STDERR

SSSN      Push 0              [0]
SNS       Duplicate top (0)   [0,0]
TTS       Store               []           {0:0}
SSSTSN    Push 2              [2]          {0:0}
SSTTN     Push -1             [2,-1]       {0:0}
TTS       Store               []           {0:0,2:-1}
SSSTN     Push 1              [1]          {0:0,2:-1}
SNS       Duplicate top (1)   [1,1]        {0:0,2:-1}
TNTT      Read STDIN as nr    [1]          {0:0,1:7,2:-1}        7
SSSTTN    Push 3              [1,3]        {0:0,1:7,2:-1}
SSSTN     Push 1              [1,3,1]      {0:0,1:7,2:-1}
TTT       Retrieve input      [1,3,7]      {0:0,1:7,2:-1}
SSTTN     Push -1             [1,3,7,-1]   {0:0,1:7,2:-1}
TSSN      Multiply (-1*7)     [1,3,-7]     {0:0,1:7,2:-1}
TTS       Store               [1]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve input      [7]          {0:0,1:7,2:-1,3:-7}
SSSTSSN   Push 4              [7,4]        {0:0,1:7,2:-1,3:-7}
TSST      Modulo (7%4)        [3]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve            [-7]         {0:0,1:7,2:-1,3:-7}
TNST      Print as integer    []           {0:0,1:7,2:-1,3:-7}           -7
                                                                                  error

Hatalı durur: Çıkış tanımlı değil.

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.