ค้นหาฟังก์ชั่นที่มีครบทุกความยาว


11

ฟังก์ชั่นถูกกล่าวว่ามีวัฏจักรของความยาว nหากมีxในโดเมนของมันเช่นนั้นf n (x) = xและf m (x) ≠ xสำหรับ0 <m <n , ที่nตัวยกnหมายถึงn - พับประยุกต์ใช้ฉ โปรดทราบว่าวงจรของความยาว1เป็นจุดคงที่f (x) = x

งานของคุณคือการดำเนินการbijectiveฟังก์ชั่นจากจำนวนเต็มกับตัวเองซึ่งมีตรงหนึ่งรอบของทุกความยาวบวกn ฟังก์ชั่น bijective คือการติดต่อแบบตัวต่อตัวเช่นจำนวนเต็มทุกค่าที่แมปกับครั้งเดียว มีอีกหนึ่งวงจรของความยาวnหมายถึงว่ามีตรงnตัวเลขที่แตกต่างกันxที่n (x) = xและเมตร (x) ≠ xสำหรับ0 <ม <n

นี่คือตัวอย่างของสิ่งที่ฟังก์ชั่นดังกล่าวอาจมีลักษณะรอบx = 0 :

x     ... -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7 ...
f(x)  ...  2  4  6 -3 -1  1 -4  0 -2  5  7 -7 -6  3 -5 ...

ข้อความที่ตัดตอนมานี้ประกอบด้วยวัฏจักรของความยาว1ถึง5 :

n   cycle
1    0
2   -2  1
3   -4 -3 -1
4   -5  6  3  7
5   -7  2  5 -6  4
...

โปรดทราบว่าข้างต้นฉันใช้ "ฟังก์ชั่น" เฉพาะในเชิงคณิตศาสตร์ คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบในภาษาที่คุณเลือกตราบใดที่ใช้จำนวนเต็ม (เซ็นชื่อ) เดียวเป็นอินพุตและส่งกลับจำนวนเต็มเดียว (เซ็นชื่อ) ตามปกติคุณสามารถรับอินพุตผ่าน STDIN อาร์กิวเมนต์บรรทัดคำสั่งอาร์กิวเมนต์ฟังก์ชัน ฯลฯ และเอาต์พุตผ่าน STDOUT ค่าส่งคืนฟังก์ชันหรืออาร์กิวเมนต์ฟังก์ชัน (ออก) เป็นต้น

แน่นอนว่าหลายภาษาไม่รองรับการใช้จำนวนเต็มอย่างแม่นยำ ไม่เป็นไรถ้าการใช้งานของคุณใช้ได้เฉพาะกับประเภทจำนวนเต็มในภาษาของคุณตราบใดที่ครอบคลุมช่วงอย่างน้อย[-127, 127]และมันจะใช้ได้กับจำนวนเต็มตามอำเภอใจหากประเภทจำนวนเต็มของภาษานั้นถูกแทนที่ด้วยกฎเกณฑ์ - จำนวนเต็มความแม่นยำ

ใช้กฎมาตรฐานของ


2
ที่เกี่ยวข้องอย่างใกล้ชิด. ในขณะที่ความแตกต่างดูเล็กน้อยพวกเขาบอกเป็นนัยว่าไม่มีวิธีเก่า ๆ ที่ทำงานโดยไม่มีการดัดแปลงที่สำคัญและโดยเฉพาะอย่างยิ่งฉันไม่คิดว่าวิธีการชนะจากการท้าทายนั้นสามารถปรับเปลี่ยนได้เลย
Martin Ender

"มีหนึ่งรอบของทุกความยาว", "มีหลายรอบของความยาว evry": นี่เป็นความแตกต่างเพียงอย่างเดียวที่ทำให้พวกเขาแตกต่างจากคนอื่น ๆ หรือไม่?
Abr001am

