JoyCog

Hex Artifact Content
Login

Artifact 580d5e28923f5ed04d2054193366188553f8c08655d626d6c088aad32f635de0:


0000: 28 2a 20 6a 6f 79 63 6f 67 2e 6a 6f 79 20 2a 29  (* joycog.joy *)
0010: 0a 28 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 2a  .(* ========== *
0020: 29 0a 0a 28 2a 20 47 69 76 65 6e 20 61 20 6c 69  )..(* Given a li
0030: 73 74 20 6f 66 20 74 77 6f 20 63 68 61 69 6e 73  st of two chains
0040: 65 74 20 67 65 61 72 73 20 28 49 2e 65 2e 20 61  et gears (I.e. a
0050: 20 63 6f 6d 70 61 63 74 20 64 6f 75 62 6c 65 29   compact double)
0060: 20 61 6e 64 20 74 68 65 6e 20 61 20 6c 69 73 74   and then a list
0070: 20 6f 66 20 63 61 73 73 65 74 74 65 0a 20 20 20   of cassette.   
0080: 73 70 72 6f 63 6b 65 74 73 2c 20 77 69 6c 6c 20  sprockets, will 
0090: 63 61 6c 63 75 6c 61 74 65 20 61 6c 6c 20 74 68  calculate all th
00a0: 65 20 72 61 74 69 6f 73 20 61 6e 64 20 73 6f 72  e ratios and sor
00b0: 74 20 74 68 65 6d 2c 20 72 65 70 6f 72 74 69 6e  t them, reportin
00c0: 67 20 6f 75 74 20 74 68 65 20 72 65 73 75 6c 74  g out the result
00d0: 73 20 61 73 20 61 0a 20 20 20 6c 69 73 74 20 6f  s as a.   list o
00e0: 66 20 74 72 69 70 6c 65 73 3b 20 74 68 65 20 66  f triples; the f
00f0: 69 72 73 74 20 6f 66 20 74 68 65 20 74 72 69 70  irst of the trip
0100: 6c 65 20 62 65 69 6e 67 20 74 68 65 20 72 61 74  le being the rat
0110: 69 6f 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 62  io, the second b
0120: 65 69 6e 67 20 74 68 65 20 63 61 73 73 65 74 74  eing the cassett
0130: 65 0a 20 20 20 73 70 72 6f 63 6b 65 74 20 61 6e  e.   sprocket an
0140: 64 20 74 68 65 20 74 68 69 72 64 20 62 65 69 6e  d the third bein
0150: 67 20 74 68 65 20 63 68 61 69 6e 73 65 74 20 67  g the chainset g
0160: 65 61 72 2e 0a 2a 29 0a 0a 0a 28 2a 20 4b 65 79  ear..*)...(* Key
0170: 20 66 6f 72 20 74 68 65 20 73 74 61 63 6b 20 6e   for the stack n
0180: 6f 74 61 74 69 6f 6e 0a 20 20 20 3d 3d 3d 3d 3d  otation.   =====
0190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01a0: 3d 3d 3d 3d 3d 0a 0a 20 20 20 46 20 3d 20 46 6c  =====..   F = Fl
01b0: 6f 61 74 0a 20 20 20 49 20 3d 20 49 6e 74 65 67  oat.   I = Integ
01c0: 65 72 0a 20 20 20 5b 2e 2e 2e 5d 20 3d 20 4c 69  er.   [...] = Li
01d0: 73 74 0a 0a 2a 29 0a 0a 44 45 46 49 4e 45 0a 0a  st..*)..DEFINE..
01e0: 09 28 2a 20 43 6f 6e 73 74 61 6e 74 73 20 20 2a  .(* Constants  *
01f0: 29 0a 09 28 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 20  )..(* ========= 
0200: 20 2a 29 0a 0a 09 28 2a 20 46 6f 72 20 72 65 66   *)...(* For ref
0210: 65 72 65 6e 63 65 2c 20 73 75 70 70 6c 69 65 64  erence, supplied
0220: 20 61 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   as arguments to
0230: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 6d 65 20   main programme 
0240: 2a 29 0a 0a 09 28 2a 20 6c 69 74 74 6c 65 67 65  *)...(* littlege
0250: 61 72 73 20 3d 3d 20 5b 31 32 20 31 33 20 31 35  ars == [12 13 15
0260: 20 31 37 20 31 39 20 32 31 20 32 33 20 32 36 5d   17 19 21 23 26]
0270: 3b 20 2a 29 0a 09 28 2a 20 62 69 67 67 65 61 72  ; *)..(* biggear
0280: 73 20 3d 3d 20 5b 33 34 20 35 30 5d 3b 20 2a 29  s == [34 50]; *)
0290: 0a 0a 0a 09 28 2a 20 53 6f 72 74 20 52 6f 75 74  ....(* Sort Rout
02a0: 69 6e 65 20 2a 29 0a 09 28 2a 20 3d 3d 3d 3d 3d  ine *)..(* =====
02b0: 3d 3d 3d 3d 3d 3d 3d 20 2a 29 0a 0a 09 28 2a 20  ======= *)...(* 
02c0: 46 72 6f 6d 3a 20 68 74 74 70 73 3a 2f 2f 70 69  From: https://pi
02d0: 6e 62 6f 61 72 64 2e 69 6e 2f 75 3a 61 74 6f 6d  nboard.in/u:atom
02e0: 69 63 75 6c 65 73 2f 62 3a 66 38 33 39 31 33 64  icules/b:f83913d
02f0: 63 31 66 64 38 20 2a 29 0a 0a 09 71 73 6f 72 74  c1fd8 *)...qsort
0300: 31 20 3d 3d 20 5b 20 73 6d 61 6c 6c 20 5d 0a 09  1 == [ small ]..
0310: 20 20 20 20 20 20 20 20 20 20 5b 20 5d 0a 09 20            [ ].. 
0320: 20 20 20 20 20 20 20 20 20 5b 20 75 6e 63 6f 6e           [ uncon
0330: 73 20 5b 5b 66 69 72 73 74 5d 20 75 6e 61 72 79  s [[first] unary
0340: 32 20 3e 20 5d 20 73 70 6c 69 74 20 5d 0a 09 20  2 > ] split ].. 
0350: 20 20 20 20 20 20 20 20 20 5b 20 5b 73 77 61 70           [ [swap
0360: 5d 20 64 69 70 20 63 6f 6e 73 20 63 6f 6e 63 61  ] dip cons conca
0370: 74 20 5d 0a 09 20 20 20 20 20 20 20 20 20 20 62  t ]..          b
0380: 69 6e 72 65 63 3b 0a 0a 0a 09 28 2a 20 52 61 74  inrec;....(* Rat
0390: 69 6f 73 20 2a 29 0a 09 28 2a 20 3d 3d 3d 3d 3d  ios *)..(* =====
03a0: 3d 20 2a 29 0a 0a 09 28 2a 20 45 78 61 6d 70 6c  = *)...(* Exampl
03b0: 65 3a 0a 09 20 20 20 3e 20 33 34 20 5b 31 32 20  e:..   > 34 [12 
03c0: 31 33 20 31 35 20 31 37 20 31 39 20 32 31 20 32  13 15 17 19 21 2
03d0: 33 20 32 36 5d 20 72 61 74 69 6f 73 2e 0a 09 20  3 26] ratios... 
03e0: 20 20 3e 20 5b 5b 32 20 31 32 20 33 34 5d 20 5b    > [[2 12 34] [
03f0: 32 20 31 33 20 33 34 5d 20 5b 32 20 31 35 20 33  2 13 34] [2 15 3
0400: 34 5d 20 5b 32 20 31 37 20 33 34 5d 20 5b 31 20  4] [2 17 34] [1 
0410: 31 39 20 33 34 5d 20 2e 2e 2e 20 5d 0a 09 2a 29  19 34] ... ]..*)
0420: 0a 0a 09 72 61 74 69 6f 73 20 3d 3d 20 20 20 20  ...ratios ==    
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0440: 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61            (* Sta
0450: 63 6b 3a 20 46 20 5b 49 2e 2e 2e 5d 20 2a 29 0a  ck: F [I...] *).
0460: 09 09 64 75 70 20 20 20 20 20 20 20 20 20 20 20  ..dup           
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 20 28 2a 20 53 74 61 63 6b 3a 20 46       (* Stack: F
0490: 20 5b 49 2e 2e 2e 5d 20 5b 49 2e 2e 2e 5d 20 2a   [I...] [I...] *
04a0: 29 0a 09 09 72 6f 74 61 74 65 20 20 20 20 20 20  )...rotate      
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 20 28 2a 20 53 74 61 63 6b 3a         (* Stack:
04d0: 20 5b 49 2e 2e 2e 5d 20 5b 49 2e 2e 2e 5d 20 46   [I...] [I...] F
04e0: 20 2a 29 0a 09 09 64 75 70 20 20 20 20 20 20 20   *)...dup       
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61 63           (* Stac
0510: 6b 3a 20 5b 49 2e 2e 2e 5d 20 5b 49 2e 2e 2e 5d  k: [I...] [I...]
0520: 20 46 20 46 20 2a 29 0a 09 09 75 6e 69 74 6c 69   F F *)...unitli
0530: 73 74 20 5b 73 77 61 70 20 2f 5d 20 63 6f 6e 63  st [swap /] conc
0540: 61 74 20 20 20 20 20 20 20 20 20 20 20 28 2a 20  at           (* 
0550: 53 74 61 63 6b 3a 20 5b 49 2e 2e 2e 5d 20 5b 49  Stack: [I...] [I
0560: 2e 2e 2e 5d 20 46 20 5b 46 20 73 77 61 70 20 2f  ...] F [F swap /
0570: 5d 20 2a 29 0a 09 09 72 6f 6c 6c 64 6f 77 6e 20  ] *)...rolldown 
0580: 73 77 61 70 20 20 20 20 20 20 20 20 20 20 20 20  swap            
0590: 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61            (* Sta
05a0: 63 6b 3a 20 5b 49 2e 2e 2e 5d 20 46 20 5b 49 2e  ck: [I...] F [I.
05b0: 2e 2e 5d 20 5b 46 20 73 77 61 70 20 2f 5d 20 2a  ..] [F swap /] *
05c0: 29 0a 09 09 6d 61 70 20 20 20 20 20 20 20 20 20  )...map         
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 20 20 28 2a 20 53 74 61 63 6b 3a         (* Stack:
05f0: 20 5b 49 2e 2e 2e 5d 20 46 20 5b 46 2e 2e 2e 5d   [I...] F [F...]
0600: 20 2a 29 0a 09 09 72 6f 6c 6c 64 6f 77 6e 20 20   *)...rolldown  
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61 63           (* Stac
0630: 6b 3a 20 46 20 5b 46 2e 2e 2e 5d 20 5b 49 2e 2e  k: F [F...] [I..
0640: 2e 5d 20 2a 29 0a 09 09 7a 69 70 20 20 20 20 20  .] *)...zip     
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74             (* St
0670: 61 63 6b 3a 20 46 20 5b 5b 46 20 49 5d 2e 2e 2e  ack: F [[F I]...
0680: 5d 20 2a 29 0a 09 09 73 77 61 70 20 20 20 20 20  ] *)...swap     
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06a0: 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61            (* Sta
06b0: 63 6b 3a 20 5b 5b 46 20 49 5d 2e 2e 2e 5d 20 46  ck: [[F I]...] F
06c0: 20 2a 29 0a 09 09 75 6e 69 74 6c 69 73 74 20 5b   *)...unitlist [
06d0: 75 6e 69 74 6c 69 73 74 20 63 6f 6e 63 61 74 5d  unitlist concat]
06e0: 20 63 6f 6e 63 61 74 20 20 28 2a 20 53 74 61 63   concat  (* Stac
06f0: 6b 3a 20 5b 5b 46 20 49 5d 2e 2e 2e 5d 20 5b 46  k: [[F I]...] [F
0700: 20 75 6e 69 74 6c 69 73 74 20 63 6f 6e 63 61 74   unitlist concat
0710: 5d 20 2a 29 0a 09 09 6d 61 70 3b 20 20 20 20 20  ] *)...map;     
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61            (* Sta
0740: 63 6b 3a 20 5b 5b 46 20 49 20 49 5d 2e 2e 2e 5d  ck: [[F I I]...]
0750: 20 2a 29 0a 0a 0a 09 28 2a 20 4d 61 69 6e 20 2a   *)....(* Main *
0760: 29 0a 09 28 2a 20 3d 3d 3d 3d 20 2a 29 0a 0a 09  )..(* ==== *)...
0770: 28 2a 20 45 78 61 6d 70 6c 65 3a 0a 09 20 20 20  (* Example:..   
0780: 3e 20 5b 33 34 20 35 30 5d 20 5b 31 32 20 31 33  > [34 50] [12 13
0790: 20 31 35 20 31 37 20 31 39 20 32 31 20 32 33 20   15 17 19 21 23 
07a0: 32 36 5d 20 6a 6f 79 63 6f 67 2e 0a 09 20 20 20  26] joycog...   
07b0: 3e 20 5b 5b 31 2e 33 30 37 36 39 20 32 36 20 33  > [[1.30769 26 3
07c0: 34 5d 20 5b 31 2e 34 37 38 32 36 20 32 33 20 33  4] [1.47826 23 3
07d0: 34 5d 20 5b 31 2e 36 31 39 30 35 20 32 31 20 33  4] [1.61905 21 3
07e0: 34 5d 20 5b 31 2e 37 38 39 34 37 20 31 39 20 33  4] [1.78947 19 3
07f0: 34 5d 20 2e 2e 2e 20 5d 0a 09 2a 29 0a 0a 09 6a  4] ... ]..*)...j
0800: 6f 79 63 6f 67 20 3d 3d 20 20 20 20 20 20 20 20  oycog ==        
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 20 28 2a 20 53 74 61 63 6b 3a 20        (* Stack: 
0830: 5b 49 20 49 5d 20 5b 49 2e 2e 2e 5d 20 2a 29 0a  [I I] [I...] *).
0840: 09 09 64 75 70 20 20 20 20 20 20 20 20 20 20 20  ..dup           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 20 20 28 2a 20 53 74 61 63 6b 3a 20 5b       (* Stack: [
0870: 49 20 49 5d 20 5b 49 2e 2e 2e 5d 20 5b 49 2e 2e  I I] [I...] [I..
0880: 2e 5d 20 2a 29 0a 09 09 72 6f 6c 6c 64 6f 77 6e  .] *)...rolldown
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74             (* St
08b0: 61 63 6b 3a 20 5b 49 2e 2e 2e 5d 20 5b 49 2e 2e  ack: [I...] [I..
08c0: 2e 5d 20 5b 49 31 20 49 32 5d 20 2a 29 0a 09 09  .] [I1 I2] *)...
08d0: 64 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  dup             
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 28 2a 20 53 74 61 63 6b 3a 20 5b 49 2e     (* Stack: [I.
0900: 2e 2e 5d 20 5b 49 2e 2e 2e 5d 20 5b 49 31 20 49  ..] [I...] [I1 I
0910: 32 5d 20 5b 49 31 20 49 32 5d 20 2a 29 0a 09 09  2] [I1 I2] *)...
0920: 66 69 72 73 74 20 31 2e 30 20 2a 20 20 20 20 20  first 1.0 *     
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 28 2a 20 53 74 61 63 6b 3a 20 5b 49 2e     (* Stack: [I.
0950: 2e 2e 5d 20 5b 49 2e 2e 2e 5d 20 5b 49 31 20 49  ..] [I...] [I1 I
0960: 32 5d 20 49 31 20 2a 29 0a 09 09 72 6f 6c 6c 64  2] I1 *)...rolld
0970: 6f 77 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  own             
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 2a                (*
0990: 20 53 74 61 63 6b 3a 20 5b 49 2e 2e 2e 5d 20 5b   Stack: [I...] [
09a0: 49 31 20 49 32 5d 20 49 31 20 5b 49 2e 2e 2e 5d  I1 I2] I1 [I...]
09b0: 20 2a 29 09 0a 09 09 72 61 74 69 6f 73 20 20 20   *)....ratios   
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 20 20 20 28 2a 20 53 74 61            (* Sta
09e0: 63 6b 3a 20 5b 49 2e 2e 2e 5d 20 5b 49 31 20 49  ck: [I...] [I1 I
09f0: 32 5d 20 5b 5b 46 20 49 20 49 5d 2e 2e 2e 5d 20  2] [[F I I]...] 
0a00: 2a 29 0a 09 09 72 6f 6c 6c 75 70 20 20 20 20 20  *)...rollup     
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 20 20 20 28 2a 20 53 74 61 63 6b          (* Stack
0a30: 3a 20 5b 5b 46 20 49 20 49 5d 2e 2e 2e 5d 20 5b  : [[F I I]...] [
0a40: 49 2e 2e 2e 5d 20 5b 49 31 20 49 32 5d 20 2a 29  I...] [I1 I2] *)
0a50: 0a 09 09 73 65 63 6f 6e 64 20 31 2e 30 20 2a 20  ...second 1.0 * 
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 28 2a 20 53 74 61 63 6b 3a 20        (* Stack: 
0a80: 5b 5b 46 20 49 20 49 5d 2e 2e 2e 5d 20 5b 49 2e  [[F I I]...] [I.
0a90: 2e 2e 5d 20 49 32 20 2a 29 0a 09 09 73 77 61 70  ..] I2 *)...swap
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0ac0: 2a 20 53 74 61 63 6b 3a 20 5b 5b 46 20 49 20 49  * Stack: [[F I I
0ad0: 5d 2e 2e 2e 5d 20 49 32 20 5b 49 2e 2e 2e 5d 20  ]...] I2 [I...] 
0ae0: 2a 29 0a 09 09 72 61 74 69 6f 73 20 20 20 20 20  *)...ratios     
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 20 20 28 2a 20 53 74 61 63 6b          (* Stack
0b10: 3a 20 5b 5b 46 20 49 20 49 5d 2e 2e 2e 5d 20 5b  : [[F I I]...] [
0b20: 5b 46 20 49 20 49 5d 2e 2e 2e 5d 20 2a 29 0a 09  [F I I]...] *)..
0b30: 09 63 6f 6e 63 61 74 20 20 20 20 20 20 20 20 20  .concat         
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 28 2a 20 53 74 61 63 6b 3a 20 5b 5b      (* Stack: [[
0b60: 46 20 49 20 49 5d 2e 2e 2e 5d 20 2a 29 0a 09 09  F I I]...] *)...
0b70: 71 73 6f 72 74 31 2e 20 20 20 20 20 20 20 20 20  qsort1.         
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 28 2a 20 53 74 61 63 6b 3a 20 5b 5b 46     (* Stack: [[F
0ba0: 20 49 20 49 5d 2e 2e 2e 5d 20 2a 29 0a            I I]...] *).