สร้างคู่จำนวนเต็มจากค่าที่ไม่เป็นลบ


25

คุณควรจะเขียนโปรแกรมหรือฟังก์ชั่นซึ่งจะเป็นจำนวนเต็มไม่เป็นลบNเป็นอินพุตและเอาต์พุตหรือผลตอบแทนจำนวนเต็มสองจำนวน (ลบศูนย์หรือบวก) และXY

จำนวนเต็มมีความหมายในแง่คณิตศาสตร์เนื่องจากมีจำนวนไม่ จำกัด

ฟังก์ชั่นการใช้งานจะต้องมีbijective ซึ่งหมายความว่าสำหรับทุก ๆNการส่งออกจะมีX Yคู่ที่แตกต่างกันและทุกX Yคู่จะต้องส่งออกสำหรับการป้อนข้อมูลบางอย่างNนั่นคือทั้งหมดของคู่ต่อไปนี้ควรได้รับการส่งออกสำหรับบางส่วนN:

                 ...
    ┌─────┬─────┬────┬────┬────┐
    │-2 -2│-2 -1│-2 0│-2 1│-2 2│
    ├─────┼─────┼────┼────┼────┤
    │-1 -2│-1 -1│-1 0│-1 1│-1 2│
    ├─────┼─────┼────┼────┼────┤
... │0 -2 │0 -1 │0 0 │0 1 │0 2 │ ...
    ├─────┼─────┼────┼────┼────┤
    │1 -2 │1 -1 │1 0 │1 1 │1 2 │
    ├─────┼─────┼────┼────┼────┤
    │2 -2 │2 -1 │2 0 │2 1 │2 2 │
    └─────┴─────┴────┴────┴────┘
                 ...

โปรดทราบว่าU Vและเป็นคู่ที่แตกต่างกันถ้าV UU!=V

รายละเอียด

  • หากภาษาของคุณไม่รองรับจำนวนเต็มขนาดใหญ่โดยพลการมันก็ดี แต่อัลกอริทึมของคุณควรทำงานกับประเภทข้อมูลจำนวนเต็มขนาดใหญ่โดยพลการ 2^31-1รหัสของคุณยังคงควรสนับสนุนค่าที่ป้อนเข้าอย่างน้อย
  • หากคุณเลือกที่จะพิมพ์หรือส่งคืนเอาต์พุตเป็นสตริงไม่อนุญาตให้นำหน้า0หรือ+สัญญาณใด ๆ มิฉะนั้นการแสดงค่าจำนวนเต็มมาตรฐานของภาษาของคุณก็ใช้ได้

ตัวอย่าง

หากงานนั้นจะทำให้ฟังก์ชัน bijective รับจำนวนเต็มNและลบหนึ่งจำนวนเต็มXทางออกอาจเป็นฟังก์ชัน

if (input mod 2 == 0) return N/2 else return -(N+1)/2,

ดำเนินการในบางภาษา ฟังก์ชั่นนี้ผลตอบแทนสำหรับX = 0 -1 1 -2 2...N = 0 1 2 3 4...


จำนวนเต็มใด ๆ ในเอาต์พุตสามารถทำซ้ำสำหรับอินพุตที่ต่างกันได้หรือไม่? เช่น10=>11 12, 9=>10 11นี้ไม่ถูกต้องเพราะ 11 ซ้ำแล้วซ้ำอีก?
BrainSteel

1
เท่าที่คำว่า "bijective" ถูกกำหนด "11 12" ไม่เหมือนกับ "10 11" ดังนั้นจึงใช้ได้ นี่เป็นเพราะฟังก์ชั่น bijective ถูกกำหนดเป็นฟังก์ชั่น "ที่ทุกองค์ประกอบของหนึ่งชุดจับคู่กับองค์ประกอบหนึ่งของชุดอื่น ๆ และทุกองค์ประกอบของชุดอื่น ๆ จับคู่กับองค์ประกอบหนึ่งของชุดแรกเท่านั้นไม่มี องค์ประกอบที่ไม่มีการจับคู่ "( en.wikipedia.org/wiki/Biject ) ถ้าคุณจะผกผันฟังก์ชันของคุณ "11 12" ควรเอาท์พุท 10 และ "10 11" ควรเอาท์พุท 9
GiantTree

