From b88c338e65910e9c525009ed2809922e945384bc Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:53:19 -0500 Subject: [PATCH 01/12] Add json file for overlapping model --- .../186-wfc-overlapping-model/images/1.png | Bin 0 -> 44677 bytes .../186-wfc-overlapping-model/index.json | 181 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 content/videos/challenges/186-wfc-overlapping-model/images/1.png create mode 100644 content/videos/challenges/186-wfc-overlapping-model/index.json diff --git a/content/videos/challenges/186-wfc-overlapping-model/images/1.png b/content/videos/challenges/186-wfc-overlapping-model/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa5902b46d045c8ecfc8330e24bf0deac9b85fd GIT binary patch literal 44677 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 S%fDivUuw^_(8upvM*R;b&5Qd0 literal 0 HcmV?d00001 diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json new file mode 100644 index 000000000..99caf992d --- /dev/null +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -0,0 +1,181 @@ +{ + "title": "Wave Function Collapse - Overlapping Model", + "videoNumber": "186", + "description": "", + "videoId": "", + "nebulaSlug": "codingtrain-coding-challenge-186-overlapping-model", + "date": "2025-01-28", + "languages": ["p5.js", "JavaScript"], + "topics": ["waave function collapse", "overlapping model", "procedural generation"], + "canContribute": true, + "relatedChallenges": ["171-wave-function-collapse"], + "timestamps": [ + { "time": "0:00:00", "title": "Introduction" }, + { "time": "0:01:12", "title": "The Nature of Code" }, + { "time": "0:02:20", "title": "References" }, + { "time": "0:08:19", "title": "Write a function to extract tiles from a source image" }, + { "time": "0:14:32", "title": "Write a function to copy tiles" }, + { "time": "0:21:30", "title": "Add a list of allowed adjacencies to the Tile object" }, + { "time": "0:24:34", "title": "Write an overlapping() function" }, + { "time": "0:32:20", "title": "Look at the first tile's neighbors" }, + { "time": "0:43:30", "title": "Add Cell class" }, + { "time": "0:44:15", "title": "Add a grid of Cells" }, + { "time": "0:46:21", "title": "Retrieve previous WFC code" }, + { "time": "0:50:50", "title": "Write a reduceEntropy() function" }, + { "time": "0:55:56", "title": "Add a function to render the center pixel" }, + { "time": "0:58:05", "title": "Filter by valid options" }, + { "time": "1:01:57", "title": "Use recursion to reduce entropy" }, + { "time": "1:05:32", "title": "Add depth of recursion" }, + { "time": "1:06:32", "title": "We have WFC!" }, + { "time": "1:09:42", "title": "Fix mistake" }, + { "time": "1:11:26", "title": "Start refactoring code" }, + { "time": "1:18:41", "title": "Add console.log if alogrithm gets stuck" }, + { "time": "1:21:38", "title": "Optimizations" }, + { "time": "1:26:28", "title": "Discuss redundant tiles" }, + { "time": "1:28:30", "title": "Rotations and Reflections" }, + { "time": "1:29:39", "title": "Additional performance optimizations" }, + { "time": "1:31:40", "title": "Outro" } + ], + "codeExamples": [ + { + "title": "WFC Overlapping", + "description": "", + "image": "1.png", + "urls": { + "p5": "https://editor.p5js.org/codingtrain/sketches/PX0Hn6TF8" + } + }, + { + "title": "WFC Overlapping - Shannon entropy", + "description": "", + "image": "", + "urls": { + "p5": "https://editor.p5js.org/codingtrain/sketches/PX0Hn6TF8" + } + }, + { + "title": "WFC Overlapping - Rotations and Reflections", + "description": "", + "image": "", + "urls": { + "p5": "https://editor.p5js.org/codingtrain/sketches/z_N2TVjRH" + } + }, + { + "title": "WFC Overlapping - Restart", + "description": "", + "image": "", + "urls": { + "p5": "https://editor.p5js.org/codingtrain/sketches/2sV4KtcoD" + } + }, + { + "title": "WFC Overlapping - Refactored", + "description": "", + "image": "", + "urls": { + "p5": "https://editor.p5js.org/codingtrain/sketches/paJcuQLI0" + } + } + ], + "groupLinks": [ + { + "title": "References", + "links": [ + { + "icon": "πŸ“•", + "title": "The Nature of Code", + "url": "https://natureofcode.com/", + "description": "The Nature of Code book (2024 p5.js edition)" + }, + { + "icon": "πŸ›’", + "title": "Nature of Code shop", + "url": "https://store.natureofcode.com/products/the-nature-of-code", + "description": "The Nature of Code book (2024 p5.js edition) is now available for purchase!" + }, + { + "icon": "πŸ—„", + "title": "Wave Function Collapse Algorithm", + "url": "https://github.com/mxgmn/WaveFunctionCollapse", + "description": "The original GitHub repository from mxgmn for the Wave Function Collapse algorithm." + }, + { + "icon": "πŸ—„", + "title": "Model Synthesis", + "url": "https://paulmerrell.org/model-synthesis/", + "description": "Paul Merrell's 2009 PhD Thesis that is a predecessor to WFC." + }, + { + "icon": "πŸ—„", + "title": "Procedural Generation with Wave Function Collapse", + "url": "https://www.gridbugs.org/wave-function-collapse/", + "description": "Article on using WFC for procedural generation." + }, + { + "icon": "πŸ”—", + "title": "p5 copy()", + "url": "https://p5js.org/reference/p5/copy/", + "description": "Reference for the copy function" + }, + { + "icon": "πŸ”—", + "title": "Github issue RE console.log problem", + "url": "https://github.com/processing/p5.js-web-editor/issues/3178", + "description": "Cannot console.log objects having circular references." + }, + { + "icon": "πŸ”—", + "title": "concat() function", + "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat", + "description": "Reference for the concat function." + }, + { + "icon": "πŸ”—", + "title": "randomSeed()", + "url": "https://p5js.org/reference/p5/randomSeed/", + "description": "Reference for the randomSeed function" + } + ] + }, + { + "title": "Videos", + "links": [ + { + "icon": "πŸŽ₯", + "title": "Pixel Array", + "url": "/tracks/p5-tips-and-tricks/more-p5/pixel-array", + "description": "Coding Train video with explanation of tracking 2D grid in 1D array (for pixels)." + }, + { + "icon": "πŸŽ₯", + "title": "Modulo Operator", + "url": "https://www.youtube.com/watch?v=r5Iy3v1co0A", + "description": "Golan Levin explains what modulus means and its applications in creative coding with p5.js and Processing." + }, + { + "icon": "πŸŽ₯", + "title": "Array Functions: filter() - Topics of JavaScript/ES6", + "url": "/tracks/side-tracks/topics-in-native-javascript/js/array-filter", + "description": "This video covers the JavaScript Array higher order function filter()." + }, + { + "icon": "πŸŽ₯", + "title": "Arrow Function", + "url": "/tracks/topics-in-native-javascript/js/arrow-functions", + "description": "Coding Train video covering JavaScript arrow (=>) function." + } + ] + } + ], + "credits": [ + { + "title": "Editing", + "name": "Mathieu Blanchette" + }, + { + "title": "Animations", + "name": "Jason Heglund" + } + ] +} From 4531c83ccf43fa7701f7d817e72d5ba213335898 Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Wed, 22 Jan 2025 16:06:21 -0500 Subject: [PATCH 02/12] fix typo --- .../videos/challenges/186-wfc-overlapping-model/index.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index 99caf992d..5bab1ecb2 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -3,10 +3,10 @@ "videoNumber": "186", "description": "", "videoId": "", - "nebulaSlug": "codingtrain-coding-challenge-186-overlapping-model", + "nebulaSlug": "codingtrain-coding-challenge-186-wfc-overlapping-model", "date": "2025-01-28", "languages": ["p5.js", "JavaScript"], - "topics": ["waave function collapse", "overlapping model", "procedural generation"], + "topics": ["wave function collapse", "overlapping model", "procedural generation"], "canContribute": true, "relatedChallenges": ["171-wave-function-collapse"], "timestamps": [ From 7efe33b54b4e91e6f4642e3c94d863aaf011cbd6 Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Wed, 22 Jan 2025 16:11:19 -0500 Subject: [PATCH 03/12] Minor edits, add link to WFC repo --- .../challenges/186-wfc-overlapping-model/index.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index 5bab1ecb2..92b16913b 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -18,18 +18,18 @@ { "time": "0:21:30", "title": "Add a list of allowed adjacencies to the Tile object" }, { "time": "0:24:34", "title": "Write an overlapping() function" }, { "time": "0:32:20", "title": "Look at the first tile's neighbors" }, - { "time": "0:43:30", "title": "Add Cell class" }, + { "time": "0:43:30", "title": "Add a Cell class" }, { "time": "0:44:15", "title": "Add a grid of Cells" }, { "time": "0:46:21", "title": "Retrieve previous WFC code" }, { "time": "0:50:50", "title": "Write a reduceEntropy() function" }, { "time": "0:55:56", "title": "Add a function to render the center pixel" }, - { "time": "0:58:05", "title": "Filter by valid options" }, + { "time": "0:58:05", "title": "Filter by the valid options" }, { "time": "1:01:57", "title": "Use recursion to reduce entropy" }, { "time": "1:05:32", "title": "Add depth of recursion" }, { "time": "1:06:32", "title": "We have WFC!" }, { "time": "1:09:42", "title": "Fix mistake" }, { "time": "1:11:26", "title": "Start refactoring code" }, - { "time": "1:18:41", "title": "Add console.log if alogrithm gets stuck" }, + { "time": "1:18:41", "title": "Add a console.log if alogrithm gets stuck" }, { "time": "1:21:38", "title": "Optimizations" }, { "time": "1:26:28", "title": "Discuss redundant tiles" }, { "time": "1:28:30", "title": "Rotations and Reflections" }, @@ -112,6 +112,12 @@ "url": "https://www.gridbugs.org/wave-function-collapse/", "description": "Article on using WFC for procedural generation." }, + { + "icon": "πŸ—„", + "title": "Wave Function Collapse", + "url": "https://github.com/CodingTrain/Wave-Function-Collapse", + "description": "Coding Train Github WFC repository." + }, { "icon": "πŸ”—", "title": "p5 copy()", From ee5151f0af1f6e7ada58fc16ab03373bfb58352f Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Fri, 24 Jan 2025 18:36:34 -0500 Subject: [PATCH 04/12] fix link and add preliminary descriptions --- .../186-wfc-overlapping-model/index.json | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index 92b16913b..ab6f87d25 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -39,7 +39,7 @@ "codeExamples": [ { "title": "WFC Overlapping", - "description": "", + "description": "The sketch implements the overlapping model.", "image": "1.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/PX0Hn6TF8" @@ -47,32 +47,32 @@ }, { "title": "WFC Overlapping - Shannon entropy", - "description": "", - "image": "", + "description": "This sketch adds Shannon entropy.", + "image": "1.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/PX0Hn6TF8" } }, { "title": "WFC Overlapping - Rotations and Reflections", - "description": "", - "image": "", + "description": "This sketch adds tile rotations and reflections", + "image": "1.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/z_N2TVjRH" } }, { "title": "WFC Overlapping - Restart", - "description": "", - "image": "", + "description": "This sketch restarts WFC if there are no more valid choices.", + "image": "1.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/2sV4KtcoD" } }, { "title": "WFC Overlapping - Refactored", - "description": "", - "image": "", + "description": "This sketch refactors the code and adds performance enhancements.", + "image": "1.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/paJcuQLI0" } @@ -162,7 +162,7 @@ { "icon": "πŸŽ₯", "title": "Array Functions: filter() - Topics of JavaScript/ES6", - "url": "/tracks/side-tracks/topics-in-native-javascript/js/array-filter", + "url": "/tracks/topics-in-native-javascript/js/array-filter", "description": "This video covers the JavaScript Array higher order function filter()." }, { From 2a3b94779275c2730b84697b2600f5290c7ddfcf Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Sat, 25 Jan 2025 10:44:22 -0500 Subject: [PATCH 05/12] adapting description, links, examples --- .../186-wfc-overlapping-model/images/wfc.png | Bin 0 -> 27474 bytes .../images/wfc_entropy.png | Bin 0 -> 29625 bytes .../images/wfc_refactored.png | Bin 0 -> 16187 bytes .../images/wfc_rot_reflect.png | Bin 0 -> 44597 bytes .../186-wfc-overlapping-model/index.json | 178 ++++++++++-------- 5 files changed, 97 insertions(+), 81 deletions(-) create mode 100644 content/videos/challenges/186-wfc-overlapping-model/images/wfc.png create mode 100644 content/videos/challenges/186-wfc-overlapping-model/images/wfc_entropy.png create mode 100644 content/videos/challenges/186-wfc-overlapping-model/images/wfc_refactored.png create mode 100644 content/videos/challenges/186-wfc-overlapping-model/images/wfc_rot_reflect.png diff --git a/content/videos/challenges/186-wfc-overlapping-model/images/wfc.png b/content/videos/challenges/186-wfc-overlapping-model/images/wfc.png new file mode 100644 index 0000000000000000000000000000000000000000..71343884261d4b1e2d9a3a0f9027f6950d33f871 GIT binary patch literal 27474 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 F{{#31TYvxn literal 0 HcmV?d00001 diff --git a/content/videos/challenges/186-wfc-overlapping-model/images/wfc_refactored.png b/content/videos/challenges/186-wfc-overlapping-model/images/wfc_refactored.png new file mode 100644 index 0000000000000000000000000000000000000000..28ac4db0f622bc8c8af76ee1cca8bc4710b479a5 GIT binary patch literal 16187 zcmeHOYfw{X8b0TkNFoXWS^*U~NQJfv)GMx{ISMKk6t7jp5~^4bs==)_fF>Ngp{v$x zT?NrXm7=BMwOUk2g2lC1l_(;jfQe3(B9L&C0J*U5IpOAonVs3$>Fmz=!4ST4zRUZ3 z&-=WW3A^Ucn>}d2kO2sS44UKbw-7=4;nWYOKa7;e^pAvJ=$8v;&p=KW4XZ{F9GT-c zeQ|7PUB$T~QSg#q*Y|gr#SPoSoACw5<=U2CB0ux~+x90`fur--Q!;d65v!`49EN5% zZJReE;F!axnOC_sZnr*Cr;JJE#zl

W@@q8?%2(h!96sO^rCy6r9`kyklFk>BW?U zrlKUnJ_N;B93D=P@L>?<#g+D7J-hQyYP`M!!>-LVKc?UNZZ1JySTJR0uX*TGt6nqi zxZ%X3ADsNC1KKwBQZ^|N8uDa)m_>v!WO}T)hqYRR9nHzRw2!U%)_Th zB)Fz}EsNvhiW4g=%yC3*1Q5T)DKJ%%8t3Gw%~cB1hHAaM{sup!U9M`oCiD`kA_Q$O zGqs!QBBFKYHcawzr7yxAkeM@SpUtHV63JS-ge)=m%%yA?2e9s$s{a^Ef)6got4yxw z!lot~w_7|OKCY#96n7Yymz2Wt-+SX8b-0gK5ad7wGA%v-C+NLxbT(jp%zy{08tJ75 zg6#!fq|#k&Fa1iC?}gWlmhGbO*1#QTazg~O)ORrn8aMvorr|t%0zZgiME*b&9lJ^? z|0drB5ZzgQxx>GYW4obmY*Y`N&8oCe^fdz>q?i#X0A%Vd)lJ-1c6g;zy=CF#03p?| zOw)wQdG%f<+bv?0ix2VT$Q$Igmx3`*JmFxCcNwd%vs-edFGQ zAJ%Ud7-gpvwI@}ElHxYG=|xR|Do1})($41xPkw4GX+D*yZ5nI#s96MgWI@xw#JRu& zx81SF#;^+QuEu*%p0eUYaHeOXNr|a|XM) zy)Hx=r!<;!1oc9=wGR{p+!AQv-WKXkunRRq$2wCB9+i0WrkjP&$o;zZPIUMQS!3}<^I8yg5FPBs2 zzXUG6;x}y!Hi5#S+_(lkuitTNHnm^`800uX$t&{%6*#}seTXmVW0U=WQkVQpIQ~LO zlHCu`hE7#!f-I$#-r>`z1t)>q75xymBi{{lZU0Q4yAIgzyTW7#Dbjkr%fpi!ryL=m zKVD+kn6R9zmAf=iJ?wl(uzA+)ajc18;o;FwcU|Y^@J4#Uh_Oh ze-8`S4LU?O<%__eaZzb5XLpgv!*H9R@jH;X5zEeuq!11OdS)7|+~-3peS)GgeK4LY zEZj^l_+PuS6Wna89sKqdp~pzW1MiNwYW*jQ+L|+RdHaD7g*J)bVJdEuR2Mi4+T{-< zhPo~irMTe4=d}-)t^+be?WX*=o0HjqNAxh+_E%iF+ndgUCE4qn2b)F64Q)J4@~{3_ zX>WFdG`In!Eak;5Fx7 zj+AWFet;7#6}z+6fgZIi&qlK9d^_bmF$?bc#dEQ4BsjEfOV#iXi70(nAPM`CL=Ihv zQ;EU5E^qsk%p0W+I@@w3;kXMp>|#*ZubSj~TX0-%E@Fdk`qbwhs8`q}5^g&90m4TcRA8=P{*vpy2@lwjDRwBVJ>D8#_AYb-g+;OW83O7t0XN4ygbD! zXG4JyemxL~#UN)E1px_)4SCkGri&M~`s;_IjivK+N3F#jr?j5pXCXpE`P)brwfkMr z;QJ6J?jL&$!6nfVXm>qL{0xG`_dj#sl0u9ZkYJA&Vz}lv)R39@{|nAscBrZKM6%@J z8Dpbxv{a>SD5_#pQLr zbjG^4rTOV$bzgM^`ht?Z50tT@2oMgYFv)mcZd?UEHT%K zT_iAvBqR3JUMllUThpshR4gUP=6L>wRH&kC8!i3k7Sc6T{dA~iW%wN^)rXw39yXG& z!e#38R=e!is0w-eieF3>zHI-s&aZRQ3-Ze3vzAg3+n}n~Ft)tqUUGP`HP1u`CBNG9 z8xCY@^<_!?oMv%?QKneYE?2ZB^Ml*vd{c2cbPlu$8Y<`FC-hMm`meR=x&WwWdX*o{ z11hompM~V`fIP$9AP?htWuBoLC{pfhsw~!t8xJTUlm!SCvSzU${#jFis%kZ5CJ|-< z+EXz27C{y83q!VbsSoROkbB2XEeBXuP*D2@Dvh(d`O=jR*-m;7C#=SBr9<{p0jWFD zo|YH^-L$%Ct?bUQ)15$d&VU5^x;cUF%CCc{Mv?}4Go``tc2t2-0YXzD%8~EM&tMy{ z#>n$JAF7E!1)>Ph`*AvmqPogcUas|#sDkuKt(|HOJqJ1{6Ja}`LOB;9n4^|L zi{n~zMZ$Z19D6_V#zwK9K)}{)74$U&9t4^ZcmmmKE4#jp1&t()6|}p)&Ge>2iWo{6 zv8d)I$7eY}y3cKsvfrEccF9kjq1_x_ciFk)Rt36(P8;QlzOADQQ^HwV-Q3rNss+ zDk@c4*mad%5fVj25<^fH31EmyNFX7}?@R*9?%i_l{k-q*ZTxXBxX;WyXU?4ZJ!c*c zuXb@7Z1{ztj*iaY<;xbY)zKLsME}zt2>-?T^7CKe2WHP&r$suqE5|hJ=veA3U+l1M zuh%<1n;p>=iI*s-DUt7fnRmD0C+D?aIE-6yX2wg)yS@j$99QrjYw*MOw>RE->*~!| zJb`)@d)Ir!jYEdp9dy?{TxJ>57E~D+r(9m zX3M&$0`Z=bn)yv<0xQFk*^!>9?Zxb9`)vwUrn1F`P}fDo;`B}C6_qv|sTra^il>$; zTH5P~3)d<5#ZlFwbaM=PZh0q~5sjh9W=nM7UmM3;GHt$*zdVAIJaPS6JK%jbovzA0 zITgl+=wmPh^UL&Lsz0MTI!gE(6eW9!Q{aE-l z&cuY1HOo+VKGk1CE~(xRgHig8bB8z7n_#g~bC+TW?QYH*YV;RQw`39ne>H@mV-}G} z>_?NBKGYiqh#DP6x-L$Ver$^a{OYK$FRUG<+rPBureFwH*Sczt^C%p?)6pNk1aW%521JiP!sRb!-iW`yn&hfm-6KRipoAAy zh{Sv($kUPQILYZ1Jw(j};lR%tcm#>26Np8q`#gugm}&oZ5r!~gT@O_OQ!Sant)d{< zz{Y8yFKNR#Zc}=<0~$j4Y1A|%y7&<$oGQ=PxWAYwKWC)-7pz)Aa=re%XFKCSgNAOq zqYn&^Sw|wdMjSBxi<$qEnCvuiuk@xoG@f0kym7>Cd)8|Pi*U+4lRLIh`B=>3OPWM2 z%^)5atRtM%#eH|DVR7M;Ru373m1h$ynei8vbx}+?PR=#oAPcn_tV8x?Sv^kwx$a|z z11ZyWQotl;9G(C1qhca6qU^H9>}|2OWRjcGzSEr2B)x$c3U?w}<4Sjlf$(zL&RNJT zf#6cPPoqPyxE5?_E8A%&RB%(-2n1{iJF?M^Ka9T|b%?*WC-g!l6XZ#OB4I^s|^o2F|uYXCR z(@iB+A`scP1LWX77r4rcXUN2~ z)uQy#@RAq9eATL3IhE}af;)*8ql%IEit!c&tes+sUsdI+@TMK|N)WT_} z&cXlj^dx42Lqj+=YSqR7OQzYZ9FQL!#w<9?b89y01FcC+b{)vWl`ehZskE)r5qX?p zCLE9N<>&;b)#Hi>eUWF%+4kc%12Dyhu8)8z`bR-Q%8vfH2*%dqC{mCZ>k20zVen3k z#GD0*`TltvaAG^C*LF^RGTp*-q`AIu$*Nm0h2(t{q-e+Rk>~)eg;_|Z{Oo}Qzl}&5 z^s_-A&R($xN+uc2bFkU>NQ9G|yYrGnviZgzX)Jad448HKjtPvN=a5C|Nx+B-U%-F`j{N*4DcWy4O$7k?F!c(tnQR)2uNrdYY^? zw~(gZ=l?*e7a2{dj`O@Ynl)mzUd}>Z43BN+d)m(PaV=J!^)cz7qBv?j)k}mnNH1-K z<7?c3zu~J_ubF67)6&?z!Mdb*aOGTqw7o8LZ(M%Yd-|ri)R-B}gylKov;i9UR@Y&a zkGdkAS1QZkOq*Xf7bgi?ezGn8q4q70T9-IPY+`E$f!h$-p4gOQ?wU|?9q{_Z-LZ5Y z{#Q}Qfh`#c?HnJ!tLkUbzov9GAO zP--=@wt*4%qUiRK@Hqon~$a66f!P1OYb^jHS^D`{wWe ziZCOHN#hjr9oUaDG*R*t(EXoZ4k;BGf0W7>-L5Y0y5$m6Wu6pRB5Epbem`Va`)f>A zz&lW@8)K2Qn{2d%aD=ow*5b>+jderj_$c(om>+Ms;gPJFVd(i356&t}H1i+XMc?_a zvFn+&=d-^cY!9Rf4IxBpVeQ`aD1IR=A(4zn^Dy~JhdM9v&pA=^S=EPwqxNN0?b$)ckID` zWLL<)$S(PnmE6A|Yz8DXW7?W<1oKQy267Ef(rTNXP9E`RUaQgl4K_`A3qCjphvatU zrpnSD*!@%yr}yOET~obBO6U^W zD#%oFAN&EkZvPAHYNLIqp?2;1A#8@#dnc@@l$NXW6+c)mFFJ?|nmW^tDH{;x5uGbY zHkC+AJCGJLrUHwnaw@lcS-QO{wau17IbY(By2d!A|54`kWZ~*@C@+9!? z^43jLw2wkIz>}M&WUnAuSqV8pO%Y+b_Q{=<5dI`=%kqUKwoHQjO#kg}?P~N=DZEMg zwhiq_1Z)sh@K2(1fLDcF1ahs;m7`PYvjC!D3rxEIR^(@3GA{!Lz4#?MNV}f56FfP7 zaQk&wARllj)&&=<9>Tq+0ufXFWGI}T4sY^kDYWfMmnCRV_uiKbnGZzIbcBF=mR?4WWa-Dm z(&<6bi2Ol7Hyu%Qp*?va4h;V=SwX=LwGVell35{8H#1V{2{%uNK`pr`K*u-F0-((u`!Xg=re z`9PY6o`uf zro*%VL<+M>sWm0ySXI+|GvWVlaFQbfEAS{i7f< zW$`~_fz;J7!syWEUiQ2ICe(CPC&RGWz=Y9z?jQ&kJuS5c_U9sNUI}I`b?f7l9?kEo zgP$ouuQAEL3hKU+B14SZ0K&52S(^qXK#xAFd!J3CSxM``8nymP0CjJIJ+r?Kc3r6@ z`yK3C(D-s1ipl$M7twd87>>F4z8%u9Xb_<2JrO-(($|FbT>xgyO91k2M@DakJxzf< zg?&sxCKR6ZwUwVGM*C<55V3-blEDzLbIP;wwjRv8uUYORoSHp3z@8qQCLn#qg+^<) z12zXl22cFb2uLNt2pda(kaNvjHo8N`RpTB3#5{o$@_F*Z6wN8X(^OzT&jOL(?;!de z#Qz-!QGijlwcRavrH~P?Nuy&vT;hsVN?C?-4vNVDos)0AC+{)XIDg1V7fohbNBJ9= zyhK)GEw8v&f84=Zy5FT_E+e^0o)5FU12(GUYHl=mF^%rs2Ah-ljVZ@;ZVp&la9=D; zfk*GUGa#z8X_vpRcHx*3;CTQzn&9gqFJyvXIwJ#YX2#1B_wj%AY6GD`BAA>Y&|`rP ze|oRKNC3JLA}O8z*22Rn@H`j1PTuoy8)T1={ap`RTpu8qI_$4rjg#zmhA_?+Y(_A> z?QAby??k$p^#sbsM$JV$|whkv1&#@2w(p8|$#O0IZ>!C$=^8}(xvxGZz<1Gc1y zmA!Or2fDU<;Y+v%QJ2!;If~Y%=kSkc4Vh&KIAH1sp6ol^U%YxQhOpIbCB1Yo&}q&r zoX|_xS3uWSnZ{%hj_?#cM}h8HZkq-%guUg1EoOZuie7^Ki&rPoQ|?@ckY^yw9n9f> z-%HndpzC~1TxNJ|iV&WAqo8$VpbTNDS`%!^QR)qo85f67rY_=fgb?Ya{4Q)_r1at(@G2Coi9F9EHJVz)56$ z^w%Wi=(Iv0qNUzH4_@~;$OnGwcPWfsf+qnpRyRmy;`FCM5M$gy=e;ud0}QKwz3~eSb}EoE^^Je88?_8M2CqGK;R`HI3gMNQb}*&a zVTR0vMZ5=e%mW^PdYCP`fAkX%J|zs^fK}V?wAg@np!#L|p59&n4XGj4Odbw`3^#Dd zO|J+&rFD|`9hkFs-r1$}((iz-@A5bI@=1RSK+ELIX|ORR1lNm$vDafjuFaCuP_Cwk}<@f&kebYWX8|(%S<^<@jn@AG`+M!w?N>Cl~?Hb zV|sTH7_kY4g}0VSU0gVsXWX<<i4u3nJxQus8!L^(3z}n!V1vuy3 zCds0gk%(;6(O0w6J+bz*@f%RQ2^MaKW&^?YtBoKmgZ!|>#J{k-fOaC+ zLzWY2hK(D6svTI(^L(M)m(4H8EIwr_+1dD9<6syKhMMzg zXdCXjwB8q9n}0Z5ZFwwup|!Bx=^K=%gE@Yy-N4%cIXZw?gLW8Q%q_eLr&Sn6j<&WI z);zurP7mHxHbQe=W&Fu0M@yfA2JSKysT{tL?REM8C2%1HbXDg|!rfwU#`)1m+|_ zR4JVWuiaKz?Kaf%{b^{uIeo%3)LQu3Voi^+-U2xTdCJ=;Fx605jN20$n}UHAdYWe# z+u+>Fk}}f2B-Kv_t2NomTIj-gK)BTN?tCzytaVR1pg{(Z2jeE#+5lLgx1r}BhhjW3E~MJaq57c1);^r|}ur&DEBY{9kL;zDDa3}p&2 zdW}eST~TvG=|u=9$Jab&dr&r3Xbpe~qm3*mEL6m~^R1&hIHHIehzlAY`Z>`{55oQr zO$QP_H&l&T1I&A~j$jIyA?$C$id1lCDVWcVQz46ChlkucR)O`05?R6|10m7meP+Io z`6Jewp7Uqyfz36Y%Ss1O@iM$4e`?Zi_jw5RIW)cHJjgJhqc&@_Jhm3tM8tZDiV4U!-q86$hWo%_bI!-bQP zbU|xWQ5RXm#BXAiZ!vl!gkC5b_e{%@?s zKd^(Y8i0XCa<_U#OTXO7)V9kdK|(g)b2YE}!o zoX_V|A`e&9xKp>F%52C6hP!dKHH#)x5i)1EK&M$ah*n&KDJU+q{J{@aA=J|~ZCMOY zIEunirs~Qso3Q{q&uRKmEdu=07@(r5Z*Z> z`buB>PIn_=;2NdANhbsHp4kvZo5G+mr+ZugL?;Hq^W?(Kq~IehPCcp79b4pt&-D-K z=L^Woe~>UR6zX?1>POr5Jk2DkL$mmN+dAcD@CS9YOs<%$>}Em0!)ASG0!8UQroPP; zuOuqnZzxNoA8kQvR6JT9SM1}Zj>!=e8Vhboqm^Cp>l76ECYh1~4mgY=YEo9}32xsO zcPV!^Qjr3+fdaJ^irQLQGwg5e0F9ZtTE&Rmdu@hVwLXvBv8_mc1^o4$9I*P|^+f79 z12X6-6^^~mfiVukO{WWKJ^*B(%HFG%IIqdt=*k+xaunzFM2hyyp{_&(gd!b9zn*>V zyT;c*1G^=YMlNN&X$yp?K!F^ISzkwj+>xfU9$P?fn+`)`NeAl?M3?)k*+hs?P%A&f6+&&1F%&W&EsEP?_8Xh@X&VBw_r$EX z|2Ygn{D@I`ymDm8X$Br$#4k6K$?vXWplWD3NnN^d;W~UHh(RjtVetZs3jKGRp^a~z zeNW~9O=EANv8Nr{SWx~`YEWPr8VplW@Z=QCFqIsF5szSmBqMcof^mLJ>yhF)aAx7y zM*JviVV?O_J4j_tLfhn#eETS9`O#!Ey(>Z=7s|;{_^3HX6sBIzgZKXgBO3O^TF9$i zua)a<>F9Xq^#z1Gc8rh4M@=QXW6zQeO!AjOKjD%sE*xD+z=I;id;ZNIQm+AIxC>=^ z5V)aB4Iz-=@I6S-!wdQ0Qx8j~Qw)eIZ0;gixxXN$bbVh=%yVGzC-KkgFpl8b)D5)v zE34JpJ>d<3t2<*xsc31eb^6Heg{8>cV`P59Q;$#zXvq&ayH>;)!sOrRODqEaEq(ul~ z#OBo<%AecY6pHgT_GC{%Mwxpx6@MB9j9#APh`em|uEiZ|z8*IdqFnq;+)7|Epr%oW zWySf%D#~XCIzsefiK;Fgf1{F9DazSWsha?DwZvi-o{I<~_@@kZJoC=M# zz@9CKM332P05r)aV;dNYvJ2_yU@RaTE?M^}X5*`2i;#Oe}^=@lzC=Xwp0Y~v16 zG93BZE6`+kXA7jI1HwS$kbr29@*gPGX59}BqJ}_zJ{#rdT4~CMRx#F-axe~KP)D70 zGjvu>OR#fblMsH;OQ%1!4Ae6IYgboCdMV`GlkpC8_X0JhM_V>`P zRl55=sK)c(C|k%h$VNA|OXff}3bo&a71~^Xgtc%!%IOg*fb{79JPX^@t%7brhF}a! zu2Ao+eru!pm9<_ZGqs@>aK-JZa>$)*NWDjk+3qeCw^*gJnsgWWdaG@5+D_6+sZcC$!5F+uulkd-x z;WKE*+o&JiXt@O?3C4UuMq5=K|4hTGYRJVBj7~>L9z1AV*}4Bag*%@r66|Yv;18Ht z8Yu41J&_Ea>sc5TB-M!&LO+x_tq_ zITC|tdn}Hcj}o>)eG|6N=D-Ph3gYdzvQbd0a>A-+3u`m#iThHzy4dh`_~-dl^&k)? z^q;Oz4AE3y5;6e4`VP!C5>G7()JJVK-k{Ix5r$<`qzfY#_tA+zkWK*U#`oevzaL2n z1$h^mN@Gx;Ie;a5jX?7c!J3-L;-I!a{UmThNFTM(;O|Gug)s1`^}8;8 zjTM5APY;PrvFdd;y(9gx z+G^o_@cfryBN_vw0e5>eb=n+bI!h;xf8|6<4Hdmm^4xL`Vti{Q(+_ zD{iuHcdMqxN3d@w>nNQ;2vb3MCz;Y^oT0Q3Tij6EtKS%bR!6Bt{w$veh>HO}0^{Hw zU(Mdv!c}d`@{#dnw@OHZ9l;TyZroBA-8NlGvP;nGd%93I!0$Q#S^Ii)@wy8Lh2|ok z0zf<2{Je)5BcTAOqp?hT=F3H$zZuN=7Rw}QkfEJXfQ@en{p zIfRa;4iGwCN)Jzg`bhA^4S)iU1W6wG*tRH+p7I(znZ_mdiV-M=>mRSI@wx$7ulRgm zzrHfzr|lYfuC4;F<7ax;0t(sS(DHVb)OzA1N9%rfuo@9?15P0HsMH>|NvRC{a6?z} za2;~JK8fIZe_+!F5*$Eeh1Zkex)?k0@CZmF4#4gXd>kx>_`9SGLbH(se%J@}3C*6!mwrSDtvZtRR|Eo8ZiWFPm@AV{u| zvD`#5zB`{*`azzB2YBdVR#1J^O=|HgKB17df#OxMmeEGNA1y4w%Nk|3ijv)80HS;a zrBRkui3b~;Ue;*PQb8@qY`~iyC#&?w6bIjcX0K=f-eof<>?{Izm-5u8f82j1U$Q@z z`uFw%^q1@mW^c0N~nB#cddo9~NcG5>+%R%bQs2#Ry7<3F^VLUHa3h;t|PB&cw$G1nAbOM$*@iw}I{JzJnk zqiMXqaTzOO&ggfd=%bpCCMrxv>o%Pkaug15X45y~Lpe5iZ&}Jb-(a z`qvgh9yiV&Luhat3-Q#fivw}`sF~EbY@#+b{_UF$grieiHj?0i=+{uJNPu_DgAON1 z5RKsG@}r$lo}_ z3@$xxMNrf_3&@&>LS+Bp`f+%CZZ+IN2uGOFHeehih;*-kgW-0g74zdVpuZDbwrd#N zNGRKn(gbLcB8=&0;eRg{)~lul7q{n^pCR8DHZxv7F5}*O7oa9x8rvy|>8jk3wcyRM zB3A7>wp6uabE~_WERYLs*mjlKpc-LQU8flUz>1dbIRbMw(NiSbTQhh+Kd9P?zdY++ z{R792`(kpKBDrN-(E@`C{V}c(Ti2~}r(DXS)Efyig3^y98VSu#QLfboh=bE|s5$hM z(a6hn`(r4oqtLj+_!{K=>vhJj+5_;NSozJ0X#khb<0%sTZjm85eFP5EmbICbN*o6r zNZxQOjWW1;fNUX8uLN4SX2U(qg_T;mVb!}37guDC?kF$r3@P; zoBIU5KoXx-%sT%!46GRvP8p0zuvq_A*mM9ki6_8*lQL9DWt z7HF6DW<&OplAh-+sv^GU;Wp_oJ{wx69WaEa;7$n8FcbhyBEg3!M?9R> zrNK0k;K!E)qF1S^JiIKF^{)9vW{|oBzEkrAnuFn!F%q0)wJUTuY470)-fYm)mp3!q z6+^j2n5k5Hw%+%k@K`q3s0E`jgrUQs7aBu&?gm*jwBpDQzRb(7mKb+S^(51e^4&<} zoyMzZw3?{44Fb)cT$XD0O7?a z_H%0J-|a_Nk|QmZ$Rchv1$6{!w)1WOcKT1}zf9PU8VkuW4O#1t+mgeHCO3}o9I~=> z4@&h^LzZsw{3e=p&M9nR!-X8#N(F}1Y05vYu4JpMs}B-8no;qnrJM}^pDw1PbH%CA zN@%30qpAVivR7YcyDN%iEf=|vBiBHw7d1?@ag`PYR9R!>!m}OOU|Cq8g;bx2Q)gV& z^q|Z7`_KEL_sxxOt`;euQN1t()1DGip(aj8Z53c2CQwc&R>6eXMt?p5#uJe}f#Oi` zQp!c%Ix)u;=R&lei?_7x3IYiv1oHhi#c+WqD$NFB za|rw+)Gby!-&^0vNZ($4#_w|~uj!_>ErzVX-m0|_lHHVMi2i$PQcxDQhij9@5dc%8 zuG&9bT3dI9pr2+5H7NVmFt|clak=;lO!4#^f|HPv1YGEW>fi_Z5+cTvgqM%h7dq;> zZ9Yqf7TUKbfYP}ewEc~!<_%vqq|;|GjVVUx+h>!fuO!(x`0rT;8L>I^u%NCkO}T6$ zl+MjKaV5G~Ip>GdXD2WdEOX{xfjt~s-`m5e=|-?*8VMZ*SPVtzy`p>=>J1$Ocmn&; zZwlwI0bR+(UQlMHb(s|~kti>LS%#K+7B9joGC2Crwz6=Sk$2t~jo~oVG^DRvU6!YUMZjU8# z<0EoO+bl$5Pj~EOHv}l=SDA5mRQXsBkhZr|K@*{YZz3yT}f^#wG4o& ztgfDhcPV_M(Kyl5j-HJd2QVHjyNSuD}&EJF$6`(Q`S5KB>+od;LBa?y^%@F~h$%&buF3^Ca z31jZm<_uV-_)t00_sQkrefOxM$fQ7`j~pAtb7gG<5U@6;pVj}XSp7&((wr?S<$xEx zGW|lwPH{q3h3rUh%v|%*)N53YVpk>RDBD=CC~wMa!W20*HJ;EaUt1^0B^L_F>M~jm z_ak|41GH4Cy5m()^lg$sL>;YALjRYq-?Lm&AH*rq92 z)(KYagpwvwbp2T2#Yhp<%PXRuSb2vsyT_uA(*eN5k__@?Dg-jw= z)d_CTkdx(4*c%jtg;YqUciOO^;LL4kg?>zY>Usr4ydcvQp@py70WUw7?)gGuTqjkT za^j1tdEmCPAYrDZtG%`ZYM<8xZ4Q8}Y1kiN9il#yR~PxJEj&Tc9Dvss5rqjyGB&z- z%c((PRyaLTmATH<_?)PipCS%LVqTS+SDeaIa#`sh##TLUJRDN>@E1qgo~!ni2-9Y8 zS9#0zf}_ddjT84SW>=cJvfQ$q!u8|4EU(aX zDPFR~HtgvRIPRtBltfTCN2XV;Joj(D(OP)qB~f}w3Wp(^0*0`FU<@LOT56DAw*!XT zwJwS9S38hH-OK_f&Q$KpD^_zcE+j!f#*BhB(IxOnqi_si8~0{`G8%&M%b%DIxPwoz z&;^)%B&g+51(?;NU}d|xDEI=Ks#47QH{a;OF}q89w?rh1kc-zt5hW}d`cLN0{@0EP zDumgaK=Rg+*h_n|AEOY}>#2#$@<7 zz53-5u2?J)WPq->NEd=5+0hf2iGVkvn`Zp$Nkth=4IRK$GHv)LTC*CHT0yl-R{8D0p?`%dhzDT6384`k(@9+qFdW;L&X?7Rd zC98H+iv(_v0Ve;Md_e^I9Jo?*dnAW<31V46JbL@T@y4*&l0(XEHvTMD6)p2C@YX!I zb&z%bPZg?)xR!U>MD{sWsd#)LxUA>fT1G55T}jJLfA0$OGE>KTP#G%pfV0gU{Yu-YgL$ zG$Y;xYE$i&^pw)wU>5G5nHpgklB-jrVkW6Dl-#bi`ZHNSk(f%=z?HRELgnIe2@;aI z+SD6v8ES8+JU(M*(syGK?;mga#*#y&?YkPVc7am1U5+#(QJad(uUq$gKIHLO{iNxo zImAinG*W6{iQV4DX|qgVUq7s!J2_dU_=*B1AlDg1aGEQR8=*#ecX)a z_#}#lc+Foq2*(u%-#P8PB3)gwDiw@+AV@JpnCSlHS;%e5Z*93hfRUw}FV$<57z?v1 zBJ?toCJe-iWVRb0PrTZDV!5EYfP7p}jlz~gX4bgj_AAD3&TF50<*)$^slt5P_EXP# zkBbL33U1%@AJ_kt<6e((b>sei;NdC)4gf@EOXJqudLd}yoQj&=Q5>vEv|wQX zKzb2^m?F5a8Sx7Gh1i`uJiXQ*hrkT*U9xe}3&bA0Onzpu8gzLP>I8+}**=ED9e}#o z&!u|axnD3YiqgptRw#c?sZ_j>?v(8mqnP-_?-gYWeD96DTKk@ZfBc?*&|~;^CBZR} zrn4hs=qN5#z8!JuU2{=zAS;}O0>>-^EehGk%!~k6JSazrId^NRx38i(!C)1QcrU%Z zBuB}G^afIniQ2ree>0yj0&K@+Y^ETfq>4BxE8P@OSm{a) zYzsOGb|tSTmIIt#IUX?ol)+IN5&&>yQ~i##M2v@BAp)S4u(ukK`YS;7Sq`p$^KMEM4LP#154{-+X^Ho^t_fSV*4Q2B-U3)Cij_NAyC&J&UWbj~7kFUiL)_m(Rl!Yg#v<_D;1 zVjT$;m;g>c6aUkhXm7=&HQtJ_upW>zphlTc=&IJxXvT#<;GvQr6K#^zsxu zXvhHHEw7;zZ|#WudR)kOsB#d@(?P~^h$i={ucgf3s7Qgt;Ao;Nt*#l0md&pP_KHw_<>m$FY`XY}J6Bni*26A3(I}0=VEvNOV%bUkd7< z)6au`Iry*Ag;978@1>7oU!Bx+6qt7Y+EQxC)spBu-86Aivzk;`Tw+TuaU1(V(xs|k zb@Hm4DC%lxb5#9ehc4b36ZaN!#T_;F?xF~?C=LGl6Z(ef#c+jjNPbdvc{`2NSOnMt0G&P6&tBtXRsViBV@D_b$3|y${b0N+DR{sTu`PvYBvg~5eV%0O3{Pnk z+ch0c9?c##d2)#UNUYUKLjxYlvv}U9Vc&GkOWFHX7CSBL(tMwV;?4p=j<^FDC627ixvkhF_NwWUT4Z7T+3pTL zT~mZdQ>%yN55wq=O}ox?q&GGiMn#fBB1L9i`2=0U;5$WR#loq=06MpQJ!eyi;erOA z9Ng{2B!@V^DMAzP$osKg7A9M~6bH*jLeFN#R(5Wh&X_uM zHD~Ju!v(mFUbmSEdbord>gxkMH%^sKxgv+16V}o|D{#X@&!xo< z!JJK)Ds063(3nHs`&v3&GN<$-Rn&fy*-v^u*MBE4ZF%B4i$vQimUlzBG-i5xpulEj zdq>M0mPGz!oO5=DAfm2oN2r5ppU-gXpcg9YF4e}Lnq}>RE-7(`k$g)BS^ZGFSV5r5 zcV!DiA5QtQ%6M76EQQEIv#PUPzQ_vyr!g%ImsX<744>$x}Ie z{8=YO*D_Y>=vy@z$;72|2sFb5<&F+M-8avcp3$EqbYIavIC{BS$E9HfS%)X%RoWEW zw=XjlwWM3#UC3oS$(2uhCky?k&0TJsO^ZHj7;EhXL-};dYhQf4)F?YL+ttJ)6%;Bb zHC`$^(q8lRKfK1x!JSk7_P!_SSw8o`#A34U;h}*rae&Ds6vi&#olbbWaveGuBQ1khK}>{w0%1p6sma>0p!C6pmTm z;BR(8LLD)FX|^&Zo1N89azB^{gYR{d%w{WW3);ujYkZn}DR3_s2eqOe*A- zv{mBE$4{RlGkzImPgZtPbIDPZ+Umx_Nc)egGGBeLRo9c3=E=k=w$oE8P2mpso}i4_ z#RqL}$na(5r4%2M7V_I(Q*%$zaT~xfxu2w7YPxcOV`ORcRkEH(1+^MpunM%7n?b;f z48m@?I`~9R(s;=erDmq9IX3oV{j4O|p9fC-yW#X$l^eEd#!Nq}q(?T&kIR})dXb}v zP4N@1fTI&tr^HM57rgkaYs*NWzmDmpMwSDv!+=VBLwf%>utEKN`Tryb-WQqaThkBh z;Ob7KSgC~#3C)Kx6jz&Uifg5jXUPjb+@_Y0H(H3A_KDg$TBNe|QLJVvQ7$1md6aa& zEB0lnJNMDdMY0UB@|Z6RPy1N-lp1eL8zYjvQ7z<(!&yFxT4(IAjZ5oQuVrNW8PQz! z2c|?9UiX8Mggq;ic4<6;7Vx#gb8lmUOHoFu*bF&V??RrKa;7f006f?sZM1r#bOE@q z1utAbj0;Uj-)xM183O+-n;wt^dO-AMf9R1s06-HkJPjn3&gvLvLju5^#^F3Is#NJ|N#qhfB@{`FT#erEtG}hly zBnW`9Q!f5y3w+uCcqfSw7@srE11Af6`bCJ$Y&i3uzjVYuOvu$!sBF85-N zmO{7z;X+_jS$G6BM{M>eU#a}@?WtGa|dszE9<`a6n(%vN>X?b@07PVcpG zZ!ZAQHq4)h4~Q^~y6_kBw;2+t-1cpSb}SIUZLd_+t$#fqZCr#D>Tkqv zs&JYhoEi|(gaq&?Phj(R6cu>RZ2S*a2+J8luX!8yHXDhR19DT??!=N*k?d)i&E>(o zCReL(cO}}O)Ud>mA#Ingmwp_c>dX?;+V${D^FGua!8<9Gm3XB?wxH0a?wB-M)v_d8 zkQL{8PuUi{M8Ox!e2Iz6wR(CYOs;n)wi4^dTAkK(;3+qg8zU=!GD5tPsVvGl1&f00 z=l4+y#~01`Qo{vCSCos+r$?|XK+st+^vH?O~xXe|SxN|nW=_7?hHl@>afT1U( zM%$yjM%_~0sEA-a+47+T$7Ori)k+jz4nBvc_BebnGz-2>R$(CPBynv{H%D&GmS)Tq zD8JhCP%+Gx7%cj>N*t}5JmGd9L({*3{uB7$B|;x1SNQ$o1B(&A2N>+#?HnXIWL8+{8s=D5$`;>5*nrox1 z@MXDLP)CVmEZRqi8S;Y3N8ryl?L7oG;oU8*6;KQVyeM2`HbggBH=yJwIXX;nU|~fj zC8bJ{`~rUPnlh8Y8oPj#0(eR5935ZukMHMCzdZcs=u3$Dy}|}xLuhMGeXbgiuf(2m z3E6DXOq+S1cEb7B56S=l+U{kPN32X0_%)47U6#8o+M?QXSWYMKCbRIAzpH@syzv1;o!4T7QSI635(24`Mtz&D}UDew08J?$dF8i%7xKFCO4D|3mwwsM;F=Vt zs0UhxfpHtQwkI&B7)%mwuXQdo0TjFnfQapSGm4TlOn5!-jfmU6EO;J)-Q1BQ`wSkA zzhi^ZEuL2BXLdFREuFw* zCTzDAEqYFU?c8*cnJ_m0{qAS&Ux{M&Hyp~_$sSkyTCy;`rlt<^9s@{CplooWv;>an z-n%reIl!bOo+Y?JyAssE7vT9X=Zgt6-t2W}~2&%CWE z5lFhP9#CJ7C#NO&vcAMNx1X)sEblH5gf6;CUO>*hP?JHEG>aE|sHAvRjV~*L95a;* zU!7l{Er_>QDt+OWm2V+WWK}3oWW))v_{;o&i5P=-tDs`l>|Cg`XiMgq^sXGT4kV9~ zIZt=WR;K37xh3feV>R#J$O`>vzGHfXM|)X=SW_n zv}8BSa{wgy3%ds_G8u-gsZ?7ucdqHSj~V}uZGdZdkg)H}*CeA$Z-O2CWhP~WJl6U8d3zU=#ZxbqIN}^JBX=V4ZVC5}eRzj+B9#>r5 z;Cc!E+R8h#OUgD`rjvqDNEs=LV8OlTXz3JgTR5%5B(QUoXa_2+`5-SE)r{QrZZ5U_ zQAOi2ouSK8$=T<0ABx0Pb7DiG;;ivdy?$3)igR>bK?av|x=I@DtKWSBH`nTfJxjz3 zqNS#FT}6dzR7OLnDe~`H@DCrgRt~Q1Vp6Wa(Xl>m{2c>^q$^Mmu29UWut|nWwZ`NA z7XIU$dWKwRW46-b3oLOw!&(0dJ6Ms+6Qo164i&hOXYX}|T1+x7<#Y+S>PhJ$8ONm4 z${=8oC56h%mS*k!9n8$Lh>V5`AeN99JcqY{Qda*rY z!ek1BIICTF;)_=A9f!T#k4`eUP{Q%0^;G>r-lKv0Mui9+4`zSrM0%&nhf}GcQdizhZ$Mi3X&g zko8y^ee`za4hTRiQ2;7=X7&*xU8qOQgSxzo2azjWAk@Iyg3f((0ARU5VT zPwENZ`x(*Ci2pIFp>6d^Ac}sJCP$QvKGp!4!cs+!?Mfr(DAlu8$Wtq9ipkJllOs5z z-(6=dI1JBG0fR4Oi^?lR|gi?~GF5Xl4gIG3~lpibFYR?)QKc&jtYpGAm_lBm= zMJ+OdPPoN5>3g5+` z2Bf|-ZZqRt925ucdHODzl{B|^JgncyQ`v7Xj4tM~pgTcn9{Nc9Rse0iXTcI==yy(S zI}s{3A3=MVtov-noPdZ-cURLZbKvtVqV|P>s%NN_nM{J2-95MlY5`nU8q9H3Jeq~J zQ@bnB>DiE~rY5T)NbqS${ke!JZnSS>=8z5jd^(YB-5l<6HWs?yL zRo~f-Yst)?O@&{6^|=p5@F<=2X2=@F;03r*GlI=7ybo8Zp`CbotG1nZ6y#+9vpix4 zLrR0_L)laJKxKCDm=TiO4b?N|_-+2%WBE7eYCL&6Oh;#M*7C&;>w0NSXRY}_99D+) z15OmyWTYFcy#U{B=@GbMC`&N~VBD$uDm%LdYr3V!*V_uyDGldJ?o1ZG%g+TNLcI|+ zbx_F~5jxkQCsXbDff80gpez>XLUtE^(cobS7eH4Z;!-9WeKr^b8mesmaDqcS++U3* z(jNArKc(bdao3as$6^O1GG1UTd%pp-Tw0(vFA5PUGZQD4Q2@_J1=k5HRs9{5THk_b$&< zQXYrPqHc3QxVanE z*lgslIPjJ7Sa-G&v%O4z9u3tT?4$v@xtKD>_MvO5x3#D)a=PrcHPu4_5QTQ^HDW^*P9%P+M% z1Y4d+X$t?@Fv=aEnF`0hpI}%(+vgQ-I6U-=L$Sy8rwH{^A42fc3$k2c;(yG3=V-XV zQG|r1xdoLb655((U2LoWNI~JRb@ZBZQ zlD0%%zh}5)A9EyS+VnZpeI=9T;oFyDn_#Q;L4Nc&I;3v)(8T#*_ z59~Y14^5MVdJfa&8#nuQ52UOKv449E_pJTZ@l6im70VpbBRdEGXXu5}TyoEi$*dv` z4_&<4!Krha27^0f6t&s+#l_C9l;<z`?<19M_(PJh7%C7s`@E_7w6Ed?|A`zWGDbjo%e9 zn2WZggNZsG;-5`n`@VA5E^Cv8*|A zxzWDZ%HyjQ-FKl$vbjBtnRWR0W?q>+dYMs;pV8Q7`JN}9wSWKrCdS4(S9Z#`pUI$A zZO?%%Az?`O1wO*c^()hOg4nvtVpdBEcPlJ?uByueEVVV>em)Lr`kbE)oKOh@rf=jn z!k5cw3c4}NbxS-RmpOW!_l}YfDJcuM^}HXn6mGsbu%WaB+THh_`F6V1WWQA zoDtGEU-1Qa!x7`sR<+tj;1UPRZrN*T`*fCOGED+5L5yeg`wVIs)!F^K82=|dr+NPB zf7$zgNCP({{J8laIIQ__`F?rO%?x3{-9}~o-*&hEzAGoU>2>wgx8b#t{gXD&1ZLb+ zmUqA<4~oBT{@)GE0l-2PIM@#y*nioX@^{%;`NgTFvmAca&WZ!pb>LOepjr^rc8mv2 zbY6bQDg|r?E(cDKdy)1M3)zx+1Yvj>N}C2(#9=tR_D;QBQoc*4E_ zKVcPMn|OiG?EQMb)~Wrq^A!dzk_IgdM`{Pl7jazzMo80=1?93+GCyB;y?=EHa8?ND zMDUt(pi4oe?}7!|FP!}xe>qwDP7wLBuGuK}->w(CX8|L@7r1O0w0IoWWd!z3Mgx;t ffw^zSf&c7ro1>*J?pXYk0SG)@{an^LB{Ts5#C!GX literal 0 HcmV?d00001 diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index ab6f87d25..d7ffb877c 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -1,9 +1,9 @@ { - "title": "Wave Function Collapse - Overlapping Model", + "title": "Wave Function Collapse: Overlapping Model", "videoNumber": "186", - "description": "", - "videoId": "", - "nebulaSlug": "codingtrain-coding-challenge-186-wfc-overlapping-model", + "description": "Wave Function Collapse is an algorithm for procedural image generation. In this long overdue follow-up to my tiled model video, I dive into the overlapping model, coding it step by step (complete with struggles and messy debugging interludes) in JavaScript with p5.js.", + "videoId": "5iSAvzU2WYY", + "nebulaSlug": "codingtrain-coding-challenge-186-wave-function-collapse", "date": "2025-01-28", "languages": ["p5.js", "JavaScript"], "topics": ["wave function collapse", "overlapping model", "procedural generation"], @@ -11,106 +11,87 @@ "relatedChallenges": ["171-wave-function-collapse"], "timestamps": [ { "time": "0:00:00", "title": "Introduction" }, - { "time": "0:01:12", "title": "The Nature of Code" }, - { "time": "0:02:20", "title": "References" }, - { "time": "0:08:19", "title": "Write a function to extract tiles from a source image" }, - { "time": "0:14:32", "title": "Write a function to copy tiles" }, - { "time": "0:21:30", "title": "Add a list of allowed adjacencies to the Tile object" }, - { "time": "0:24:34", "title": "Write an overlapping() function" }, - { "time": "0:32:20", "title": "Look at the first tile's neighbors" }, - { "time": "0:43:30", "title": "Add a Cell class" }, - { "time": "0:44:15", "title": "Add a grid of Cells" }, - { "time": "0:46:21", "title": "Retrieve previous WFC code" }, - { "time": "0:50:50", "title": "Write a reduceEntropy() function" }, - { "time": "0:55:56", "title": "Add a function to render the center pixel" }, - { "time": "0:58:05", "title": "Filter by the valid options" }, - { "time": "1:01:57", "title": "Use recursion to reduce entropy" }, - { "time": "1:05:32", "title": "Add depth of recursion" }, - { "time": "1:06:32", "title": "We have WFC!" }, - { "time": "1:09:42", "title": "Fix mistake" }, - { "time": "1:11:26", "title": "Start refactoring code" }, - { "time": "1:18:41", "title": "Add a console.log if alogrithm gets stuck" }, - { "time": "1:21:38", "title": "Optimizations" }, - { "time": "1:26:28", "title": "Discuss redundant tiles" }, - { "time": "1:28:30", "title": "Rotations and Reflections" }, + { "time": "0:01:12", "title": "The Nature of Code book!" }, + { "time": "0:02:20", "title": "WFC Resources and References" }, + { "time": "0:08:19", "title": "Extracting tiles from a source image" }, + { "time": "0:21:30", "title": "Calculating adjacency rules for tiles" }, + { "time": "0:24:34", "title": "Checking for overlapping pixel colors" }, + { "time": "0:32:20", "title": "Debugging tile adjacencies" }, + { "time": "0:43:30", "title": "Creating a Cell class" }, + { "time": "0:46:21", "title": "Incorporate code from WFC tile model" }, + { "time": "0:50:50", "title": "Reduce entropy of neighboring tiles" }, + { "time": "0:55:56", "title": "Rendering the center pixel for each tile" }, + { "time": "0:58:05", "title": "Cross checking valid tile options" }, + { "time": "1:01:57", "title": "Recursive entropy reduction" }, + { "time": "1:05:32", "title": "Limit recursion depth" }, + { "time": "1:06:32", "title": "Challenge complete?" }, + { "time": "1:08:26", "title": "Bugs found between Day 1 and Day 2" }, + { "time": "1:09:13", "title": "Starting Day 2" }, + { "time": "1:10:02", "title": "Correcting pixel color if statement" }, + { "time": "1:11:16", "title": "Refactoring redundant code" }, + { "time": "1:17:26", "title": "Running out of tile options" }, + { "time": "1:21:24", "title": "Optimizing the code" }, + { "time": "1:23:47", "title": "Rendering average pixel color of remaining tile options" }, + { "time": "1:26:23", "title": "How to handle redundant tiles?" }, + { "time": "1:28:30", "title": "More tiles with rotations and reflections" }, { "time": "1:29:39", "title": "Additional performance optimizations" }, - { "time": "1:31:40", "title": "Outro" } + { "time": "1:31:40", "title": "Thanks for watching!" } ], "codeExamples": [ { - "title": "WFC Overlapping", - "description": "The sketch implements the overlapping model.", - "image": "1.png", + "title": "Wave Function Collapse: Overlapping Model", + "description": "Unoptimized code exactly matching the video.", + "image": "wfc.png", "urls": { - "p5": "https://editor.p5js.org/codingtrain/sketches/PX0Hn6TF8" + "p5": "https://editor.p5js.org/codingtrain/sketches/SI0c2D_tQ" } }, { - "title": "WFC Overlapping - Shannon entropy", - "description": "This sketch adds Shannon entropy.", - "image": "1.png", + "title": "WFC Overlapping Model Refactored", + "description": "Refactored code with optimizations.", + "image": "wfc_refactored.png", + "urls": { + "p5": "https://editor.p5js.org/codingtrain/sketches/2sV4KtcoD" + } + }, + { + "title": "WFC Overlapping Model: Shannon entropy", + "description": "This sketch counts tile frequency and incorporates entropy formula.", + "image": "wfc_entropy.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/PX0Hn6TF8" } }, { - "title": "WFC Overlapping - Rotations and Reflections", + "title": "WFC Overlapping Model: More tiles!", "description": "This sketch adds tile rotations and reflections", - "image": "1.png", + "image": "wfc_rot_reflect.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/z_N2TVjRH" } - }, - { - "title": "WFC Overlapping - Restart", - "description": "This sketch restarts WFC if there are no more valid choices.", - "image": "1.png", - "urls": { - "p5": "https://editor.p5js.org/codingtrain/sketches/2sV4KtcoD" - } - }, - { - "title": "WFC Overlapping - Refactored", - "description": "This sketch refactors the code and adds performance enhancements.", - "image": "1.png", - "urls": { - "p5": "https://editor.p5js.org/codingtrain/sketches/paJcuQLI0" - } - } + } ], "groupLinks": [ { "title": "References", "links": [ - { - "icon": "πŸ“•", - "title": "The Nature of Code", - "url": "https://natureofcode.com/", - "description": "The Nature of Code book (2024 p5.js edition)" - }, - { - "icon": "πŸ›’", - "title": "Nature of Code shop", - "url": "https://store.natureofcode.com/products/the-nature-of-code", - "description": "The Nature of Code book (2024 p5.js edition) is now available for purchase!" - }, { "icon": "πŸ—„", - "title": "Wave Function Collapse Algorithm", + "title": "Wave Function Collapse GitHub Repo", "url": "https://github.com/mxgmn/WaveFunctionCollapse", - "description": "The original GitHub repository from mxgmn for the Wave Function Collapse algorithm." + "description": "Maxim Gumin's source code and documentation for Wave Function Collapse." }, { "icon": "πŸ—„", "title": "Model Synthesis", "url": "https://paulmerrell.org/model-synthesis/", - "description": "Paul Merrell's 2009 PhD Thesis that is a predecessor to WFC." + "description": "Documentation of Paul Merrell's work on Model Synthesis." }, { "icon": "πŸ—„", "title": "Procedural Generation with Wave Function Collapse", "url": "https://www.gridbugs.org/wave-function-collapse/", - "description": "Article on using WFC for procedural generation." + "description": "Wave Function Collapse overlapping model algorithm walk through." }, { "icon": "πŸ—„", @@ -120,27 +101,27 @@ }, { "icon": "πŸ”—", - "title": "p5 copy()", + "title": "p5.js copy()", "url": "https://p5js.org/reference/p5/copy/", - "description": "Reference for the copy function" + "description": "p5.js reference page for copy() function" }, { "icon": "πŸ”—", - "title": "Github issue RE console.log problem", + "title": "p5.js web editor console log GitHub issue", "url": "https://github.com/processing/p5.js-web-editor/issues/3178", - "description": "Cannot console.log objects having circular references." + "description": "Issue discussing console.log and objects with circular references." }, { "icon": "πŸ”—", - "title": "concat() function", + "title": "JavaScript concat() method", "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat", - "description": "Reference for the concat function." + "description": "JavaScript documentation for array concat() method." }, { "icon": "πŸ”—", - "title": "randomSeed()", + "title": "p5.js randomSeed()", "url": "https://p5js.org/reference/p5/randomSeed/", - "description": "Reference for the randomSeed function" + "description": "p5.js reference page for randomSeed() function" } ] }, @@ -151,25 +132,60 @@ "icon": "πŸŽ₯", "title": "Pixel Array", "url": "/tracks/p5-tips-and-tricks/more-p5/pixel-array", - "description": "Coding Train video with explanation of tracking 2D grid in 1D array (for pixels)." + "description": "Video tutorial on how to work with pixel array in p5.js." }, { "icon": "πŸŽ₯", "title": "Modulo Operator", "url": "https://www.youtube.com/watch?v=r5Iy3v1co0A", - "description": "Golan Levin explains what modulus means and its applications in creative coding with p5.js and Processing." + "description": "Video tutorial with Golan Levin explaining modulo operator." }, { "icon": "πŸŽ₯", "title": "Array Functions: filter() - Topics of JavaScript/ES6", "url": "/tracks/topics-in-native-javascript/js/array-filter", - "description": "This video covers the JavaScript Array higher order function filter()." + "description": "Video tutorial on higher order array function filter()." }, { "icon": "πŸŽ₯", "title": "Arrow Function", "url": "/tracks/topics-in-native-javascript/js/arrow-functions", - "description": "Coding Train video covering JavaScript arrow (=>) function." + "description": "Video tutorial on JavaScript arrow notation." + } + ] + }, + { + "title": "Creative Works Featured", + "links": [ + { + "icon": "🎨", + "title": "Townscaper", + "url": "https://www.townscapergame.com/", + "description": "Created by Oskar StΓ₯lberg, 3D WFC system that creates cute little houses, arches, stairways, bridges and lush backyards." + }, + { + "icon": "🎨", + "title": "unity-wave-function-collapse", + "url": "https://selfsame.itch.io/unitywfc", + "description": "A fork of Wave Function Collapse with tools for the Unity Game engine by @ExUtumno." + }, + { + "icon": "🎨", + "title": "Super Mario WFC", + "url": "https://observablehq.com/@makio135/super-mario-wfc", + "description": "Generating variations of Super Mario Bros worlds with Wave Function Collapse." + }, + { + "icon": "🎨", + "title": "Zelda WFC", + "url": "https://observablehq.com/@makio135/zelda-wfc", + "description": "Generating variations of Zelda maps with Wave Function Collapse." + }, + { + "icon": "🎨", + "title": "Infinite procedurally generated city", + "url": "https://marian42.de/article/wfc/", + "description": "a game where you walk through an infinite city that is procedurally generated as you walk." } ] } From ecfa8774c3d9cd887a8dbe5a504518fd741e73c6 Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Sat, 25 Jan 2025 10:55:55 -0500 Subject: [PATCH 06/12] setting date to today for tests --- content/videos/challenges/186-wfc-overlapping-model/index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index d7ffb877c..ba26fd351 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -4,7 +4,7 @@ "description": "Wave Function Collapse is an algorithm for procedural image generation. In this long overdue follow-up to my tiled model video, I dive into the overlapping model, coding it step by step (complete with struggles and messy debugging interludes) in JavaScript with p5.js.", "videoId": "5iSAvzU2WYY", "nebulaSlug": "codingtrain-coding-challenge-186-wave-function-collapse", - "date": "2025-01-28", + "date": "2025-01-25", "languages": ["p5.js", "JavaScript"], "topics": ["wave function collapse", "overlapping model", "procedural generation"], "canContribute": true, From 4b9d31095bd3e098295e3874f7a0a6ffef5211e9 Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Sat, 25 Jan 2025 10:58:10 -0500 Subject: [PATCH 07/12] adding index image --- .../186-wfc-overlapping-model/index.png | Bin 0 -> 57448 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/videos/challenges/186-wfc-overlapping-model/index.png diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.png b/content/videos/challenges/186-wfc-overlapping-model/index.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc0a25ebf38e7d9f2ae49d39962a5898a8096cf GIT binary patch literal 57448 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 KzdveL_WuFnWCRTW literal 0 HcmV?d00001 From 5560ec0789bd2bca50e94daf3538dae065e0ca9e Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Sat, 25 Jan 2025 14:24:46 -0500 Subject: [PATCH 08/12] add more related challenges --- content/videos/challenges/171-wave-function-collapse/index.json | 2 +- content/videos/challenges/186-wfc-overlapping-model/index.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/videos/challenges/171-wave-function-collapse/index.json b/content/videos/challenges/171-wave-function-collapse/index.json index da06288bf..f4f8d4772 100644 --- a/content/videos/challenges/171-wave-function-collapse/index.json +++ b/content/videos/challenges/171-wave-function-collapse/index.json @@ -8,7 +8,7 @@ "languages": ["p5.js", "JavaScript"], "topics": ["wave function collapse", "generative art"], "canContribute": true, - "relatedChallenges": ["10-dfs-maze-generator", "162-self-avoiding-walk", "165-slide-puzzle"], + "relatedChallenges": ["10-dfs-maze-generator", "162-self-avoiding-walk", "165-slide-puzzle", "186-wfc-overlapping-model"], "timestamps": [ { "time": "0:00", "title": "Day 1! Wave Function Collapse!" }, { "time": "2:00", "title": "Entropy in Sudoku." }, diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index ba26fd351..90ba204ae 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -8,7 +8,7 @@ "languages": ["p5.js", "JavaScript"], "topics": ["wave function collapse", "overlapping model", "procedural generation"], "canContribute": true, - "relatedChallenges": ["171-wave-function-collapse"], + "relatedChallenges": ["10-dfs-maze-generator", "165-slide-puzzle", "171-wave-function-collapse"], "timestamps": [ { "time": "0:00:00", "title": "Introduction" }, { "time": "0:01:12", "title": "The Nature of Code book!" }, From b628301bda20070dd96cb0bbcdc07151e2c46d1a Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:12:10 -0500 Subject: [PATCH 09/12] update featured challenge --- content/pages/challenges/index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pages/challenges/index.json b/content/pages/challenges/index.json index b127b3687..08213465a 100644 --- a/content/pages/challenges/index.json +++ b/content/pages/challenges/index.json @@ -2,5 +2,5 @@ "title": "Challenges", "description": "Ready to apply what you’ve learned in the Tracks? Try a Challenge! These one-off project videos build off concepts introduced in Tracks and may have prerequisites (listed on the challenge page itself).", "featuredText": "Featured Challenge:", - "featuredChallenge": "171-wave-function-collapse" + "featuredChallenge": "186-wfc-overlapping-model" } From f9a858b8e0c7b2bda9cdefd4edeab2b3d638f996 Mon Sep 17 00:00:00 2001 From: Kathy <65121394+kfahn22@users.noreply.github.com> Date: Sat, 25 Jan 2025 16:50:20 -0500 Subject: [PATCH 10/12] Update index.json add new video to homepage --- content/pages/homepage/index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pages/homepage/index.json b/content/pages/homepage/index.json index 149562145..0ed0965b7 100644 --- a/content/pages/homepage/index.json +++ b/content/pages/homepage/index.json @@ -31,7 +31,7 @@ "title": "Challenges", "description": "Watch Dan take on Coding Challenges in p5.js and Processing. The challenge topics include algorithmic art, machine learning, simulation, generative poetry, and more.", "featured": [ - "4-purple-rain", + "186-wfc-overlapping-model", "152-rdp-algorithm", "171-wave-function-collapse", "178-climate-spiral", From 460c38e3d4ae09b3b4fa9d16430c065a82f73acf Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Sat, 25 Jan 2025 20:30:29 -0500 Subject: [PATCH 11/12] adding Processing ports --- .../171-wave-function-collapse/index.json | 7 ++++--- .../challenges/186-wfc-overlapping-model/index.json | 13 +++++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/content/videos/challenges/171-wave-function-collapse/index.json b/content/videos/challenges/171-wave-function-collapse/index.json index da06288bf..8f692e2be 100644 --- a/content/videos/challenges/171-wave-function-collapse/index.json +++ b/content/videos/challenges/171-wave-function-collapse/index.json @@ -39,12 +39,13 @@ "description": "WFC PCB board generation pattern.", "image": "wfc.jpg", "urls": { - "p5": "https://editor.p5js.org/codingtrain/sketches/_kbz6Xq7l" + "p5": "https://editor.p5js.org/codingtrain/sketches/_kbz6Xq7l", + "processing": "https://github.com/CodingTrain/Wave-Function-Collapse/tree/main/Processing/WFC_Tiled_Model" } }, { - "title": "Wave Function Collapse - Expanded", - "description": "GitHub repo for expanded and corrected WFC PCB board example.", + "title": "Wave Function Collapse - More!", + "description": "GitHub repo for expanded and optimized Wave Function Collapse Code.", "image": "wfc.jpg", "urls": { "other": "https://github.com/CodingTrain/Wave-Function-Collapse" diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index ba26fd351..f02091730 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -40,7 +40,7 @@ "codeExamples": [ { "title": "Wave Function Collapse: Overlapping Model", - "description": "Unoptimized code exactly matching the video.", + "description": "Raw code exactly matching the video.", "image": "wfc.png", "urls": { "p5": "https://editor.p5js.org/codingtrain/sketches/SI0c2D_tQ" @@ -67,7 +67,16 @@ "description": "This sketch adds tile rotations and reflections", "image": "wfc_rot_reflect.png", "urls": { - "p5": "https://editor.p5js.org/codingtrain/sketches/z_N2TVjRH" + "p5": "https://editor.p5js.org/codingtrain/sketches/z_N2TVjRH", + "processing": "https://github.com/CodingTrain/Wave-Function-Collapse/tree/main/Processing/WFC_Overlapping_Model" + } + }, + { + "title": "Wave Function Collapse - More!", + "description": "GitHub repo for expanded and optimized Wave Function Collapse Code.", + "image": "wfc.png", + "urls": { + "other": "https://github.com/CodingTrain/Wave-Function-Collapse" } } ], From ad77cfb84f8f113ab96f1304c7843f25da9b5aa2 Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Sun, 26 Jan 2025 18:49:47 -0500 Subject: [PATCH 12/12] Update index.json --- content/videos/challenges/186-wfc-overlapping-model/index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/videos/challenges/186-wfc-overlapping-model/index.json b/content/videos/challenges/186-wfc-overlapping-model/index.json index a39c63184..376e6ee39 100644 --- a/content/videos/challenges/186-wfc-overlapping-model/index.json +++ b/content/videos/challenges/186-wfc-overlapping-model/index.json @@ -4,7 +4,7 @@ "description": "Wave Function Collapse is an algorithm for procedural image generation. In this long overdue follow-up to my tiled model video, I dive into the overlapping model, coding it step by step (complete with struggles and messy debugging interludes) in JavaScript with p5.js.", "videoId": "5iSAvzU2WYY", "nebulaSlug": "codingtrain-coding-challenge-186-wave-function-collapse", - "date": "2025-01-25", + "date": "2025-01-26", "languages": ["p5.js", "JavaScript"], "topics": ["wave function collapse", "overlapping model", "procedural generation"], "canContribute": true,