@ Agawa001 นั่นคือความแตกต่างอีกอย่างหนึ่งคือความท้าทายอีกอย่างคือเกี่ยวกับฟังก์ชั่นของจำนวนเต็มบวกในขณะที่ความท้าทายนี้จะขอฟังก์ชั่นสำหรับจำนวนเต็มทั้งหมด
Martin Ender

1
ฉันคิดว่านิยามของวัฏจักรของคุณจำเป็นต้องรวม n นั้นน้อยที่สุด มิฉะนั้นรอบความยาว 2 ของคุณจะนับเป็นวัฏจักรของความยาว 4 และ 6 เป็นต้น
xnor

@ xnor อ๊ะจุดดี
Martin Ender

คำตอบ:


2

Pyth, 27 18 ไบต์

_h?gQ0^2Q*.5@,Q-xh

คำอธิบาย (Pyth เริ่มต้นQเป็นจำนวนเต็มอินพุต):

_                       negative of (
                          (
  ?gQ0                      if Q >= 0:
      ^2Q                     2**Q
                            else:
         *.5                  half of
            @        Q          element Q (modulo list length) in
             ,                    the two element list [
              Q                     Q,
                 hQ                 ((Q plus 1)
                x  Q                 XOR Q)
               -    Q               minus Q
                                  ]
 h                        ) plus 1
                        )

นี่คือรอบ

(−1)
(0, −2)
(1, −3, −4)
(2, −5, −7, −6)
(3, −9, −13, −11, −8)
(4, - 17, −25, −21, −15, −10)
(5, −33, −49, −41, −29, −19, −12)
(6, −65, −97, −81, −57, −37, −23, −14)
(7, −129, −193, −161, −113, −73, −45, −45, −27, −16)
(8, −257, −385, −225 , −145, −89, −53, −31, −18)
(9, −513, −769, −641, −449, −289, −177, −105, −35, −35, −20)

วัฏจักรของความยาวnถูกกำหนดโดย

( n - 2,
−2 ^ ( n - 2) ⋅1 - 1,
−2 ^ ( n - 3) ⋅3 - 1,
−2 ^ ( n - 4) ⋅5 - 1,
…,
−2 ^ 2 ⋅ (2 · n - 7) - 1,
−2 ^ 1⋅ (2 · n - 5) - 1,
−2 ^ 0⋅ (2 · n - 3) - 1)

แต่ละจำนวนเต็มk ≥ −1 ปรากฏเป็นองค์ประกอบแรกของ ( k + 2) - รอบ สำหรับแต่ละจำนวนเต็มk <−1 เราสามารถเขียน 1 - k = 2 ^ i ⋅ (2⋅ j + 1) สำหรับi , j ≥ 0; จากนั้นkจะปรากฏเป็นองค์ประกอบ ( j + 2) th ของ ( i + j + 2) − รอบ


5

MATL , 47 ไบต์

E|G0<-QXJ:tQ*2/0hStJ<f0))Q2MQ)&:J6M-)2/ttk>Eq*k

ลองออนไลน์!

คำอธิบายทั่วไป

ฟังก์ชั่น 2 ด้านล่างเหมือนกับที่ใช้ในคำตอบของ @ Sp3000สำหรับความท้าทายที่เกี่ยวข้อง ขอบคุณ @ Agawa001 สำหรับการสังเกต

ฟังก์ชั่นเป็นองค์ประกอบของสาม:

  1. Bijection จากZ (จำนวนเต็ม) ถึงN (the naturals)
  2. Biject จากNถึงN ที่มีคุณสมบัติที่ต้องการ (หนึ่งรอบของความยาวแต่ละ)
  3. ส่วนกลับของฟังก์ชัน 1

ฟังก์ชั่น 1 และ 3 จะถูกนำมาใช้เพราะมันง่าย (ผมคิดว่า) เพื่อให้เกิดพฤติกรรมที่ต้องการในNกว่าในZ