@BrainSteel ตัวอย่างของคุณถูกต้อง ไม่สามารถทำซ้ำเฉพาะคู่ (สั่งซื้อ) GiantTree ถูกต้อง เพิ่มคำอธิบายเพิ่มเติมสำหรับคำถาม
randomra

มันจะต้องเป็น bijection ภายในช่วงจำนวนเต็มของภาษาที่กำหนดหรือควรจะทำงานสำหรับจำนวนเต็มทั้งหมดหรือไม่
ข้อบกพร่อง

1
@LegionMammal มีคำอธิบายทางคณิตศาสตร์ที่ดีของงาน: "คุณต้องกำหนดฟังก์ชัน bijective $ f: N + → Z ^ 2 $. - LegionMammal978" ที่ฉันคิดว่าจะเป็นประโยชน์ที่ไหนสักแห่งในคำสั่ง
ไบรอัน J

คำตอบ:


15

Pyth, 15

u,-HyeGhGjQ2,ZZ

ลองออนไลน์

u             reduce
                lambda G,H:    [implicit]
  ,-HyeGhG         (H-2*G[-1],G[0])
  jQ2           base(input(),2)
  ,ZZ           (0,0)
              print result     [implicit]

การแปล Python:

g=lambda Z,n:(n-2*Z[1],Z[0])
print reduce(g,binlist(input()),(0,0))

หรือซ้ำแล้วซ้ำอีก:

(x,y)=(0,0)
for b in binlist(input()):
    (x,y)=(b-2*y,x)
print (x,y)

ที่แปลงตัวเลขให้เป็นรายการหลักเช่นbinlistbinlist(4) = [1,0,0]

ดังนั้นสิ่งนี้ทำงานอย่างไร มันตีความตัวเลขไบนารีของจำนวนเป็นตัวเลขสองสลับกันในฐานเชิงลบทั้งสองเหมือนในของฉันแก้ปัญหาหลามn

เลขฐานสองสอดคล้องกับคู่( x , y ) = ( b 0 - 2 b 2 + 4 b 4 - 8 b 6 + , b 1 - 2 b 3 + 4 b 5 - 8 b 7 + )

n=b5b4b3b2b1b0
(x,y)=(b02b2+4b48b6+,b12b3+4b58b7+).

