big steppy
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

567 líneas
20 KiB

  1. 'use strict';
  2. function round(number,precision=3) {
  3. return Math.round(number*Math.pow(10,precision)) / Math.pow(10,precision);
  4. }
  5. function numberRough(value,suffix="") {
  6. if (value == 1) {
  7. return "a single";
  8. } else if (value < 5) {
  9. return "a few";
  10. } else if (value < 12) {
  11. return "a handful " + suffix;
  12. } else if (value == 12) {
  13. return "a dozen";
  14. } else {
  15. var scale = Math.floor(Math.log10(value));
  16. switch(scale) {
  17. case 1: return "dozens " + suffix;
  18. case 2: return "hundreds " + suffix;
  19. default:
  20. let prefix = "";
  21. if (scale % 3 == 1)
  22. prefix = "tens of ";
  23. else if (scale % 3 == 2)
  24. prefix = "hundreds of ";
  25. let order = Math.floor(scale/3);
  26. switch(order) {
  27. case 1: return prefix + "thousands " + suffix;
  28. case 2: return prefix + "millions " + suffix;
  29. case 3: return prefix + "billions " + suffix;
  30. case 4: return prefix + "trillions " + suffix;
  31. case 5: return prefix + "quadrillions " + suffix;
  32. case 6: return prefix + "quintillions " + suffix;
  33. default: return "uncountably many";
  34. }
  35. }
  36. }
  37. }
  38. function number(value, type="full", precision=3) {
  39. var val = parseFloat(value);
  40. switch(type) {
  41. case "full":
  42. if (Math.log(value) / Math.log(10) < 10) {
  43. return val.toString();
  44. }
  45. case "scientific": return val.toExponential(precision).toString();
  46. case "words": return number_words_repeated(val);
  47. case "prefix": return number_prefix(val);
  48. }
  49. }
  50. function number_words(value) {
  51. var scale = Math.floor(Math.log(value) / Math.log(1000));
  52. if (scale < 0) {
  53. return value.toString();
  54. }
  55. switch(scale) {
  56. case 0: return value.toString();
  57. case 1: return Math.round(value / 1e3).toString() + " thousand";
  58. case 2: return Math.round(value / 1e6).toString() + " million";
  59. case 3: return Math.round(value / 1e9).toString() + " billion";
  60. case 4: return Math.round(value / 1e12).toString() + " trillion";
  61. case 5: return Math.round(value / 1e15).toString() + " quadrillion";
  62. case 6: return Math.round(value / 1e18).toString() + " quintillion";
  63. case 7: return Math.round(value / 1e21).toString() + " sextillion";
  64. case 8: return Math.round(value / 1e24).toString() + " septillion";
  65. case 9: return Math.round(value / 1e27).toString() + " octillion";
  66. case 10: return Math.round(value / 1e30).toString() + " nonillion";
  67. case 11: return Math.round(value / 1e33).toString() + " decillion";
  68. case 12: return Math.round(value / 1e36).toString() + " undecillion";
  69. case 13: return Math.round(value / 1e39).toString() + " duodecillion";
  70. case 14: return Math.round(value / 1e42).toString() + " tredecillion";
  71. case 15: return Math.round(value / 1e45).toString() + " quattuordecillion";
  72. case 16: return Math.round(value / 1e48).toString() + " quindecillion";
  73. case 17: return Math.round(value / 1e51).toString() + " sexdecillion";
  74. case 18: return Math.round(value / 1e54).toString() + " septendecillion";
  75. case 19: return Math.round(value / 1e57).toString() + " octodecillion";
  76. case 20: return Math.round(value / 1e60).toString() + " novemdecillion";
  77. default: return Math.round(value / 1e63).toString() + " vigintillion";
  78. }
  79. }
  80. function number_words_repeated(value) {
  81. if (value == Infinity)
  82. return "a lot of";
  83. var scale = Math.floor(Math.log(value) / Math.log(1000));
  84. if (scale < 0)
  85. return value.toString();
  86. switch(scale) {
  87. case 0: return value.toString();
  88. case 1: return Math.round(value / 1e3).toString() + " thousand";
  89. case 2: return Math.round(value / 1e6).toString() + " million";
  90. case 3: return Math.round(value / 1e9).toString() + " billion";
  91. case 4: return Math.round(value / 1e12).toString() + " trillion";
  92. case 5: return Math.round(value / 1e15).toString() + " quadrillion";
  93. case 6: return Math.round(value / 1e18).toString() + " quintillion";
  94. case 7: return Math.round(value / 1e21).toString() + " sextillion";
  95. case 8: return Math.round(value / 1e24).toString() + " septillion";
  96. case 9: return Math.round(value / 1e27).toString() + " octillion";
  97. case 10: return Math.round(value / 1e30).toString() + " nonillion";
  98. case 11: return Math.round(value / 1e33).toString() + " decillion";
  99. default: return number_words_repeated(value / 1e33) + " decillion";
  100. }
  101. }
  102. function number_prefix(value) {
  103. var scale = Math.floor(Math.log(value) / Math.log(1000));
  104. if (scale < 0)
  105. return value.toString();
  106. switch(scale) {
  107. case 0: return value.toString();
  108. case 1: return Math.round(value / 1e3).toString() + "K";
  109. case 2: return Math.round(value / 1e6).toString() + "M";
  110. case 3: return Math.round(value / 1e9).toString() + "G";
  111. case 4: return Math.round(value / 1e12).toString() + "T";
  112. case 5: return Math.round(value / 1e15).toString() + "P";
  113. case 6: return Math.round(value / 1e18).toString() + "E";
  114. case 7: return Math.round(value / 1e21).toString() + "Z";
  115. default: return Math.round(value / 1e24).toString() + "Y";
  116. }
  117. }
  118. function mass(kg, type="metric", singular=false) {
  119. switch(type) {
  120. case "metric": return metricMass(kg, singular);
  121. case "SI": return metricSymMass(kg, singular);
  122. case "customary": return customaryMass(kg, singular);
  123. case "US": return customarySymMass(kg, singular);
  124. case "approx": return approxMass(kg, singular);
  125. }
  126. }
  127. function length(m, type="metric", singular=false) {
  128. switch(type) {
  129. case "metric": return metricLength(m, singular);
  130. case "SI": return metricSymLength(m, singular);
  131. case "customary": return customaryLength(m, singular);
  132. case "US": return customarySymLength(m, singular);
  133. case "approx": return approxLength(m, singular);
  134. }
  135. }
  136. function area(m2, type="metric", singular=false) {
  137. switch(type) {
  138. case "metric": return metricArea(m2, singular);
  139. case "SI": return metricSymArea(m2, singular);
  140. case "customary": return customaryArea(m2, singular);
  141. case "US": return customarySymArea(m2, singular);
  142. case "approx": return approxArea(m2, singular);
  143. }
  144. }
  145. function volume(m3, type="metric", singular=false) {
  146. switch(type) {
  147. case "metric": return metricVolume(m3, singular);
  148. case "SI": return metricSymVolume(m3, singular);
  149. case "customary": return customaryVolume(m3, singular);
  150. case "US": return customarySymVolume(m3, singular);
  151. case "approx": return approxVolume(m3, singular);
  152. }
  153. }
  154. function metricMass(kg, singular=false) {
  155. if (kg < 1/1000) {
  156. let mass = round(kg * 1e6,0);
  157. return mass + (singular || mass == 1 ? " milligram" : " milligrams");
  158. } else if (kg < 1) {
  159. let mass = round(kg * 1000,0);
  160. return mass + (singular || mass == 1 ? " gram" : " grams");
  161. } else if (kg < 5000) {
  162. let mass = round(kg,0);
  163. return mass + (singular || mass == 1 ? " kilogram" : " kilograms");
  164. } else if (kg < 5000000) {
  165. let mass = round(kg / 1000,1);
  166. return mass + (singular || mass == 1 ? " metric ton" : " metric tons");
  167. } else if (kg < 5000000000) {
  168. let mass = round(kg / 1000000,1);
  169. return mass + (singular || mass == 1 ? " kiloton" : " kilotons");
  170. } else if (kg < 5000000000000) {
  171. let mass = round(kg / 1000000000,1);
  172. return mass + (singular || mass == 1 ? " megaton" : " megatons");
  173. } else {
  174. let mass = round(kg / 1000000000000,1);
  175. return mass + (singular || mass == 1 ? " gigaton" : " gigatons");
  176. }
  177. }
  178. function metricSymMass(kg, singular=false) {
  179. if (kg < 1/1000) {
  180. let mass = round(kg * 1e6,0);
  181. return mass + " mg";
  182. } else if (kg < 1) {
  183. let mass = round(kg * 1000,0);
  184. return mass + " g";
  185. } else if (kg < 5000) {
  186. let mass = round(kg,0);
  187. return mass + " kg";
  188. } else if (kg < 5000000) {
  189. let mass = round(kg / 1000,1);
  190. return mass + " t";
  191. } else if (kg < 5000000000) {
  192. let mass = round(kg / 1000000,1);
  193. return mass + " kt";
  194. } else if (kg < 5000000000000) {
  195. let mass = round(kg / 1000000000,1);
  196. return mass + " mt";
  197. } else {
  198. let mass = round(kg / 1000000000000,1);
  199. return mass + " gt";
  200. }
  201. }
  202. function customaryMass(kg, singular=false) {
  203. let lbs = kg * 2.2;
  204. if (lbs < 1) {
  205. let mass = round(lbs * 16,0);
  206. return mass + (singular || mass == 1 ? " ounce" : " ounces");
  207. } else if (lbs < 2000) {
  208. let mass = round(lbs,0);
  209. return mass + (singular || mass == 1 ? " pound" : " pounds");
  210. } else {
  211. let mass = round(lbs / 2000,1);
  212. return mass + (singular || mass == 1 ? " ton" : " tons");
  213. }
  214. }
  215. function customarySymMass(kg, singular=false) {
  216. let lbs = kg * 2.2;
  217. if (lbs < 1) {
  218. let mass = round(lbs * 16,0);
  219. return mass + " oz";
  220. } else if (lbs < 2000) {
  221. let mass = round(lbs,0);
  222. return mass + (singular || mass == 1 ? " lb" : " lbs");
  223. } else {
  224. let mass = round(lbs / 2000,1);
  225. return mass + (singular || mass == 1 ? " ton" : " tons");
  226. }
  227. }
  228. function approxMass(kg, singular=false) {
  229. if (kg < 4500) {
  230. let mass = round(kg/1000,2);
  231. return mass + (singular || mass == 1 ? "car" : " cars");
  232. } else if (kg < 54431) {
  233. let mass = round(kg/6000,2);
  234. return mass + (singular || mass == 1 ? " elephant" : " elephants");
  235. //this unit almost never gets used and is mostly redundant, perhaps remove it if units are cleaned up
  236. } else if (kg < 10000000) {
  237. let mass = round(kg/54431.1,2);
  238. return mass + (singular || mass == 1 ? " tank" : " tanks");
  239. } else if (kg < 5.2e10) {
  240. let mass = round(kg/9.7e7,2);
  241. return mass + (singular || mass == 1 ? " aircraft carrier" : " aircraft carriers");
  242. } else if (kg < 1.5e13) {
  243. let mass = round(kg/5.2e10,2);
  244. return mass + (singular || mass == 1 ? " Great Wall of China" : " Great Wall Of Chinas");
  245. } else if (kg < 5e21) {
  246. let mass = round(kg/1.5e15,2);
  247. return mass + (singular || mass == 1 ? " New York City" : " New York Cities");
  248. //this figure includes a lot of underlying bedrock, just the city itself is 1.13587210581190e11 but I needed a good figure to fit in this spot
  249. } else if (kg < 6e23) {
  250. let mass = round(kg/4.6e20,2);
  251. return mass + (singular || mass == 1 ? " Australia" : " Australias");
  252. //this is a napkin math number based on the land area of Australia, 25km of height, and rough density of rock
  253. } else if (kg < 2e27) {
  254. let mass = round(kg/6e24,2);
  255. return mass + (singular || mass == 1 ? " Earth" :" Earths");
  256. } else if (kg < 1.4e39) {
  257. let mass = round(kg/2e30,2);
  258. return mass + (singular || mass == 1 ? " Sun" :" Suns");
  259. } else {
  260. let mass = round(kg/1.4e42,2);
  261. return mass + (singular || mass == 1 ? " Milky Way" :" Milky Ways");
  262. }
  263. }
  264. function metricLength(m, singular=false) {
  265. if (m < 1/100) {
  266. let length = round(m * 1000,2);
  267. return length + (singular || length == 1 ? " millimeter" : " millimeters");
  268. } else if (m < 1) {
  269. let length = round(m * 100,0);
  270. return length + (singular || length == 1 ? " centimeter" : " centimeters");
  271. } else if (m < 500) {
  272. let length = round(m,2);
  273. return length + (singular || length == 1 ? " meter" : " meters");
  274. } else {
  275. let length = round(m / 1000,1);
  276. return length + (singular || length == 1 ? " kilometer" : " kilometers");
  277. }
  278. }
  279. function metricSymLength(m, singular=false) {
  280. if (m < 1/100) {
  281. let length = round(m * 1000,2);
  282. return length + " mm";
  283. } else if (m < 1) {
  284. let length = round(m * 100,0);
  285. return length + " cm";
  286. } else if (m < 500) {
  287. let length = round(m,2);
  288. return length + " m";
  289. } else {
  290. let length = round(m / 1000,1);
  291. return length + " km";
  292. }
  293. }
  294. function customaryLength(m, singular=false) {
  295. let ft = m * 3.28084;
  296. if (ft < 1) {
  297. let length = round(ft * 12,0);
  298. return length + (singular || length == 1 ? " inch" : " inches");
  299. } else if (ft < 5280) {
  300. let end = customaryLength((ft - Math.floor(ft))/3.28084, singular);
  301. let length = Math.floor(ft);
  302. return length + (singular || length == 1 ? " foot" : " feet") + " " + end;
  303. } else {
  304. let length = round(ft/5280,1);
  305. return length + (singular || length == 1 ? " mile" : " miles");
  306. }
  307. }
  308. function customarySymLength(m, singular=false) {
  309. let ft = m * 3.28084;
  310. if (ft < 1) {
  311. let length = round(ft * 12,0);
  312. return length + "\"";
  313. } else if (ft < 5280) {
  314. let end = customarySymLength((ft - Math.floor(ft))/3.28084, singular);
  315. let length = Math.floor(ft);
  316. return length + "'" + " " + end;
  317. } else {
  318. let length = round(ft/5280,1);
  319. return length + " mi";
  320. }
  321. }
  322. function approxLength(m, singular=false) {
  323. if (m < 25) {
  324. let length = round(m/1.9,1);
  325. return length + (singular || length == 1 ? " person" : " people");
  326. } else if (m < 350) {
  327. let length = round(m/49,1);
  328. return length + (singular || length == 1 ? " football field" : " football fields");
  329. } else if (m < 20000) {
  330. let length = round(m/449,1);
  331. return length + (singular || length == 1 ? " Empire State Building" : " Empire State Buildings");
  332. } else if (m < 2000000) {
  333. let length = round(m/80467.2,1);
  334. return length + (singular || length == 1 ? " Panama Canal" : " Panama Canals");
  335. } else if (m < 3474574*2) {
  336. let length = round(m/3474574,1);
  337. return length + (singular || length == 1 ? " Moon" : " moons");
  338. } else if (m < 12.742e6*130) {
  339. let length = round(m/12.742e6,2);
  340. return length + (singular || length == 1 ? " Earth" : " earths");
  341. } else if (m < 149.6e12) {
  342. let length = round(m/149.6e9,3);
  343. return length + (singular || length == 1 ? " AU" : " AUs");
  344. } else if (m < 9.4607e22) {
  345. let length = round(m/9.4607e15,3);
  346. return length + (singular || length == 1 ? " light year" : " light years");
  347. } else if (m < 5e26) {
  348. let length = round(m/9.4607e21,3);
  349. return length + (singular || length == 1 ? " galaxy" : " galaxies");
  350. } else {
  351. let length = round(m/4.40e26,3);
  352. return length + (singular || length == 1 ? " universe" : " universes");
  353. }
  354. }
  355. function metricArea(m2, singular=false) {
  356. if (m2 < 1/10) {
  357. let area = round(m2 * 10000,2);
  358. return area + (singular || area == 1 ? " square centimeter" : " square centimeters");
  359. } else if (m2 < 100000) {
  360. let area = round(m2,2);
  361. return area + (singular || area == 1 ? " square meter" : " square meters");
  362. } else {
  363. let area = round(m2 / 1e6,2);
  364. return area + (singular || area == 1 ? " kilometer" : " square kilometers");
  365. }
  366. }
  367. function metricSymArea(m2, singular=false) {
  368. if (m2 < 1/10) {
  369. let area = round(m2 * 10000,2);
  370. return area + " cm" + "2".sup();
  371. } else if (m2 < 100000) {
  372. let area = round(m2,2);
  373. return area + " m" + "2".sup();
  374. } else {
  375. let area = round(m2 / 1e6,2);
  376. return area + " km" + "2".sup();
  377. }
  378. }
  379. function customaryArea(m2, singular=false) {
  380. let ft2 = m2 * 3.28084 * 3.28084;
  381. if (ft2 < 1) {
  382. let area = round(ft2 * 144,0);
  383. return area + (singular || area == 1 ? " square inch" : " square inches");
  384. } else if (ft2 < 5280 * 5280 / 10) {
  385. let area = round(ft2,1);
  386. return area + (singular || area == 1 ? " square foot" : " square feet");
  387. } else {
  388. let area = round(ft2 / 5280 / 5280,1);
  389. return area + (singular || area == 1 ? " square mile" : " square miles");
  390. }
  391. }
  392. function customarySymArea(m2, singular=false) {
  393. if (m2 < 1/10) {
  394. let area = round(m2 * 10000,2);
  395. return area + " in" + "2".sup();
  396. } else if (m2 < 100000) {
  397. let area = round(m2,2);
  398. return area + " ft" + "2".sup();
  399. } else {
  400. let area = round(m2 / 1e6,2);
  401. return area + " mi" + "2".sup();
  402. }
  403. }
  404. function metricVolume(m3, singular=false) {
  405. if (m3 < 1/1000) {
  406. let volume = round(m3*1e6, 0);
  407. return volume + (singular || volume == 1 ? " milliliter" : " milliliters");
  408. } else if (m3 < 1) {
  409. let volume = round(m3*1000, 1);
  410. return volume + (singular || volume == 1 ? " liter" : " liters");
  411. } else if (m3 < 1000000) {
  412. let volume = round(m3, 0);
  413. return volume + (singular || volume == 1 ? " cubic meter" : " cubic meters");
  414. } else if (m3 < 1e12){
  415. let volume = round(m3/1e9, 3);
  416. return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers");
  417. } else {
  418. let volume = round(m3/1e9, 0);
  419. return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers");
  420. }
  421. }
  422. function metricSymVolume(m3, singular=false) {
  423. if (m3 < 1/1000) {
  424. let volume = round(m3*1e6, 0);
  425. return volume + " mL";
  426. } else if (m3 < 1) {
  427. let volume = round(m3*1000, 1);
  428. return volume + " L";
  429. } else if (m3 < 1000000) {
  430. let volume = round(m3, 0);
  431. return volume + " m" + "3".sup();
  432. } else if (m3 < 1e12){
  433. let volume = round(m3/1e9, 3);
  434. return volume + " km" + "3".sup();
  435. } else {
  436. let volume = round(m3/1e9, 0);
  437. return volume + " km" + "3".sup();
  438. }
  439. }
  440. function customaryVolume(m3, singular=false) {
  441. let gallons = m3 * 264.172;
  442. if (gallons < 1/16) {
  443. let volume = round(gallons*128,0);
  444. return volume + (singular || volume == 1 ? " fluid ounce" : " fluid ounces");
  445. } else if (gallons < 1/4) {
  446. let volume = round(gallons*16,1);
  447. return volume + (singular || volume == 1 ? " cup" : " cups");
  448. } else if (gallons < 1/2) {
  449. let volume = round(gallons*8,1);
  450. return volume + (singular || volume == 1 ? " pint" : " pints");
  451. } else if (gallons < 1) {
  452. let volume = round(gallons*4,1);
  453. return volume + (singular || volume == 1 ? " quart" : " quarts");
  454. } else if (gallons < 100) {
  455. let volume = round(gallons,1);
  456. return volume + (singular || volume == 1 ? " gallon" : " gallons");
  457. } else {
  458. let volume = round(gallons,0);
  459. return volume + (singular || volume == 1 ? " gallon" : " gallons");
  460. }
  461. }
  462. function customarySymVolume(m3, singular=false) {
  463. let gallons = m3 * 264.172;
  464. if (gallons < 1/16) {
  465. let volume = round(gallons*128,0);
  466. return volume + " fl oz";
  467. } else if (gallons < 1/4) {
  468. let volume = round(gallons*16,1);
  469. return volume + (singular || volume == 1 ? " cp" : " cps");
  470. } else if (gallons < 1/2) {
  471. let volume = round(gallons*8,1);
  472. return volume + " pt";
  473. } else if (gallons < 1) {
  474. let volume = round(gallons*4,1);
  475. return volume + " qt";
  476. } else if (gallons < 100) {
  477. let volume = round(gallons,1);
  478. return volume + " g";
  479. } else {
  480. let volume = round(gallons,0);
  481. return volume + " g";
  482. }
  483. }
  484. function approxVolume(m3, singular=false) {
  485. if (m3 < 2/10000) {
  486. let volume = round(m3*4e5,0);
  487. return volume + (singular || volume == 1 ? " shot" : " shots");
  488. } else if (m3 < .1) {
  489. let volume = round(m3*2254,1);
  490. return volume + (singular || volume == 1 ? " glass" : " glasses");
  491. } else if (m3 < 100) {
  492. let volume = round(m3*2.64,1);
  493. return volume + (singular || volume == 1 ? " bathtub" : " bathtubs");
  494. } else if (m3 < 1e5) {
  495. let volume = round(m3/1000,2);
  496. return volume + (singular || volume == 1 ? " Olympic swimming pool" : " Olympic swimming pools");
  497. } else if (m3 < 1e9) {
  498. let volume = round(m3/3.2e5,2);
  499. return volume + (singular || volume == 1 ? " oil tanker" : " oil tankers");
  500. } else if (m3 < 1e15) {
  501. let volume = round(m3/1.8919e10,3);
  502. return volume + (singular || volume == 1 ? " Great Salt Lake" : " Great Salt Lakes");
  503. } else if (m3 < 1e20){
  504. let volume = round(m3/3.547e17, 3);
  505. return volume + (singular || volume == 1 ? " ocean" : " oceans");
  506. } else if (m3 < 1e25){
  507. let volume = round(m3/1e21, 3);
  508. return volume + (singular || volume == 1 ? " Earth" : " Earths");
  509. } else {
  510. let volume = round(m3/1.4e27, 3);
  511. return volume + (singular || volume == 1 ? " Sun" : " Suns");
  512. }
  513. }
  514. function makeSphere(input=0, diameter=false) {
  515. if (diameter = true) {
  516. input = input/2;
  517. }
  518. return (4/3)*Math.PI*(Math.pow(input, 3));
  519. }
  520. function breakSphere(input=0, diameter=false) {
  521. let output = math.pow((3*input)/(4*Math.PI), 1/3)
  522. if (diameter=true) {
  523. output = output*2;
  524. }
  525. return output;
  526. }