ฟังก์ชั่น 2 มีดังนี้: บรรทัดบนคือโดเมนบรรทัดล่างคือโคโดเมน เครื่องหมายจุลภาคถูกใช้เพื่อความชัดเจน:

1,  2  3,  4  5  6,  7  8  9  10  ...
1,  3  2,  6  4  5, 10  7  8   9  ...

บล็อกแรก (จากบน1ลงล่าง1) คือวัฏจักรของความยาว 1 วินาที (จาก2 3ถึง3 2) เป็นวัฏจักรของความยาว 2 และอื่น ๆ ในแต่ละบล็อกส่วนล่าง (รูปภาพของฟังก์ชัน) คือส่วนบนที่เปลี่ยนเป็นวงกลม ขั้นตอนเดียวไปทางขวา

ฟังก์ชั่น 1 มีดังนี้:

 -5  -4  -3  -2  -1   0  +1  +2  +3  +4  ...
+10  +8  +6  +4  +2  +1  +3  +5  +7  +9  ...

ฟังก์ชั่น 3 เหมือนกับ 1 โดยมีการสลับสองบรรทัด

ตัวอย่าง

ภาพของมี3 -5อันดับแรก3ถูกแม็พกับ7ฟังก์ชัน 1; จากนั้น7ถูกแม็พกับ10ฟังก์ชัน 2; จากนั้น10ถูกจับคู่กับ -5` โดยฟังก์ชั่น 3

ความยาว-1 0รอบคือ ความยาว-2 -1 1รอบคือ วงจรความยาว -3 คือ-3 2 -2เป็นต้น

รหัสอธิบาย

ฟังก์ชันที่ 1 และ 3 ตรงไปตรงมา

ฟังก์ชัน 2 ทำงานโดยค้นหาจุดสิ้นสุดที่ต่ำกว่าของบล็อกอินพุตที่สอดคล้องกัน ตัวอย่างเช่นถ้าใส่ฟังก์ชั่นนี้จะ9พบ7(ดูบล็อกด้านบน) จากนั้นจะเลือกจุดปลายด้านบนซึ่งอยู่10ในตัวอย่าง การเปลี่ยนแบบวงกลมของบล็อกนั้นทำได้ด้วยการทำดัชนีแบบโมดูลาร์ 1 ของ MATL

         % FUNCTION 1
         % Implicit input
E|       % Multiply by two. Absolute value
G0<      % 1 if input is negative, 0 otherwise
-        % Subtract
Q        % Add 1
XJ       % Copy to clipboard J. Used as input to the next function

         % FUNCTION 2
:        % Range [1 2 ... J], where J denotes the input to this function
tQ*      % Duplicate, increment by 1, multiply
2/       % Divide by 2
0hS      % Prepend a 0. This is needed in case J is 0
tJ<f     % Duplicate. Find indices that are less than the input J
0)       % Pick the last index.
)        % Apply as index to obtain input value that ends previous block
Q        % Add 1: start of current block
2M       % Push the two arguments to second-to-last function call
Q)       % Add 1 and use as index: end of current block
&:       % Inclusive binary range: generate input block 
J        % Push J (input to function 2)
6M-      % Subtract start of block
)        % Apply as index (1-based, modular). This realizes the shifting

         % FUNCTION 3
2/       % Divide by 2
ttk>     % Duplicate. 1 if decimal part is not 0; 0 otherwise
Eq       % Multiply by 2, add 1
*        % Multiply
k        % Round down
         % Implicit display

นี่คือฟังก์ชั่นการบิดของ sp3000 ใช่มั้ย
Abr001am

@ Agawa001 โอ้ใช่มั้ย ฉันไม่เห็นความท้าทายอื่น ฉันจะดู
Luis Mendo

โอ้ มันเป็นอย่างแน่นอน อย่างน้อยก็อธิบายได้ว่าเหตุผลของฉันถ้าไม่ใช่ต้นฉบับถูกต้อง :-)
Luis Mendo

มันน่าแปลกใจที่จิตใจมากกว่าหนึ่งคนล้อมกรอบอย่างใกล้ชิดเพื่อคายความคิดที่ใกล้ชิด
Abr001am

4

Python 2, 55 ไบต์

g=lambda n,k=1:n/k and~g(~n+k*(n>0),k+1)+k*(n>0)or-~n%k

59 ไบต์:

g=lambda n,k=1:n<0and~g(~n,2)or n/k and k+g(n-k,k+2)or-~n%k

สร้างวงจร

[0]
[-1, -2]
[1, 2, 3]
[-3, -4, -5, -6]
[4, 5, 6, 7, 8]
...

ดัดแปลงมาจากวิธีการแก้ปัญหาของฉันเกี่ยวกับความท้าทายที่ก่อนหน้านี้ซึ่งมีการปรับเปลี่ยนจากการก่อสร้างของ SP3000

ฟังก์ชั่น

g=lambda n,k=1:n/k and k+g(n-k,k+2)or-~n%k

ทำให้รอบขนาดคี่ของจำนวนที่ไม่เป็นลบ

[0]
[1, 2, 3]
[4, 5, 6, 7, 8]
...

เพื่อหาขนาดที่ถูกต้องรอบkกะการป้อนข้อมูลnลงจนกว่าผลที่ได้คือในช่วงเวลาk=1,3,5,7,... [0,k)วนรอบช่วงเวลานี้ด้วยการดำเนินการn->(n+1)%kจากนั้นยกเลิกการลบทั้งหมดที่ทำในอินพุต k+g(n-k,k+2)นี้จะดำเนินการซ้ำโดย

ตอนนี้เราต้องการค่าลบเพื่อสร้างวัฏจักรเท่ากัน โปรดทราบว่าถ้าเราปรับเปลี่ยนgจะเริ่มต้นด้วยk=2ในgเราจะได้รับรอบแม้ขนาด

[0, 1]
[2, 3, 4, 5]
[6, 7, 8, 9, 10, 11]
...

biject ~เชิงลบเหล่านี้เพื่อผ่านบิตสมบูรณ์ ดังนั้นเมื่อnเป็นลบเราก็ประเมินเป็นg(n)~g(~n,2)


ผมไม่ทราบว่ามันจะช่วยให้ แต่วิธีการคำนวณอีกน่าจะเป็นk Math.floor(Math.sqrt(n))*2+1
Neil

@ Neil ฉันมองไปที่การกำหนดขอบเขตและขนาดของวงจรเลขคณิตและแม้แต่ทำการคำนวณทั้งหมดด้วยวิธีนั้น แต่การแสดงออกเหล่านี้มีความยาวใน Python และฉันพบว่าการเรียกซ้ำจะสั้นกว่า
xnor

3

Python 3, 110 ไบต์

ฉันยังไม่ทราบวิธีการรับแลมบ์ดาในนั้น

ถ้า n คือหมายเลขสามเหลี่ยม [1,3,6,10,15,21,28 ฯลฯ ... ]] ดังนั้น f (n) คือลำดับในรายการคูณด้วยจำนวนลบ ถ้าจำนวนเป็นลบให้ 1 + หมายเลขสามเหลี่ยมที่เล็กที่สุดถัดไป อื่นเพิ่มขึ้น

ตัวอย่าง: 5 ไม่ใช่หมายเลขสามเหลี่ยมดังนั้นเพิ่ม 1

การทำซ้ำครั้งต่อไปเรามี 6. 6 เป็นเลขสามเหลี่ยมและมันเป็นอันดับ 3 ในรายการดังนั้นออกมา -3

โปรแกรมให้รายชื่อเหล่านี้

ความยาว 1: [0]

ความยาว 2: [1, -1]

ความยาว 3: [2,3, -2]

ความยาว 4: [4,5,6, -3]

ความยาว 5: [7,8,9,10, -4]

x=int(input())
if x<0:print((x**2+x)/2+1)
else:
 a=((8*x+1)**.5-1)/2
 if a%1:print(x+1)
 else:print(-a)

แก้ไข: ขอขอบคุณอีกครั้งที่ @TuukkaX สำหรับการลบตัวอักษรส่วนเกินออก


1
คุณอาจจะเปลี่ยน0.5ไป.5และจะinput('') input()
Yytsi

2

Python 3, 146 ไบต์

สำหรับทุกหมายเลขที่มากกว่า 0 จะมีการวนซ้ำ (len 2,4,6,8 ... ) และน้อยกว่า 0, ลูปคี่ (1,3,5,7) 0 แผนที่เป็น 0

(-3, -2, -1), (0), (1,2), (3,4,5,6)

แผนที่ไปยัง

(-2, -1, -3), (0), (2,1), (6,3,4,5)

f=lambda x:1+2*int(abs(x)**.5)if x<1 else 2*int(x**.5+.5)
x=int(input());n=f(x)
if x>0:b=n*(n-2)/4
else:b=-((n+1)/2)**2
print(b+1+(x-b-2)%n)

แก้ไข: @TuukkaX ถอด 8 ไบต์จากโซลูชันก่อนหน้า และอีก 3


1
ฉันคิดว่าคุณสามารถลบช่องว่างก่อนคำสั่ง if ที่บรรทัดแรก และอาจมีการเปลี่ยนแปลงบางสิ่งบางอย่างที่มีขนาดเล็กเช่นmi b
Yytsi

นี่คือรายการเดียวกันที่เล่นลง:f=lambda x:1+2*int(abs(x)**0.5)if x<1 else 2*int(x**0.5+0.5) x=int(input()) n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
Yytsi

1
ขอบคุณ @TuukkaX ฉันลืมเกี่ยวกับตัวแปร 2 ตัวอักษร 'mi'
Magenta

1
ฉันยังมีการเปลี่ยนแปลงไปinput('') input()คำพูดไม่มีประโยชน์เนื่องจากเราไม่ต้องพิมพ์อะไรไปยังคอนโซลเมื่อเราต้องการรับอินพุต
Yytsi

1
ยิ่งสั้น ลบศูนย์ก่อนหน้าจุด f=lambda x:1+2*int(abs(x)**.5)if x<1 else 2*int(x**.5+.5) x=int(input());n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
Yytsi

2

Matlab (423)

function u=f(n),if(~n)u=n;else,x=abs(n);y=factor(x);for o=1:nnz(y),e=prod(nchoosek(y,o)',1);a=log(x)./log(e);b=find(a-fix(a)<exp(-9),1);if ~isempty(b),k=e(b);l=fix(a(b));break;end;end,if(abs(n)==1)k=2;l=0;end,if(k==2)l=l+1;x=x*2;end,e=dec2base(l,k)-48;o=xor(e,circshift(e,[0 1]));g=~o(end);if(~o|nnz(o==1)~=numel(e)-g),u=n*k;else,if((-1)^g==sign(n)),u=sign(n)*k^(base2dec([e(2:end-1) 1]+48,k)-(k==2));else,u=n*k;end,end,end
  • ไม่ใช่การแข่งขันเพราะมันทำลายสถิติที่ดีของการถูกกลั่นแกล้งสำหรับการจัดอันดับครั้งล่าสุดในขณะที่ฉันพยายามที่จะย่อให้สั้นที่สุดเท่าที่จะทำได้

  • ข้อผิดพลาดบางประการเกี่ยวกับความถูกต้องใน MATLAB ที่ฉันหาทางไม่ได้ยกเว้นการทำรหัสของฉันให้ใหญ่มากในทางกลับกันการแมปที่ฉันเลือกนั้นอยู่ในรูปแบบของ facors ที่สำคัญและ n-ary logarithm

การกระทำ

 f(2)

 1

 f(1)

 2

 f(-2)

 -4

 f(-4)

 -8

 f(-8)

 -1

 f(0)

 0



 ----------------------------

คำอธิบาย

  • Knonwing เป็นคนแรกที่ตัวเลขใด ๆ สามารถเขียนเป็นผลคูณของเลขชี้กำลังN=e1^x1*e2^x2...จากฐานนี้ฉันเลือกที่จะแมปภาพของรอบCที่ดึงมาจากเลขชี้กำลังที่ใหญ่ที่สุดของปัจจัยที่เล็กที่สุด (ไม่จำเป็นต้องเฉพาะเจาะจง) ว่า N เป็นพลังที่สมบูรณ์แบบของ .

  • ในคำง่ายให้N=P^xP คือรากที่สมบูรณ์แบบที่เล็กที่สุดxหมายถึงการได้อย่างแม่นยำคำสองคำที่จำเป็นสำหรับวงจร: x=Ʃ(r*P^i)คำที่Pเป็นฐานของวงจรเช่นเดียวกับรากที่สมบูรณ์แบบสำหรับหมายเลขหลัก N และkเป็นระดับของวงจรC=p^kที่iแตกต่างกันระหว่าง 1 และ k ค่าสัมประสิทธิ์rจะเพิ่มขึ้น 1 และถูกล้อมรอบด้วย P-1 สำหรับการพรี - อิมเมจใด ๆ ต่อไปนี้จนกว่า coeffecients ทั้งหมดจะถูกตั้งค่าเป็น r = 1 ดังนั้นเราจึงย้ายไปที่จุดเริ่มต้นของรอบนั้น

  • เพื่อหลีกเลี่ยงการชนกันระหว่างวัฏจักรการเลือกการยกกำลังของจำนวนเฉพาะแทนที่จะเป็นผลิตภัณฑ์นั้นถูกต้องเพราะเป็นตัวอย่างของสองรอบของฐาน3และ2จุดรวมระหว่างทั้งสองได้3*2ดังนั้นจึงหลีกเลี่ยงเนื่องจากวงจรถูกกำหนดโดยระดับของมันมากกว่า ฐานและสำหรับจุดนัดพบจะมีอีกรอบของฐาน6และระดับ 1

  • ตัวเลขติดลบทำให้เกิดข้อยกเว้นสำหรับฉันฉันสงวนองศาคี่สำหรับจำนวนลบและแม้แต่องศาที่เหลือ งั้นเหรอ

    สำหรับหมายเลขใด ๆ ที่ N ฝังอยู่ภายในวัฏจักรP^kถูกเขียนเป็นP^(a0*P^i0+a1*P^i1+...)จำนวนเงิน(a0*P^i0+a1*P^i1+...)จะถูกแปลงในฐาน P-ary เป็นa0,a1,....เพื่อชี้แจงจุดนี้หาก (p = 2) ลำดับจะต้องอยู่ในฐานฐาน ดังที่ทราบกันดีว่าไม่มีการตั้งค่าเงื่อนไขขององศาบวก / ลบและ (+/- 1) ข้อยกเว้นหมายเลข N อยู่บนขอบของวงจรขององศาkถ้าหากAมีการเขียนลำดับเป็น1111..{k+1}..10หรือ111..{k}..1สำหรับฐานทั้งหมดมิฉะนั้น ไม่จำเป็นต้องมีการหมุนดังนั้นการกำหนดเงื่อนไขเชิงลบ / บวกสำหรับองศาคี่ / คู่ที่เกี่ยวข้องk/k'สำหรับทั้งคู่ทำให้ลำดับคี่ที่เขียนในรูปแบบ101..{k}..100ลำดับคู่ถูกเขียนในรูปแบบ101..{k'}..10สำหรับขอบเริ่มต้นของวงจรลบ / บวกจำนวนตามลำดับ .

    ตัวอย่าง:

    การหาตัวเลขN=2^10, x=10=2^1+2^3ลำดับ A ถูกเขียนA=1010, ลำดับของประเภทนี้มีอาการ จำกัด ขอบของจำนวนรอบที่เป็นบวก, ซึ่งก็คือC=2^3, ดังนั้นภาพต่อไปคือภาพที่ขอบเริ่มต้นA=011ซึ่ง8, แต่ , โดยการแสดงผลลัพธ์นี้ให้เป็น (+ / -) 1 ข้อยกเว้น2^10/2แมปไปยัง8/2และภาพก่อนหน้าจะต้องไม่หมุน

    การหาตัวเลขN=-3^9, x=9=3^2ลำดับ A ถูกเขียนA=100, ลำดับของประเภทนี้มีอาการ จำกัด ขอบของจำนวนลบรอบ, ซึ่งก็คือC=3^1, ดังนั้นภาพถัดไปก็คือขอบเริ่มต้นA=01ซึ่ง3, แต่, โดยการปรับผลลัพธ์นี้เป็นลบ / บวก สภาพแมปไป-3^9-3

  • สำหรับทั้งคู่(-/+)1ฉันจินตนาการว่าจะก้าวก่ายมันภายในจำนวนรอบฐาน2ในการคิดว่ากลุ่มวงจรวนรอบสามัญ{2,4}{8,16,32,64}..ถูกสร้างขึ้นในรูปแบบอื่น{1,2}{4,8,16,32}..ซึ่งจะช่วยป้องกันการสูญเสียองค์ประกอบก่อนหน้านี้ องค์ประกอบใหม่ใน


ผล:

เรียกใช้โค้ดชีตเล็ก ๆ นี้เพื่อตรวจสอบช่วงที่เหมาะสมของตัวเลขแบบวนรอบ:

for (i=1:6) 
index=1;if(max(factor(i))>=5) index=0;end
for ind=0:index
j=f(((-1)^ind)*i); while(((-1)^ind)*i~=j)fprintf('%d ',j);j=f(j);end,fprintf('%d \n',(-1)^ind*i),pause,end,
end

สิ่งนี้นำไปสู่ผลลัพธ์นี้

 2 1 
 -2 -4 -8 -1 
 1 2 
 -4 -8 -1 -2 
 9 27 3 
 -9 -27 -81 -243 -729 -2187 -6561 -19683 -3 
 8 16 32 64 128 256 512 4 
 -8 -1 -2 -4 
 25 125 625 3125 5 
 36 216 1296 7776 46656 6 
 -36 -216 -1296 -7776 -46656 -279936 -1679616 -10077696 -60466176 -362797056 -2.176782e+009 -1.306069e+010 ??? Error using ==> factor at 27

สุดท้ายคือการแบ่งส่วนข้อผิดพลาด แต่มันเหมาะกับช่วง [-127,127] ช่วงมาตรฐานจำนวนเต็ม


ฉันใช้เทคนิคนี้เมื่อไม่นานมานี้เพื่อกำหนดฟังก์ชั่นแฮชในโปรแกรม C ตัวเก่าของฉันมันทำงานได้ดี!
Abr001am

0

JavaScript (ES6), 73 ไบต์

f=(n,i=0,j=0,k=0,l=1,m=i<0?-i:~i)=>n-i?f(n,m,k++?j:i,k%=l,l+!k):++k-l?m:j

ทำงานโดยการแจกแจงลำดับ (0, -1, 1, -2, 2, -3, 3, ... ) จนกว่ามันจะพบnนับรอบตามที่มันไป iมีรายการปัจจุบัน jประกอบด้วยจุดเริ่มต้นของวัฏจักรปัจจุบันkดัชนีภายในวัฏจักรlความยาวของวัฏจักรปัจจุบันและmรายการถัดไปในลำดับ เมื่อเราพบว่าnเราใช้jถ้าเราอยู่ในตอนท้ายของรอบหรือmไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.