หากเรายังไม่ได้ประมวลผลหลักสุดท้ายของnเราจะมีดัชนีทั้งหมดสูงกว่า $ 1 $, n = b 5 b 4 b 3 b 2 b 1 ที่สอดคล้องกับคู่( x , y ) = ( b 1 - 2 b 3 + 4 b 5 - 8 b 7 + , b 2 - 2 b 4b0n

n=b5b4b3b2b1
(x,y)=(b12b3+4b58b7+,b22b4+4b68b8+).

จากนั้นเราสามารถแสดงค่าใหม่เมื่อถูกอ่านในแง่ของค่าเก่าb0

(x,y)=(b02y,x).

ดังนั้นโดยการทำการแปลงซ้ำในแต่ละบิตต่อเนื่องกันbของnเราสร้างจุด( x , y )ที่มาจากการแยกตัวเลข(x,y)(b2y,x)bn(x,y)


โปรดทราบว่าการสนับสนุน MathJax ถูกปิดใช้งาน คุณอาจต้องการพิจารณาแก้ไขคำอธิบายเพื่อความสะดวกในการอ่าน
Alex A.

32

CJam, 24 22 21 bytes

สมองของฉันมีปัญหาในการเข้าใจวิธีการแก้ปัญหาอื่น ๆ ที่ใช้ แต่สมองของฉันเข้าใจเลขฐานสองอย่างแน่นอนดังนั้นนี่คือ soultion ตามการจัดการบิต!

li4b2fmd2/z{)(\2b^}%p

ลองออนไลน์

คำอธิบาย

วิธีการนี้จะถือว่าอินพุตเป็นค่าไบนารีสองอินเตอร์ลีฟหนึ่งค่าสำหรับแต่ละเอาต์พุต ทั้งหมด แต่บิตที่มีนัยสำคัญน้อยที่สุดของการเข้ารหัสแต่ละขนาดและบิตที่มีนัยสำคัญน้อยที่สุดจะเป็นสัญญาณหรือไม่ที่จะใช้ส่วนประกอบที่เหมาะสมของขนาดนี้ ในการดำเนินการนี้บิตที่มีตำแหน่งคี่จะตรงกับหมายเลขเอาต์พุตแรก (และบิตที่อยู่ในตำแหน่งที่ตรงกับที่สอง) และ LSB ของ0สัญญาณที่จะใช้ประกอบ

ตัวอย่างเช่นกำหนดการป้อนข้อมูลของ73, uninterleaving แทน binary ของการ1001001bผลิต0 1|0(แปลกตำแหน่งบิต) และ1 0 0|1(บิตแม้กระทั่งตำแหน่ง) ค่าแรกมีขนาด01b = 1และควรเติมเต็มสำหรับค่าสุดท้ายของ~1 = -2และค่าที่สองมีขนาด100b = 4และไม่ควรเติมเต็ม

การสาธิตอย่างไม่เป็นทางการของความถูกต้อง

ฉันสร้างโปรแกรมทดสอบที่วางแต่ละอินพุตจากศูนย์ไปยังหมายเลขที่ผู้ใช้ระบุลบหนึ่งในตำแหน่งเอาท์พุทของมันในตาราง 2D คุณสามารถลองออนไลน์ได้เช่นกัน ต่อไปนี้เป็นผลลัพธ์ของโปรแกรมนี้ซึ่งแสดงให้เห็นว่าอัลกอริทึมแผนที่0-99:

      -8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  8

-8                      92 84 86 94                     
-7                      88 80 82 90                     
-6                      76 68 70 78                     
-5                   96 72 64 66 74 98                  
-4                60 52 28 20 22 30 54 62               
-3                56 48 24 16 18 26 50 58               
-2                44 36 12  4  6 14 38 46               
-1                40 32  8  0  2 10 34 42               
 0                41 33  9  1  3 11 35 43               
 1                45 37 13  5  7 15 39 47               
 2                57 49 25 17 19 27 51 59               
 3                61 53 29 21 23 31 55 63               
 4                   97 73 65 67 75 99                  
 5                      77 69 71 79                     
 6                      89 81 83 91                     
 7                      93 85 87 95                     
 8                                                      

รูปแบบการเติมดูแปลก ๆ แต่จริง ๆ แล้วมันเป็น bijective! ด้วยพลังต่อเนื่องแต่ละอันที่ 4 มันเต็มกำลังสองที่มีความยาวด้านก่อนหน้าสองเท่า ตัวอย่างเช่นนี่คือวิธีที่อัลกอริทึมแมป0-15:

      -2 -1  0  1  2

-2    12  4  6 14   
-1     8  0  2 10   
 0     9  1  3 11   
 1    13  5  7 15   
 2                  

สิ่งนี้ประกอบขึ้นเป็น 4x4 ตารางกลาง 8x8 ของ0-63:

      -4 -3 -2 -1  0  1  2  3  4

-4    60 52 28 20 22 30 54 62   
-3    56 48 24 16 18 26 50 58   
-2    44 36 12  4  6 14 38 46   
-1    40 32  8  0  2 10 34 42   
 0    41 33  9  1  3 11 35 43   
 1    45 37 13  5  7 15 39 47   
 2    57 49 25 17 19 27 51 59   
 3    61 53 29 21 23 31 55 63   
 4                              

ซึ่งประกอบเป็น 8x8 ตารางกลาง 16x16 ตารางของ0-255:

         -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7   8

 -8     252 244 220 212 124 116  92  84  86  94 118 126 214 222 246 254    
 -7     248 240 216 208 120 112  88  80  82  90 114 122 210 218 242 250    
 -6     236 228 204 196 108 100  76  68  70  78 102 110 198 206 230 238    
 -5     232 224 200 192 104  96  72  64  66  74  98 106 194 202 226 234    
 -4     188 180 156 148  60  52  28  20  22  30  54  62 150 158 182 190    
 -3     184 176 152 144  56  48  24  16  18  26  50  58 146 154 178 186    
 -2     172 164 140 132  44  36  12   4   6  14  38  46 134 142 166 174    
 -1     168 160 136 128  40  32   8   0   2  10  34  42 130 138 162 170    
  0     169 161 137 129  41  33   9   1   3  11  35  43 131 139 163 171    
  1     173 165 141 133  45  37  13   5   7  15  39  47 135 143 167 175    
  2     185 177 153 145  57  49  25  17  19  27  51  59 147 155 179 187    
  3     189 181 157 149  61  53  29  21  23  31  55  63 151 159 183 191    
  4     233 225 201 193 105  97  73  65  67  75  99 107 195 203 227 235    
  5     237 229 205 197 109 101  77  69  71  79 103 111 199 207 231 239    
  6     249 241 217 209 121 113  89  81  83  91 115 123 211 219 243 251    
  7     253 245 221 213 125 117  93  85  87  95 119 127 215 223 247 255    
  8                                                                        

3
ฉลาดมาก! คุณสามารถบันทึกไบต์ที่สองโดยใช้แทนli4b2fmd2/ 0li2b+W%2/W%สิ่งนี้ให้จำนวนเต็มเท่ากัน แต่เรียงกลับกัน
เดนนิส

@Dennis นั่นก็ฉลาดมากเช่นกัน ฉันได้อัปเดตคำตอบเพื่อใช้เคล็ดลับนั้นแล้ว ขอบคุณ!
Runer112

12

Python 2, 49

แก้ไข: ปรับปรุงเป็น 49 โดยใช้การเรียกซ้ำแบบขั้นตอนเดียวที่ดีขึ้นสำหรับฐาน -2

def f(n):x,y=n and f(n/2)or(0,0);return n%2-2*y,x

นี่เป็นรุ่น Pythreduceใช้

แก้ไข: ปรับปรุง 52 โดยสลับไปที่ฐาน -2จากternary สมดุล

Python 2, 52

h=lambda n:n and n%2-2*h(n/4)
lambda n:(h(n),h(n/2))

Python 2, 54

h=lambda n:n and-~n%3-1+3*h(n/9)
lambda n:(h(n),h(n/3))

สิ่งนี้ใช้การแทรกซึมแบบดิจิตัลเหมือนกับโซลูชันของ Runer112แต่ด้วยไตรภาคที่สมดุลแทนที่จะเป็นไบนารีแบบเซ็นชื่อ Python ไม่มีการแปลงพื้นฐานในตัวดังนั้นโค้ดจะใช้ซ้ำ

ฟังก์ชั่นตัวช่วยh( 3แทนที่ของ9) จะใช้จำนวนธรรมชาติและแปลงมันมาจากแบบไตรภาคให้เป็นไตรภาคแบบสมดุลด้วยการแทนที่หลัก

0 -> 0 
1 -> +1
2 -> -1

ตัวอย่างเช่น 19 ซึ่งเป็น 201 ในฐานจะกลายเป็น (-1) (0) (+ 1) ในไตรภาคแบบสมดุลซึ่งคือ (-1) * 3 ^ 2 + (0) * 3 ^ 1 + (+ 1) * 3 ^ 0 = -8

สมดุลพอเพียงไตรภาคเพื่อเข้ารหัสทุกจำนวนเต็มและเพื่อให้การทำแผนที่จากจำนวนธรรมชาติเพื่อจำนวนเต็ม

nการแมปกับคู่ของจำนวนเต็มเราแทรกตัวเลขใน ต้องการทำเช่นนั้นเราจะต้องhดูที่ทุกหลักอื่น ๆ โดยการทำn/9เป็นขั้นตอน recursive n/3มากกว่า แล้วสำหรับหนึ่งในการประสานงานเราเปลี่ยนจากพื้นหารด้วยn3

นี่คือเอาต์พุต 81 รายการแรกซึ่งครอบคลุมพื้นที่ [-4,4] ^ 2

0 (0, 0)
1 (1, 0)
2 (-1, 0)
3 (0, 1)
4 (1, 1)
5 (-1, 1)
6 (0, -1)
7 (1, -1)
8 (-1, -1)
9 (3, 0)
10 (4, 0)
11 (2, 0)
12 (3, 1)
13 (4, 1)
14 (2, 1)
15 (3, -1)
16 (4, -1)
17 (2, -1)
18 (-3, 0)
19 (-2, 0)
20 (-4, 0)
21 (-3, 1)
22 (-2, 1)
23 (-4, 1)
24 (-3, -1)
25 (-2, -1)
26 (-4, -1)
27 (0, 3)
28 (1, 3)
29 (-1, 3)
30 (0, 4)
31 (1, 4)
32 (-1, 4)
33 (0, 2)
34 (1, 2)
35 (-1, 2)
36 (3, 3)
37 (4, 3)
38 (2, 3)
39 (3, 4)
40 (4, 4)
41 (2, 4)
42 (3, 2)
43 (4, 2)
44 (2, 2)
45 (-3, 3)
46 (-2, 3)
47 (-4, 3)
48 (-3, 4)
49 (-2, 4)
50 (-4, 4)
51 (-3, 2)
52 (-2, 2)
53 (-4, 2)
54 (0, -3)
55 (1, -3)
56 (-1, -3)
57 (0, -2)
58 (1, -2)
59 (-1, -2)
60 (0, -4)
61 (1, -4)
62 (-1, -4)
63 (3, -3)
64 (4, -3)
65 (2, -3)
66 (3, -2)
67 (4, -2)
68 (2, -2)
69 (3, -4)
70 (4, -4)
71 (2, -4)
72 (-3, -3)
73 (-2, -3)
74 (-4, -3)
75 (-3, -2)
76 (-2, -2)
77 (-4, -2)
78 (-3, -4)
79 (-2, -4)
80 (-4, -4)

การเข้ารหัสทางเลือกที่มีจำนวนจินตภาพไตร่ตรองนานขึ้นแม้ว่ามันจะดูดี

Python 2, 63

h=lambda n:n and n%4+2j*h(n/4)
lambda n:(h(n).real,h(n).imag/2)

ในภาษาที่มีการจัดการการแปลงซับซ้อนน้อยกว่า clunky นี่อาจเป็นวิธีที่ดีกว่า หากเราสามารถแสดงจำนวนเชิงซ้อนได้เราสามารถทำ:

Python 2, 38

f=lambda n:n and n%2+n/2%2*1j-2*f(n/4)

1
ฟังก์ชันพื้นฐาน -2 ของคุณจะให้คำตอบ Pyth ที่เป็นค่าเฉลี่ย L&b-%b2*2y/b4,yQy/Q2มีความยาวเพียง 20 ไบต์
เดนนิส

4
@Dennis ฉันเพิ่งเขียน 15-char Pyth solution
xnor

Ternary สมดุลและจินตภาพไตรภาค สองฐานที่ฉันชอบ ตามมาด้วย Base-e เท่านั้น
Brian Minton

11

Python 2, 98 ไบต์

มาเริ่มกันด้วยวิธีง่ายๆ:

def f(N):
 x=a=0;b=2
 while N:x+=1j**b;b+=a<1;a=a or b/2;N-=1;a-=1
 return int(x.real),int(x.imag)

มันแค่สร้างNหน่วยเกลียวเป็นรูปสี่เหลี่ยมผืนผ้าที่มีความยาวบนตาราง 2d เริ่มต้นจากจุดกำเนิดและส่งกลับพิกัดของจุดสุดท้าย

ฟังก์ชั่นเป็น bijective ตั้งแต่:

  • แต่ละจุดสามารถครอบคลุมได้รับเกลียวยาวพอ
  • แต่ละจุดจะถูกตัดโดยเกลียวเพียงครั้งเดียว

เกลียวมีลักษณะเช่นนี้ (ยกเว้นเริ่มต้นที่ 0 มากกว่า 1):

เกลียวอูลาม


@AlexA 0**0 == 1ใน python ดังนั้นมันจึงเหมือนกับif a == 0: a = b/2
grc

เจ๋งขอบคุณที่อธิบาย
Alex A.

@AlexA เปลี่ยนa=a or b/2เป็นสั้น
grc

@grc 0^0=1ในคณิตศาสตร์ทั้งหมดไม่ใช่แค่ไพ ธ อน
Daenyth

1
@Daenyth 0**0เป็นรูปแบบที่ไม่สามารถระบุได้จริงในคณิตศาสตร์
Sp3000

8

dc, 49

[1+2~2*1-*n]sm?dsa8*1+v1-2/dd1+*2/lar-dlmx32P-lmx

สิ่งนี้เริ่มต้นด้วยการจัดการจำนวนเต็มที่ไม่เป็นลบบนกริดดังนี้:

..| 
4 | 14
3 |  9 13
2 |  5  8 12
1 |  2  4  7 11
0 |  0  1  3  6 10
Y +-----------------
  X  0  1  2  3  4 ...

โปรดทราบว่าวิธีการที่ตำแหน่งตารางที่เต็มไปด้วยแนวทแยงมุมเพิ่มขึ้นเอ็นหนังสือ Y = 0 N = X(X+1)/2บรรทัดมีลำดับจำนวนรูปสามเหลี่ยมที่กำหนดโดย นี่คือสมการกำลังสองซึ่งแก้ไขได้โดยใช้สูตรปกติโดยใช้เพียงแค่ + รากเพื่อให้เราสามารถกำหนด X จาก N เมื่อ Y = 0 ถัดไปคือการคำนวณทางคณิตศาสตร์อย่างง่ายเพื่อให้ {X, Y} ที่ไม่ซ้ำกันสำหรับทุก ๆ N

สิ่งนี้ให้คุณภาพ bijective ที่ต้องการ แต่ X และ Y เป็นเพียงแบบไม่ลบ แต่คำถามนั้นต้องการจำนวนเต็มที่เป็นไปได้ทั้งหมด ดังนั้น X และ Y ถูกแมปโดยใช้((t+1)/2)*((t+1)~2*2-1)เพื่อให้จำนวนเต็มที่เป็นไปได้ทั้งหมด

dcมีจำนวนความแม่นยำโดยพลการดังนั้นช่วงอินพุต2^31-1จึงไม่มีปัญหา โปรดทราบว่าความแม่นยำเริ่มต้นคือ 0 ทศนิยมและsqrt()และ/ปัดลงซึ่งเป็นลักษณะการทำงานที่ต้องการที่นี่

เอาท์พุท:

$ for i in {0..10}; do dc biject.dc <<< $i; echo; done
0 0
0 -1
-1 0
0 1
-1 -1
1 0
0 -2
-1 1
1 -1
-2 0
0 2
$

5

Matlab, 54 ไบต์

n=input('')+1;[i,j]=find(spiral(2*n)==n);disp([i,j]-n)

กุญแจนี่คือspiralนี่สร้างเมทริกซ์เกลียวขนาดใดก็ได้

spiral(3)

ผลตอบแทน

ans =

 7     8     9
 6     1     2
 5     4     3

spiral4n2n104n1052.91011n=232


2

Haskell, 78 74 ไบต์

(concat[[(x,i-x),(x,x-1-i),(-1-x,x-1-i),(-1-x,i-x)]|i<-[0..],x<-[0..i]]!!)

ทดสอบการทำงาน:

*Main> mapM_ (print . (concat[[(x,i-x),(x,x-1-i),(-1-x,x-1-i),(-1-x,i-x)]|i<-[0..],x<-[0..i]]!!) ) [0..20]
(0,0)
(0,-1)
(-1,-1)
(-1,0)
(0,1)
(0,-2)
(-1,-2)
(-1,1)
(1,0)
(1,-1)
(-2,-1)
(-2,0)
(0,2)
(0,-3)
(-1,-3)
(-1,2)
(1,1)
(1,-2)
(-2,-2)
(-2,1)
(2,0)

มันทำงานอย่างไร: ทำรายการคู่ทั้งหมดในจตุภาคแรกตามลำดับต่อไปนี้

  |
 2| #4
  |
 1| #2  #5
  | 
 0| #1  #3  #6
  +---------------
     0   1   2   3 

ทำมิรเรอร์แต่ละจุดในส่วนอื่น ๆ เพื่อสร้างรายการขององค์ประกอบ 4 รายการ เชื่อมต่อทั้งหมดไว้ในรายการเดียวและนำnองค์ประกอบ th

แก้ไข: ฟังก์ชั่นไม่จำเป็นต้องใช้ชื่อคณิตศาสตร์เรียงลำดับใหม่ การแสดงออก


คุณสามารถบันทึกได้ 4 ไบต์โดยใช้do-notation: ลองออนไลน์!
ბიმო

1

Haskell , 50 ไบต์

(0!).succ
l!n=(last$(!).succ:[(,)|odd n])l$div n 2

ลองออนไลน์หรือลองใช้กับอินเวอร์ส!

Ungolfed

ntoN2 n = 0 ! (n + 1)

xCounter ! remainingNum
  | odd remainingNum = (xCounter, div remainingNum 2)
  | otherwise        = (xCounter + 1) ! div remainingNum 2

คำอธิบาย

(x,y)N22x(2y+1)1N(!)xlxCountery

โปรดทราบว่าฟังก์ชั่นที่เกิดขึ้นจริงf( ntoN2) เพิ่มอินพุตก่อนที่จะเริ่มต้นด้วยขั้นตอน


1

05AB1E , 35 ไบต์

>©DÝʒo®sÖ}àsÅÉʒ®sÖ}à<2÷‚εDÈi2÷ë>2÷(

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

พิจารณา

f:NN×Nn(x,y),
x2xn+12y+1n+1ff1(x,y)=2x(2y+1)1 1

g:N×NZ×Z(m,n)(h(m),h(n)),
h:NZn{n2,n evenn+12,n odd.
fghgf:NZ×Zเป็น bijections

gf

>©DÝʒo®sÖ}àsÅÉʒ®sÖ}à<2÷‚εDÈi2÷ë>2÷( # Full program

                                    # Implicit input: Integer n
>©                                  # Compute n+1 and save it to the register
  DÝ                                # Duplicate n+1 and push the list [0,...,n+1]
    ʒo®sÖ}                          # Only keep those numbers x so that 2^x divides n+1
          à                         # Get maximum element in the list.
           sÅÉ                      # Swap so that n+1 is on top and push [1,3,5,...,n+1]
              ʒ®sÖ}                 # Only keep those numbers z which divides n+1
                   à<2÷             # Compute y = (z-1)/2
                       ‚            # Push the pair [x,y]
                        ε           # Apply the function h to x (and y):
                           i        # if...
                         DÈ         # x is even
                            2÷      # then compute x/2
                              ë>2÷( # else compute -(x+1)/2
                                    # Implicit output: [h(x),h(y)]

ว้าวโหวตขึ้นสำหรับคำอธิบายที่ดี แต่แน่นอนว่า 05AB1E น่าจะสามารถเอาชนะ Pyth ได้?
ASCII เท่านั้นเท่านั้น

gf

0

Mathematica, 46

SortBy[Tuples[Range[2#]-#,2],Norm][[#]]&[#+1]&

จัดเรียงเวกเตอร์บรรทัดฐานของพวกเขาจากนั้นนำอันที่nหนึ่ง


0

JavaScript, 166 168ไบต์ / ตัวอักษร

วิธีการใหม่ที่ใช้เกลียวเป็นรูปสี่เหลี่ยมผืนผ้าเหมือนที่คนอื่นใช้

function f(n){return b=Math,k=b.ceil((b.sqrt(n)-1)/2),t=2*k+1,m=b.pow(t,2),t+=4,m-t>n?(m-=t,m-t>n?(m-=t,m-t>n?[k,k-(m-n-t)]:[-k+(m-n),k]):[-k,-k+(m-n)]):[k-(m-n),-k]}

ฉันใช้นี้คำตอบ Math.SE แปลว่ามัน JS และบีบอัดโดยใช้UglifyJS

วิธีการนี้ไม่ได้ใช้การวนซ้ำใด ๆ หรือไม่สร้างเกลียวในทางใดทางหนึ่ง

f:N0Z2

ปรับปรุง: Saved 2 ตัวอักษรโดยจัดเก็บในMathb

t-=1t+=4f(0)=f(8)N00


1) การผ่านคำถามเดียวกันที่แน่นอนจะไม่ช่วยจริงๆ 2) การคัดลอกคำตอบอื่นแล้วใช้ minifier สำหรับการเล่นกอล์ฟจะไม่มากเกินไป :)
เพิ่มประสิทธิภาพ

อย่างน้อยก็ปฏิบัติตามกฎทั้งหมดที่ระบุในคำถามและเป็นแนวทางที่แตกต่าง นอกจากนี้ฉันไม่ได้ขโมยงานของคนอื่น แต่ฉันอ้างถึงว่าฉันตอบคำถามนี้อย่างไร
GiantTree

@Optimizer: 1) ผมแนะนำ GiantTree ควร repost ตั้งแต่เขาได้ 3 (สมควร) downvotes เดิมของเขาวิธีการที่ไม่ถูกต้อง 2) รหัสที่เขาเอามาจาก Math.SE ไม่ได้แม้ JavaScript เพื่อให้เขาได้มากกว่าเพียงแค่การคัดลอกใน minifier
เดนนิส

@ คนเดนนิสสามารถถอนการโหวตของพวกเขาได้คุณรู้ไหม นอกจากนี้การใช้ตัวขยายขนาดเล็กเพื่อลดขนาดรหัสไม่ได้รับการสนับสนุนจริงๆ IMO
เพิ่มประสิทธิภาพ

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