From 58ca75a9bfe2047f4073497c754f993a8ff5d8de Mon Sep 17 00:00:00 2001 From: Zachary Vance Date: Sat, 20 Dec 2025 20:23:46 -0500 Subject: [PATCH] Minecraft villagers --- images/villager-gui.png | Bin 0 -> 33382 bytes posts/minecraft-villagers.md | 187 +++++++++++++++++++++++++++++++++++ posts/shaders.md | 2 +- 3 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 images/villager-gui.png create mode 100644 posts/minecraft-villagers.md diff --git a/images/villager-gui.png b/images/villager-gui.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f490358aa9e45230675a757cc4792a0383bd87 GIT binary patch literal 33382 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

Ny31s!!$#Qm3-bft zPo*XnOQ6^Dss#s|;!uB}wQxC;CVh*eHojeK&M8MZEe;wra66TLz3Gd{2YE(c6J~(8{cK%P|`kGkl0v>eT|ihcSqOjEAEIu8x(oSQG8raEfVZa$k5dv!*Cbh1NnLH zUpod~xe#}ZK`iz4Yv?%`gD>2go6(`HLzIx*A;j9w3@k-yExITCVL$Q278#0LEm8gQeU=o5zguO9j-yG3Os-aT${RtO%&To1PM@#c} z&wDC#9(CXf#|0IQ{v9p|hSvYUQKf|Yx!GZZ%dwZSPFSPKoLAco;>epO!}ZWzuiA#a zg*6dJkfN4hiy~yp>pq|rRKSTJucK!V!&TVq&4O%Au zizxT$BXCWGMn@S#;T7*m7Z(~gsuf{-$AO%SjUJ?nIv;C^ zr;^W)H?Mck18Lm13pk#R7YN)g zMW6e;P<{%5BOn|X9s>4WL4wo4hFCK(>OtmI<4KZ2A$&8hk^b(#E81Hy?DZy4F` z`ml^-9^k^$u|A9!kx`@4UqDH*i035*B_rc7M1NDoASTXJ*p#q10j4+GuALqTO^2o~ zn*Vs(%3SIsWbr)nJ{?>*t>}93eO16UZCN*MdMJPDsyHs+jQ;7}5W)a43y{Da#n7N@ zzKkE2ty-=I7?<&HV1Jk}kzHoOy?-`3(N8)E9hj@*9#3yqzp`IY{8Y#HHIYVfjtASu}RBbiRL`Y+DL*f6v7 z6mluanME&%>hTXcR3ak5GoXkKl%Ft))CTKFDn|phn{778uM=g! zW2^~|R(cGFV6ihB>IK~OZO4a*UZ6l<)_6@fLwMsUKwDe%Fj%l zyC0nH)YfuK+ErnaiBT9dZ)8hRX0zIzp(JT~8X-X=w0w7qS`I01wQ9V-Jhwt_pzYmy zxva?vV$t6z%)#kPrn3vVMvVr$gasyMBj+QlJvM2~E#xK(nunV&5`gL$jQ3e$q7{YF zpPq-C7lTTIrJ8iqcAJTr2K|HxV2p#%%e^%gEJnj@Sjnf-XXX=tyBU|^BbLtw=B?{Y zr*N{}_hH(MOuOvIY)P*1yTC0)W~iJXiRNRzfvE&l#*Fn@o_MkXbe834RSmI!{A!F^ z$u{P`N3vv)1rMiTM`~GS^|L348Q({CL7w(N0d;Mq+FpS?zv5_#V10;!z_H- z_W=%frp>Ws^=$H-cZ~peq}zGbs?QA^42)9jpea z5!cOuRYiv-4%bO|H+twyQZIuMN+PMpjR^p~vBujVV=ngag9Kgm1+}9l_b^+^lf%|! zMcZC-lJm9}MsNLm!wbO&eZQH}l)TXo=ioo69>$*!_faG<_j2p47 zqC5(U&^uPku1nR1l3tKLQ&WIONI|j{IdBfknRg+df5&adryq45%)%+|)Ttei?X_BO z0%!P!%VE3tVP&m3-Ey{~(U=PDUW0#6*W&v3O3J_X;BC^e`^dM_gK_1RB~-#SEuLm? zSdrI>U(lHr8{px3b2GPdpB30cUOun_%VDqn3`iq<5d1|(M~=7A1`bh-F_evd*=Pp8 zky?eVrPI|p(i@2qk#|PGq|FCiF_Frm4;Nh0%=|$VXzofJt@9XzZU3ml&@+q2))tRv z+j%SgP=+bB;Z6rxT(Y93+9%5HI+0t%-k;X360VV*sM%6GZlZp;R$CUjt)G6I1-1G- zZu`{rz%HS?Gc%Y?GW0xLN?6`dOR+y5<>CBk0q|m zRBiZZ#)r6M?Iq);?bJge_SGwO`+2wH@(6*g(>n|X1i+QuC}RYHX`%`J)9Eh*H_rf?}N00 zRDQb$^-&D;tP?#ok5g-tQ<8^Xz-z0`D8*KwS&|z6`PR?f?z@zq7?HxNiK7}WWqMqC ziJjW{$~|z`V=V%hPIt)6-=@u3`d-q0xpY`=oKtI&InO=UF)WP`A|+q$@04;Bn#^RB zXB-e5Nno~HLQ+8bqhQhNp1{ZvBMOgOfd_q)+H90+?}k<4i82|ySa`3g6rS^rv4eHl zwAZTJ{qp>mK%GbP8W&g;SAW99|ok6B! z>umarJ%EVwe1ysB*;6gLFC*gV@ww9amvqSW?}_a7ArgzINhDt4U{+$%T$-@4v0%m@ z&Q+VxxGuB7$^3OoiJqg<$oq#mE}vIAV_T1c4lH`uXs(!`TY&wI4uERRlGO(33g>zA zDH%D3xn7dyUwvKY>MN$lS)&-f5De(kXB8wIx6&*zVLk*4^8Sc2X2ncH{YTh#Pr%WZn!;*0sIawBN{^1{(mE>jWuM0bV(%jCtiUueS^t~5w zZx;%o+|IU&-rQQUM&84NgEt3^d>NX8us*gXcL!@a`{ z3&y)w>GEN7riDrvDK#@h9pI?)NiDZY48ajKeABsI)8hX1K=9D4yy&344Tx|4F@Baf zt^4Nllj#o~Z2XDa<$945;q!G)o%-TopR&I_j;ALeo}OOeQy)`;#--Q_plkI-3o8FY!7gs!?)0| zcZS2xz9jATE7puB=DvCuuYQV{@U@JGs_=|fAHtO0;EozRCOm@+-?Nm(*!kmoF) zfXo`{NomUok6fz};~_UpK|#l5T-gM!@`lkiGLOdsQDnaQ0 z&M!Nh_nF_b)-kFMGPJ{Fjszy`SJp%SWK+ zBI$)+|6q&Czv}1cHobJeo=g5teE&5V)8Nqa)ZCx&B&*;CEU?h#tQ8+dGjQH}ysf#l z$YN^*e7eQ}Ry_0L*t(~3A1KXcM;JKU7d#7^zeGWW;<3%6I`2m5*ZgC90Kbup#|evA z3e4bAIwxgS0q(^-#4IgzKP94H9P6r{AHi+%Oe)+t^V`oawYTK7gvQLJLQP-=F8k-p zj^34{=RKR_MQzd=+YO0V+J8?iJ(?RYrCy_}w?vv6hkDmgGHHdvmWm9qFm-ucCz;mQ zr-#{=+Yg>G@Gwhs;pX#1LebYsI?E|0D9&k#EO|y$41Qj#ATcUsEBx~VK*BI7& z(YKYkrCG`<$rhi;{ZdjgXA1++QQ&CI99{|B0nBm^7&egRJM>{7P$mWGTH#znfsf!6 zvA?ji(GlMgp{{3}yvA4?{#x|P+jKw`-sREA+DxDJQ^oe!kkG zahajosM``kJ%SN%A>)ZrlcJG@?g$H$0(hr0(j&`V72~O;mSU7eu}l3`E0Q#r7JER{ zmAEbHaJO-f-+TMRu3HCD7WU`6S<~711^;Z8>-X*Hp@0jqmyWR{enO&vE}>DaJ-;6Q zdjBs0ub{^4*bqUGUo*VZZxPE*6I(kbg`D~42tv~dH}d;72mAdUXN2fn)T&fC)4BLD|>` z!a)TdFpEHMJmpch1sw&we7|}({u)IcMZ9nF=~Y=wF*0Id%-_h0BH*z3lqbbu0!Gfn zuq5q{2mMj!Ure7!gHaV9M8?Fj^LiTdkivNuln6E_9!=Z|o@nEpxCJ_YWs;_H1K|hso{K^o8E1Q5dVw_7;&#@Kkju z{M??6n7TQpo4jf~B0s;~0dVurx&H3%!c_^SW=76eQo^qF#kzk*uv`}!oMgqOlFX)O zJ||i;JEwVUWXJ_RtS_XWg+b^;Nv|IpS@exHc`U#TA91|y2 zH*3NI+cqB|K0EAn-yNWxpKoxD96XCdpy6a6`vj0YK1P<~?-z}-zq@|Kx0eqD4hUlI znyFwF1tLO$auZHvqJ>taInSym@u&4v$VlUbtx*~!$}JLZY?u4DLG~DL>8YsPm3x1o zgy$?dYU&jb>d>J%GUvZ^+Y3q-$gYZDJ8 za{P^;YnblQU0z#Ga@TAQ7RykY#(aTVl7(9xem4_a;omBQJ{Sxx{b1jp&c&3QjJDRl zO=&IUn5t z1vBc)*->v`W4pOMR_wT8GgvCL-Dt`EgZF@$y5?p`elLAu$e%bI!;2A+%f=F8s=XB)U zv*7<(a!3)Q%)ZRn%gP|&N(f|Pk0S+AoA~P1QEHyA?5*r4U4y=GAz94 z(JRUmic*s2ev#SXD@?^9r56$(JmK+!Ohe!xGY?T^C>z`#Kp(c$t_a{;e9Ti+6-^E1 z((QByokpJ84w}ve_bh&EXe;nvOfGb`b^d+FZ6#1%B-;I=8?vgkFMT1a7tC(2ZKUStj^S^QqNXm?u_qIxe`R0hT3#neK!M!V(w=g=D&r=YumaFp!&FRz^ijPk(1CJi)u>Y_FiLrw3J0Ku1S+>+Y(h-D(ed ze}At}oZZ&O^+*gy-S78wp;?QxS#W=MG;#675A1$6j{!QF(bCe|i%*!uS#xvN=J0x; zZbFP-qub>1bZXzE+dKAmF*GzZe8`#Dah8Yv(Vqt;0eYWn|?uYN;(6swrUn z8KeG?(A3fSfj>1q4(nnsqTl@VIx`JxQl%F0{V-`eZZsb!%}GQplj@Tjoq2igy#`f$ zVEUezxf0&I`Hd_WF2n*lcqO9ceh-n+HwNboZL^ zn+HxvWeOMLb0`;H?-%4020ciqQDFUZt-R)X%8mD0C>n*F|9J<{CyqB;*?C%f+Tc`X zjijP$?fB(|GYi|S)_ZEltcfE0|F zyMKX1%w2Wx4h@gDa<)5eM_rwwu%Qjuw0>J4r`5Z4f-vX%ffd0_WuQ$1Az4jAzCvkD zBBEG!VtsJF`N`<-wE%%K5kSxR#ix9`+rQ=O%Ntpt@`FIGjn%rrr=a!a85z`u+T-Op znq?k>nRO^7K?&=U!mfjN!>4GQcraH5uOsWYvzz#6reQ3JQ(%&=s&;^5I5mBj4BsfS z494|k7)u%L;wFlzn0$2)*GNY8|NX5WY8T1G)`z%*Wn>uuoY}*R5Io-hzX3OxUS{?4 z+Q_1N;L%|$ob-4K=nld|FhihBrNiD>hujRToX2FWIlRm?^I;Od z9Al^3IS1eMtpMJU|3zTk{1QjRAh20B2OPKPy*F^`G`4{^ay)e3vNnil3HsArXA}`O z{wQ=Iyg!V|SO;6}6A$wcX3+1(+ZkrxT?6n0AuLx|<(&*ya)ny8)*f%13faNGpcMS* z%MR|Uug?z*1P5y9FkF0mY$)j(*H>5VOYMQ;rea6W(s?knmZyOlu2hJ&zl?oy;gRb6Kq3R4sq6@|dZ z%S)LvLz6IOZfGb>>j)Q1?7&8TPoi+_$d&Y)Y*^Mtf!p1~1LaGlLiJ~aSc|6Y@!09> z*Oywwl2XH(3U^irAq)Mki><93#Ov>(e7TYWW9D##1rL&Qa*>b-Yxapg^XccQsi@@S zWEDzu75bFhnMgR0nMviA4b>{O0nCSArY&c{H4POVQO~v%FTSo24F!)@kR2r>{0{E# zf+%H;eOF23K)us zo5|ibVtiqDw^`J2tcEh}N<=~$(;Le`$XXTxd#A_)=$%nxDJZ_{+@7e*A%w6l1?dA) z!(wv(w#Au~?tjm`_k^xNrl6^?KGWl>z)0tS50%2HF6dlx9L!EUhj#c}O}po)1!`wZ z6$9($+q6w%0&$?pW*p1@t`c!;I*ATy6Ps^--lq4I410DRN23xK@9^qQWK+;bX7X?# zLsNdr)zocVV!?Iof(@Ks;PBG#gUxUnqmt zT}QZMlSV?4zZ((e92&qtG7kgW9VSUZ`9eaHmHXepfdAXUc)>CznC>z>X)ENz5TVOX z2Zcb&F~ZkeeY``gNo50u@)Z@AFZspY(%p#>1I5rsB6i=jzk3|6wgztMs)3uWItFf` zZ1_1QE4`@5=lqs~W~WA=wAZl5;Y4CImo5DoYuHz9Wuw`aw_&mfKzWegXc4c*^&e%;QR40 zrKE9hUpMhiv}W2Xvtf*&QG$I*y9hl@=MW#3by>Q!?sJ)4Nl8x?5*LSFeYlO{5N>O zAaU0a&z(47j8vyaysDOW77J{ran?$0gX zo=^ruPosf!xe^Fyhg|MpB%GU{J7afstL}R+ds=wf-!^lHuXoc3B^wY?$n6E{$_pYzwtMY`5VTJ zSPFF-g};l0j~v(j8B_}A30}HpG;h!~{h=e+p_ZUeDbTHvs95@k6BPn2!JktyXKq~i zr;0h$CJ^Zc$ntpu@c}LmbNLIWVN<}xvFOngfu5=B{gZ#nl%;&h5*1IQrL}a(%RmQC zqf8~=v&+`oy=P~27v-V}NskzAI^MMde+uB#zH@!zSZCO>5j729;meV~1IlL_wB`+K z8URj$n3FFix`cz9DP<{fWg|&T7zYU&@ z?9yt+=p5|Sy0b7GWibSjm--tz^UC4i>d5eLa^~)Uco2g*)gG9LVi=ycpBm1xt984d zbQZ!y7OUv&$k4NmY0OzWbQEbaeF2%FuE$?~V>>*PqxYLm*-qJBS4Wv#d*lAc06-nS ztU+dax?ypgRA(B!rm`{`*(C5AJC4G;?JLU5$S7znJQCn&zap*KIttYkLuV+vWyXws z6?78%$DIrjDPB`VByhsCftK6AVdC$QA(?fT?aK~Oy=4rRx33Ci?P|?)1)aCch z->&5W+$`QW*1DG#6a)@2Yinq54g@gp!~IbQ?w}`oD5#Vn?F3R|fUL>E#!1R;yPa+X zf@`N}?M4hvBFN z>wCW*#UVMc=#V4EhU?3}LR|lBG)C6Bw_m8}L{1#h-)nCUF7Y_`8gwu=9P50NRrW}x zt=mSd{6xhB8iqD?QTZ-Ic7*b#YaZ}8-us)>^2$1@Gg?tp^S|iG;SD*j} z42V~Oj-V+k z0}M6GmEk1m8T7iH*Q}Q{9iFdr?nG5E;IRG*c-)cJ`yC7;nDqh6ki4EQ(yS~j94O?o zoiP|SJb>ZpVsYflU6A}pm;GKqU|k&(1vM_}=i6I5E+OH!b-`^QXf#isS!BAT{qyzK_t&p!KR=kAoWrg_}zOfUIq>XXbnSLAkr6-RMxHth+;D(Aw@JH{1! zm6=!XdZ1ly(q~pGiimu)9)3`(ZnXpH-uri_^no5M-*XJmK)M`Qwq;D8G9fP~N8XA` zmXMwgoJ2>En1)wZYHDiQ^72SE1rln&XnYP@UXG$u$pl_g;XkjT=dX}m4yXO zmRAy8l01R*9b%vGrMtTNssniLPJ2g3&mUb~xk9C~o*H;zXyS25@z+ylZoSdHk4qv& z_pFSJ{|So#bpM;njf{-s_&mM6pe38hWb)0;&0Fp5?OUHdeag4BwMmjBNo6MTcWY~F zzO%FQ_uAT8M)*G!|KS$CF6i6(`ublR8yoWt4Gn)5l$Rt)lFCk7_5=PLM@f<-sqD1HddTh9O$9;fFE%V~)BmYMjsO4v07*qoM6N<$g4_7aW&i*H literal 0 HcmV?d00001 diff --git a/posts/minecraft-villagers.md b/posts/minecraft-villagers.md new file mode 100644 index 0000000..96acc11 --- /dev/null +++ b/posts/minecraft-villagers.md @@ -0,0 +1,187 @@ +--- +author: admin +categories: +- Non-Technical +- Technical +date: 2025-12-20 18:00:01 +tags: +- minecraft +- math +title: "Minecraft Villager Trading Halls: Probability Math" +--- +Recently I was making a villager trading hall in minecraft. + +![](villager-gui.png) + +One of the main goals of a trading hall is to collect all villager trades. One of the trickiest is books, provided by a librarian. I got to wondering -- how long is this going to take? + +Well, we can do some math to find out. + +There are currently (as of Minecraft Java Edition 1.21.11) 40 trade-able books. 36 of them are available from the enchanting table, treasure chests\[1\], or trading. + +4 are available only from treasure chests and trading. These are called *Treasure* enchantments. + +- Curse of Binding +- Curse of Vanishing +- Frost Walker I and II +- Mending + +There's also three books, which can be found only from treasure chests. We don't care about them for trading halls: + +- Soul Speed +- Swift Sneak +- Wind Burst + +There are no books available only from enchanting and not trading. + +--- + +The core mechanic of searching for book trades is *resetting*. If we look at a librarian and find it has a trade we don't want, we reset it. + +Villagers remember their profession and trades forever after trading. But if we haven't traded with a villager, we simply remove its profession, and then give it a profession again. Then we can see if we like the new starting trades better. + +This is very useful for librarians, because they have every book available as a starting trade, so there's no need to investigate later trades for books. + +These are the options to make the villager forget their profession I'm aware of: + +- Ignore the villager and get a new one (for example with a breeder), moving or killing the old one. This isn't a "reset" per se, but it acts similarly. +- Break the profession block manually. In the case of a librarian, the lectern. When breaking the block, the villager loses their profession instantly. +- Block the path between the villager and their profession block. I haven't seen this documented, but they reset at the same time as trades reset (twice per minecraft day). I did this by dropping the villager 1 block using a piston. +- Move the villager at least 48 taxicab blocks from their profession block. (Not tested) +- Move the profession block with a piston. This is an instant reset, but you can't do it for a lectern in Java edition. (Not tested) + +Some of these are instant, some take longer. Once villagers are shown a profession block, it only takes them a couple seconds to get their new profession, so that part is easy. + +I found breaking and re-placing blocks to be annoying, so I settled on moving librarians up and down with pistons. It takes about 5 real-time minutes for them to reset, so I used about 50 librarians to counteract that. By the time I finished checking all 50 librarians, they were ready to reset again because 5 minutes had passed. + +Then the question is: How many librarians do we need to look at, to get every book? + +--- + +Well, the first question is: what are we interested in? Let's say we're interested in getting each of the 40 enchantments. + +Well, it turns out each enchantment is equally likely: there's a 1/40 chance of getting it. Well actually, 1/60 -- there's a chance that no book trade is offered at all. + +Then this is the [coupon collector's problem](https://en.wikipedia.org/wiki/Coupon_collector%27s_problem), a classic math problem. + +The number of trades to look at turns out to be: `3/2 x n x H(n)` where `H(n)` is the *n*-th harmonic number. For n=40, `H(40) = 1/1 + 1/2 + 1/3 + ... + 1/39 + 1/40 = 4.2785`. So we need to check **257 librarians** on average to get every enchantment. + +--- + +But, are we really okay with that result? Given that Efficiency V is available as a starting trade, I want a librarian with Efficiency V, not Efficiency I! + +There are: + +| Enchantment | Level | +|-----------------------|-------| +|Aqua Affinity|I| +|Channeling|I| +|Curse of Binding|I| +|Curse of Vanishing|I| +|Flame|I| +|Infinity|I| +|Mending|I| +|Multishot|I| +|Silk Touch|I| +|Fire Aspect|II| +|Frost Walker|II| +|Knockback|II| +|Punch|II| +|Depth Strider|III| +|Fortune|III| +|Looting|III| +|Loyalty|III| +|Luck of the Sea|III| +|Lunge|III| +|Lure|III| +|Quick Charge|III| +|Respiration|III| +|Riptide|III| +|Sweeping Edge|III| +|Thorns|III| +|Unbreaking|III| +|Blast Protection|IV| +|Breach|IV| +|Feather Falling|IV| +|Fire Protection|IV| +|Piercing|IV| +|Projectile Protection|IV| +|Protection|IV| +|Bane of Arthropods|V| +|Density|V| +|Efficiency|V| +|Impaling|V| +|Power|V| +|Sharpness|V| +|Smite|V| + +- 9 tradable enchantments with a max level of I +- 4 with a max level of II +- 13 with a max level of III +- 7 with a max level of IV +- 7 with a max level of V + +What's the chance of getting each level of enchantment? It's equal. So for Mending, there's a 1/60 chance to get Mending I, because it's the only choice. For Efficiency, there's a `2/3 * 1/40 x 1/5 = 1/200` chance to get Efficiency I, Efficiency II, or Efficiency V. + +How do we calculate the coupon collector's problem for un-equal probabilities? Well... it's really complicated\[2\]. + +But the answer is that we will have to talk to an average of **933 librarians** to get all enchants at max level. + +--- + +But hey. We can buy Efficiency V for 17 emeralds, if we get the right trade. Are we really okay getting a 64 emerald trade? What if we want only the best trades? + +| Enchantment | Level | Cost | +|-----------------------|-------|------| +|Aqua Affinity|I|5-19| +|Bane of Arthropods|V|17-71| +|Blast Protection|IV|14-58| +|Breach|IV|14-58| +|Channeling|I|5-19| +|**Curse of Binding**|I|10-38| +|**Curse of Vanishing**|I|10-38| +|Depth Strider|III|11-45| +|Density|V|17-71| +|Efficiency|V|17-71| +|Feather Falling|IV|14-58| +|Fire Aspect|II|8-32| +|Fire Protection|IV|14-58| +|Flame|I|5-19| +|Fortune|III|11-45| +|**Frost Walker**|II|16-64| +|Impaling|V|17-71| +|Infinity|I|5-19| +|Knockback|II|8-32| +|Looting|III|11-45| +|Loyalty|III|11-45| +|Luck of the Sea|III|11-45| +|Lunge|III|11-45| +|Lure|III|11-45| +|**Mending**|I|10-38| +|Multishot|I|5-19| +|Piercing|IV|14-58| +|Power|V|17-71| +|Projectile Protection|IV|14-58| +|Protection|IV|14-58| +|Punch|II|8-32| +|Quick Charge|III|11-45| +|Respiration|III|11-45| +|Riptide|III|11-45| +|Sharpness|V|17-71| +|Silk Touch|I|5-19| +|Smite|V|17-71| +|Sweeping Edge|III|11-45| +|Thorns|III|11-45| +|Unbreaking|III|11-45| + +Mostly, the price range is based only on the level, but there are a few minor complications: + +- Some price ranges go above 64! In the game, these get capped. For this reason, you're 8 times more likely to get Efficiency V for 64 emeralds than any other number. +- Treasure enchantments (in bold above) are double the price of any other enchantment. This is actually a double -- they're never offered for odd numbers of emeralds. Interesting! + +The chance of getting an Efficiency V book at the best possible price is: `1/16,500 = 2/3 x 1/40 x 1/5 x 1/55` (because there are 55 possible different prices -- counting ones above 64). + +To get every book at the best price, we'd need to talk to **45,594 librarians**\[2\] to get every max-level enchant at the best price. + +\[1\]: I think +\[2\]: Source code [here](https://gist.github.com/za3k/d695594048ab8eb6239cb1dafdb97413). This uses the inclusion-exclusion principle to estimate set sizes, together with optimizations to take care of repeat probabilities. diff --git a/posts/shaders.md b/posts/shaders.md index 4b88e7e..12918b8 100644 --- a/posts/shaders.md +++ b/posts/shaders.md @@ -2,7 +2,7 @@ author: admin categories: - Uncategorized -date: 2025-12-20 +date: 2025-12-20 18:00:00 tags: - untagged title: Shaders Gone Mad -- 2.47.3