sourcehypertextpublicheximalen.pug

//- meta
	slug: heximal
	title: Heximal

extends ../../views/layout.pug

append presets
	- hasSidenotes = true

mixin xn(num)
	if block
		strong.heximal.numeric
			block
	else
		strong.heximal.numeric= num

mixin x(num)
	if block
		strong.heximal
			block
	else
		strong.heximal= num

mixin dn(num, brackets)
	if block
		i.decimal.numeric
			block
	else
		i.decimal.numeric= num

mixin d(num)
	if block
		i.decimal
			block
	else
		i.decimal= num

mixin decexp(base, power, brackets, hover)
	- let bracks = ['', '']
	if brackets
		- bracks = ['(', ')']
	if hover
		i.decimal.numeric
			| #{bracks[0]}
			abbr(title=`${hover}`) #{base}×10#[sup #{power}]
			| #{bracks[1]}
	else
		i.decimal.numeric #{bracks[0]}#{base}×10#[sup #{power}]#{bracks[1]}

append cosmetics
	link(href="/heximal/heximal.css", rel="stylesheet")

block header
	h1 Heximal #[small Or, how to #[em really] read hexadecimal]

block content
	p Many debates have been had about the “correct” way to pronounce hexadecimal numbers. (If you ask me, you should just stick to the standard and go with the Nato spelling alphabet: alpha, bravo, charlie…) But what if you don’t want to just #[em read] hexadecimal? What if you want to… count?

	p A great number of brave souls have tried, but more often than not, their attempts turn out utter nonsense. #[i Christeen], #[i dickety-one], and #[i fimteek] are just some of the horrors found in existing ideas for hexadecimal numbering. Armed with inspiration from the base-6 #[a(href='https://www.seximal.net') seximal], i set out to make a better system. Introducing: #[strong heximal].

	+h2('Counting from 1–F')

	p Counting from #[+xn 0]#[+sn('0')] to #[+xn C] is easy:

	+sn('0')
		p I’ll be using #[+x glowing green text] to indicate heximal numbers, with #[+d darker italics] for their decimal#[+sn('1')] equivalents.

	+sn('1')
		p It’s technically meant to be “denary”, but who’s counting?

	+table
		thead
			tr
				th Number
				th Word
		tbody
			tr
				td: +xn 1
				td one
			tr
				td: +xn 2
				td two
			tr
				td: +xn 3
				td three
			tr
				td: +xn 4
				td four
			tr
				td: +xn 5
				td five
			tr
				td: +xn 6
				td six
			tr
				td: +xn 7
				td seven
			tr
				td: +xn 8
				td eight
			tr
				td: +xn 9
				td nine
			tr
				td #[+xn A] #[+dn("(10)")]
				td ten
			tr
				td #[+xn B] #[+dn("(11)")]
				td eleven
			tr
				td #[+xn C] #[+dn("(12)")]
				td twelve
	
	p Where we go from here is a challenge. Given that this is base #[+d sixteen], we can’t exactly say #[i #[+d thirteen]], #[i #[+d fourteen]], or #[i #[+d fifteen]]; instead, we can shorten the letters of the Nato spelling alphabet: #[+x del] from #[i delta], #[+x eck] or #[+x ech]#[+sn('2')] from #[i echo], and #[+x fox] from #[i foxtrot].

	+sn('2')
		p “Eck” can get confusing when mixed in with all those hex-es and sex-es; #[i ech] is thus provided as an alternative, said with the hard #[i ch] sound of #[i loch] and #[i Channukah].

	+table
		thead
			th Number
			th Word
		tbody
			tr
				td #[+xn D] #[+dn(`(13)`)]
				td del
			tr
				td #[+xn E] #[+dn(`(14)`)]
				td eck #[i or] ech
			tr
				td #[+xn F] #[+dn(`(15)`)]
				td fox

	+h2('10 to FF')
	
	p #[+xn 10] is called #[+x hex], and as in any sensible system, right after that comes #[+x hex-one].

	+table
		thead
			th Number
			th Word
		tbody
			tr
				td #[+xn 10] #[+dn('(16)')]
				td hex
			tr
				td #[+xn 11] #[+dn('(17)')]
				td hex-one
			tr
				td #[+xn 12] #[+dn('(18)')]
				td hex-two
			tr
				td #[+xn 13] #[+dn('(19)')]
				td hex-three
			tr
				td(colspan='2' lang='la')
					i Et cetera…
			tr
				td #[+xn 1F] #[+dn('(31)')]
				td hex-fox
	
	p Numbering continues along the same lines as decimal’s #[i #[+d('-ty')]], with the relevant suffix being #[i #[+x('-ex')]].

	+table
		thead
			tr
				th Number
				th Word
		tbody
			tr
				td #[+xn 20] #[+dn('(32)')]
				td twennex
			tr
				td #[+xn 21] #[+dn('(33)')]
				td twennex-one
			tr
				td #[+xn 30] #[+dn('(48)')]
				td thirtex
			tr
				td #[+xn 40] #[+dn('(64)')]
				td fourex
			tr
				td #[+xn 50] #[+dn('(80)')]
				td fiffex
			tr
				td #[+xn 60] #[+dn('(96)')]
				td sixex
			tr
				td #[+xn 69] #[+dn('(105)')]
				td sixex-nine#[+sn('3')]
			tr
				td #[+xn 70] #[+dn('(112)')]
				td sevenex
			tr
				td #[+xn 80] #[+dn('(128)')]
				td eightex
			tr
				td #[+xn 90] #[+dn('(144)')]
				td ninex
			tr
				td #[+xn A0] #[+dn('(160)')]
				td tennex
			tr
				td #[+xn B0] #[+dn('(176)')]
				td elevex
			tr
				td #[+xn C0] #[+dn('(192)')]
				td twelvex
			tr
				td #[+xn D0] #[+dn('(208)')]
				td deltex
			tr
				td #[+xn E0] #[+dn('(224)')]
				td eckex #[i or] echex
			tr
				td #[+xn F0] #[+dn('(240)')]
				td foxex
			tr
				td #[+xn FF] #[+dn('(255)')]
				td foxex-fox
	
	+sn('3')
		p Yes, you #[em do] have to call it this when using heximal.
	
	+h2('Higher and higher')

	p The logical term for a value of #[+xn 100] is — what else? — a #[+x byte].

	+table
		thead
			tr
				th Number
				th Word
		tbody
			tr
				td #[+xn 100] #[+dn('(256)')]
				td one byte
			tr
				td #[+xn 3E8] #[+dn('(1000)')]
				td three byte eckex-eight
			tr
				td #[+xn 7E7] #[+dn('(2023)')]
				td seven byte eckex-seven
			tr
				td #[+xn 1000] #[+dn('(4096)')]
				td hex byte
			tr
				td #[+xn 2710] #[+dn('(10,000)')]
				td twennex-seven byte hex
	
	p Programming languages which particularly concern themselves with memory like to call any number below #[+xn 10#[sup 4]] a #[+x short], a term we’ll appropriate for our own evil purposes.

	+table
		thead
			tr
				th Number
				th Word
		tbody
			tr
				td #[+xn 1,0000] #[+dn('(65,536)')]
				td one short
			tr
				td #[+xn F,4240] #[+decexp('1.00','6',true,'1 million')]
				td fox short fourex-two byte fourex
			tr
				td #[+xn 10B,000] #[+decexp('1.75','7',true,'17.5 million')]
				td one byte twelve short#[+sn('4')]
			tr
				td #[+xn 13C9,0000] #[+decexp('3.32','8',true,'332 million')]
				td hex-three byte twelvex-nine short#[+sn('5')]
			tr
				td #[+xn 3B9A,CA00] #[+decexp('1.00','9',true,'1 billion')]
				td thirtex-eleven byte ninex-ten short…
	
	+sn('4')
		p The total population of the Netherlands.
	
	+sn('5')
		p The total population of the United States.
	
	p Building upon #[i #[+x short]] in the manner of decimal’s #[i #[+d -illion]] series, we can reach some truly dizzying mathematical heights…

	+table
		thead
			tr
				th Number
				th Word
				th In decimal
		tbody
			tr
				td: +xn 10#[sup 8]
				td one bort
				td: +decexp('4.29','9',false,'4.29 billion')
			tr
				td: +xn 1.DF×10#[sup 8]
				td one bort, deltex-fox byte short#[+sn('6')]
				td: +decexp('8.03','9',false,'8.03 billion')
			tr
				td: +xn 10#[sup C]
				td one trort
				td: +decexp('2.80','14',false,'280 trillion')
			tr
				td: +xn 10#[sup 10]
				td one quadrort
				td: +decexp('1.84','19',false,'18.4 quintillion')
			tr
				td: +xn 2.58×10#[sup 10]
				td two quadrort, fiffex-eight byte trort#[+sn('7')]
				td: +decexp('4.33','19',false,'43.3 quintillion')
			tr
				td: +xn 7.F8×10#[sup 13]
				td seven byte fox-eight quadrort#[+sn('8')]
				td: +decexp('6.02','23',false,'602 sextillion')
			tr
				td: +xn 10#[sup 14]
				td one quinort
				td: +decexp('1.21','24',false,'1.21 septillion')
			tr
				td: +xn 10#[sup 18]
				td one sexort
				td: +decexp('7.92','28',false,'79.2 octillion')
			tr
				td: +xn 10#[sup 1C]
				td one septort
				td: +decexp('5.19','33',false,'5.19 decillion')
			tr
				td: +xn 10#[sup 20]
				td one octort
				td: +decexp('3.40','38',false,'340 undecillion')
			tr
				td: +xn 10#[sup 24]
				td one nonort
				td: +decexp('2.23','43',false,'22.3 tredecillion')
			tr
				td: +xn 10#[sup 28]
				td one decort
				td: +decexp('1.46','48',false,'1.46 quindecillion')
			tr
				td: +xn 10#[sup 2C]
				td one elevort
				td: +decexp('9.58','52',false,'95.8 sexdecillion')
			tr
				td: +xn 10#[sup 30]
				td one dozenort
				td: +decexp('6.28','57',false,'6.28 octodecillion')
			tr
				td: +xn 10#[sup 34]
				td one deltort
				td: +decexp('4.11','62',false,'411 novemdecillion')
			tr
				td: +xn 10#[sup 38]
				td one eckort #[i or] echort
				td: +decexp('2.70','67',false,'27 unvigintillion')
			tr
				td: +xn 10#[sup 3C]
				td one foxort
				td: +decexp('1.77','72',false,'1.77 trevigintillion')
			tr
				td: +xn 10#[sup 40]
				td one hexort
				td: +decexp('1.16','77',false,'116 quattuorvigintillion')
			tr
				td: +xn 10#[sup 44]
				td one hexishort
				td: +decexp('7.59','81',false,'7.59 sexvigintillion')
			tr
				td: +xn 10#[sup 48]
				td one hexibort
				td: +decexp('4.97','86',false,'497 septemvigintillion')
			tr
				td: +xn 10#[sup 80]
				td one bihexort
				td: +decexp('1.34','154',false,'13.4 quinquagintillion')
			tr
				td: +xn 10#[sup C0]
				td one trihexort
				td: +decexp('1.55','231',false,'1.55… septemseptuagintillion?')
			tr
				td: +xn 10#[sup 100]
				td one quadrihexort #[i or] one hexgol
				td: +decexp('1.80','308',false,'180 thousand centillion')
			tr
				td: +xn 10#[sup 400]
				td one bytort
				td: +decexp('1.04','1233',false,'Beats me, mate.')
			tr
				td: +xn 10#[sup 4000]
				td one hexibytort
				td: +decexp('2.00','19,278',false,'Do you think God stays in heaven because he, too, lives in fear of what he’s created?')
	
	+sn('6')
		p The total population of the whole world (give or take).
	
	+sn('7')
		p The number of ways you can scramble a Rubik’s cube.
	
	+sn('8')
		p #[a(href='https://en.wikipedia.org/wiki/Avogadro_constant') Avogadro’s number]: the amount of atoms in just #[+d twelve] mere grammes of carbon.
	
	p I’ve decided to end the naming scheme just short (heh) of what would otherwise be a "shortort", to save it from collapsing in on itself. This means that the largest named number is… [#[i inhales]]

	+table
		thead
			tr
				th Number
				th Word
				th In decimal
		tbody
			tr
				td: +xn 10#[sup 40,000]−1
				td foxex-fox byte foxex-fox foxihexifoxibytifoxihexifoxort, foxex-fox byte foxex-fox foxikayfoxibytifoxihexeckort, […] foxex-fox byte foxex-fox
				td: +decexp('6.74', '315,652', false)

	p …Oh, go on then. Two more.

	+table
		thead
			tr
				th Number
				th Word
				th In decimal
		tbody
			tr
				td: +xn 10#[sup 10#[sup 100]]
				td One hexgolplex
				td: i.decimal.numeric 10#[sup 2.16×10#[sup 308]]
			tr
				td: +xn 10#[sup 10#[sup 10#[sup 100]]]
				td One hexgolplexian
				td: i.decimal.numeric 10#[sup 10#[sup 2.16×10#[sup 308]]]

block timestamps
	ul.footer-timestamps
		li #{tr('pan.pageHistory.created')(pageCreated).replace(/[0-9]+/g, match => parseInt(match).toString(16).toUpperCase())}
		if pageTranslated 
			li #{tr('pan.pageHistory.translated')(pageTranslated).replace(/[0-9]+/g, match => parseInt(match).toString(16).toUpperCase())}
		if pageUpdated
			li #{tr('pan.pageHistory.updated')(pageUpdated).replace(/[0-9]+/g, match => parseInt(match).toString(16).toUpperCase())}