From CG community
Jump to navigation Jump to search

tiwariji264: hi

mandajm: Salut

Default avatar.png concac: hi

Default avatar.png BrokenSausage_ca6d: Yoo

Default avatar.png concac: nhậu

Default avatar.png concac: nhậu

Default avatar.png KrasserTyp: Astrobytes

Default avatar.png KrasserTyp: u here?

Default avatar.png TheZombiePony_36a9: dance to this bitch if u gang bang

Default avatar.png TheZombiePony_36a9: i dont give a fuck if we dont bang the same thing CRIP

Default avatar.png KrasserTyp: crikked

Default avatar.png TheZombiePony_36a9: duh aint fookin wit members FR FR

Default avatar.png TheZombiePony_36a9: :metal:

Default avatar.png KrasserTyp: oi m8 u talkin smack rn fr

Default avatar.png TheZombiePony_36a9: fuck u

Default avatar.png KrasserTyp: fock u

Default avatar.png KrasserTyp: u rly wanna be fightin rn?

Default avatar.png TheZombiePony_36a9: 1 thang an am pullin up wit da cripz no cap

Default avatar.png KrasserTyp: imma bust yo ass eZ clap, no kap

Default avatar.png TheZombiePony_36a9: no cap

Default avatar.png TheZombiePony_36a9: hey simon

Default avatar.png KrasserTyp: naw bruh

Default avatar.png KrasserTyp: no kap

Default avatar.png TheMightyChild_7770: moin

Default avatar.png TheZombiePony_36a9: moin

Default avatar.png KrasserTyp: hallo

Default avatar.png KrasserTyp: du pleb

Default avatar.png TheMightyChild_7770: yo krassertyp

Default avatar.png TheZombiePony_36a9: wie findet man den chat? bei meim main gehts nicht

Default avatar.png KrasserTyp: bs

Default avatar.png KrasserTyp: bruh

Default avatar.png TheMightyChild_7770: durchn wandschrank

Default avatar.png TheMightyChild_7770: narnia

Default avatar.png KrasserTyp: in my crib, we dont talk shit like dat

Default avatar.png TheZombiePony_36a9: duh

Default avatar.png TheZombiePony_36a9: fr jetzt ich kann auf meim main nicht aufn chat xD

Default avatar.png KrasserTyp: mein acc so shit

Default avatar.png KrasserTyp: main*

Uljahn: AutomatonNN: moin

AutomatonNN: eulerscheZahl is there a way to see a replay of your code

crix443_13LOOD_1N_13LOOD_OUT: tryhards

crix443_13LOOD_1N_13LOOD_OUT: driveby wit da choppa rrrrrre re

Default avatar.png KrasserTyp: bra bra

Default avatar.png KrasserTyp: skrrrrrr

Default avatar.png KrasserTyp: ye

crix443_13LOOD_1N_13LOOD_OUT: :skull_crossbones:

crix443_13LOOD_1N_13LOOD_OUT: gang gang 4 life

crix443_13LOOD_1N_13LOOD_OUT: do tha crip walk

crix443_13LOOD_1N_13LOOD_OUT: do tha crip walk

crix443_13LOOD_1N_13LOOD_OUT: do tha crip walk

crix443_13LOOD_1N_13LOOD_OUT: do tha crip walk

crix443_13LOOD_1N_13LOOD_OUT: do tha crip walk

crix443_13LOOD_1N_13LOOD_OUT: do tha crip walk

crix443_13LOOD_1N_13LOOD_OUT: :bomb: u finna die tonight

Default avatar.png KrasserTyp: skr

Default avatar.png KrasserTyp: WE LITTT

Default avatar.png nanodroidplplpl: 0-0p[[[]

Default avatar.png nanodroidplplpl: p[]

Default avatar.png thienok: dont understand

oetzi: you dont have to, belive me

Default avatar.png mattnguyengit: lol

Default avatar.png LeuLeu: nope

Default avatar.png mattnguyengit: very easy for my very old professor

Default avatar.png mattnguyengit: he is not here

Default avatar.png LeuLeu: nope bros

Default avatar.png LeuLeu: goodluck

jacek: good afternoon

Default avatar.png tanmaycodernovice: @rafaelSorel bro help

rafaelSorel: help ?

rafaelSorel: code shared

000918881337: What a funny website this is

caubeloatchoat24: Hello y

Default avatar.png AroCode: hello


caubeloatchoat24: Let clash bro !

000918881337: okay bro

leduyquang753: The wait time for a clash to start is usually longer than the time in-clash itself LOL.

Default avatar.png HelloWorld183L: hi guys, I'm confused with the ASCII Art puzzle because it gives me the widths and heights of the letters as input, but it claims that all letters are the same height and width. What is the point of these inputs if they're meant to be the same (or is it meant to be the heights and widths of ALL letters in the input)?

jacek: its per input

jacek: different test case will have different width and height

Default avatar.png HelloWorld183L: ah right, thanks for clarifying

jacek: i think i invented new game tree search

jacek: jacekmax

dbdr: it's the fashion, jacek :D

dbdr: what does it do?

jacek: no really, whats im using for othello isnt minimax nor mcts

Astrobytes: prune array?

jacek: it mostly resembles mcts w/ 0depth ept

jacek: but i expand every children, make eval, then backpropagate eval to parents in negamax way

dbdr: negamax backprop in MCTS is not new

jacek: oh?

jacek: i have no rollout, no 'score', only eval and visits

MSmits: thats what I do in Oware and Onitama jacek

Astrobytes: ^

jacek: so its nothingn new? :scream:

Astrobytes: (but Smits' is better than mine :P)

MSmits: nope, but dont feel discouraged, it's pretty cool if you came up with that on your own

MSmits: i didnt

MSmits: but, read more of my spamwalls, saves some time :P

MSmits: i guess you can look them up now that chat is saved

jacek: i thought you were talking about replacing rollout with just eval

MSmits: what is the difference?

jacek: nothing about backpropagating negamax way

MSmits: oh I see

MSmits: you're right that is somewhat different

MSmits: but also not new, i've read about that

MSmits: you need to be careful with the horizon effect

MSmits: if depth varies

dbdr: depth always varies in MCTS, no?

MSmits: yeah, but his is not mcts

MSmits: he's doing a minimax backprop thingy

dbdr: it's a mcts variant

MSmits: not exactly though

MSmits: he's overwriting scores, not adding up

dbdr: the depth variation comes from the exploration

MSmits: with mcts the node gets multiple scores backpropagated to them and they average out to a bad or good value

MSmits: he does a negamax backprop thingy and keeps the best/worst scores in minimax fashion

MSmits: horizon effect might be much stronger in that case

dbdr: the depth variation comes from the exploration

dbdr: backpropagation is othogonal

jacek: yeah, horizon effect, my bot is stronger against strong but weaker against the weak

MSmits: what i mean is, eval goes up and down hard depending on whose turn i tis

MSmits: if you backprop with ordinary mcts, this averages out

jacek: odd-even effect

MSmits: yes

MSmits: i am wondering how this affects your backprop

MSmits: you can include "who's turn it is" in your eval

MSmits: mitigate this effect


MSmits: thanks voidasi

MSmits: now he's spamming me emotes :P

jacek: hm?

MSmits: it's what I get for responding to the troll

dbdr: you got yourself a fan

MSmits: yep, they are all positive emotes though

MSmits: if I want to feel happy, I can just click on his tab

MSmits: just finished converting my oware endgame DB

MSmits: 4 GB

MSmits: hope there's no bugs :P

dbdr: wow

MSmits: took 30 mins to generate in C++, then an hour to convert to something I can put in a C# persistent dictionary

dbdr: fixed number of seeds left?

MSmits: yes, 15

MSmits: any more than that and I get RAM-issues

jacek: 15 seed left solved?

dbdr: nice

MSmits: yeah

dbdr: now fit 4GB in 100K chars ;)

MSmits: I did this taking the 200 turn limit into account btw

jacek: how many states is that

MSmits: otherwise it's actually harder due to loops

MSmits: lemme check

dbdr: so how do you plan to use it? for meta-mcts?

MSmits: 17383859 * 180 turns

MSmits: so 3 billion

jacek: i wonder if you could use supervised learning for NN for the endgame. you get perfect labels for endgames

MSmits: dbdr yeah meta mcts

jacek: and NN would 'compress' that

dbdr: lossy compression

MSmits: jacek, I suggested something similar to re curse before

MSmits: just using the meta mcts states for supervised learning

MSmits: so not exactly end game, but similar

MSmits: he said it wouldnt work

MSmits: dunno why, he didnt explain

dbdr: he's using it now and doesn't want you to ;)

MSmits: hehe maybe, he doesn't lie I think though, just keeps some things to himself :)

MSmits: which is fine

dbdr: yeah, that's reasonable

dbdr: lying would be very unethical

MSmits: i can't really do that. I can barely keep things to myself

MSmits: this meta mcts is messy though. I am using 3 different trees

MSmits: top tree which is meta mcts, middle tree, which is my bot, then bottom tree which is the end game db

MSmits: i guess that would work for any game which converges and has a fixed start

MSmits: think this is how they solved checkers also

dbdr: yes, they use endgame DBs

MSmits: yeah, up to 10 pieces I think

MSmits: crazy big end game db

MSmits: btw dbdr, as for coding it into my oware bot. I do have a endgame db, but it's not hardcoded. I generate it in the first 1 second.

MSmits: just 6 seeds

dbdr: yes, had to be smaller :D

dbdr: still nic

dbdr: nice

dbdr: does it make a big difference?

MSmits: yeah, it helped a little bit i think, didnt hurt at least

MSmits: sometimes I see re curse or another NN actually make a mistake according to the DB

MSmits: i will draw a game i should have lost

MSmits: or something like that

MSmits: 6 seeds can be hard to solve still, because of the infinite loops

MSmits: also I don't think they have a solver

MSmits: and if they do, it just goes a few layers deep

Hjax: hello everyone

MSmits: hi

Hjax: the boss timed out

Hjax: that doesnt seem good

MSmits: darkhorse did say he had a timeout bug and he fixed it

Hjax: can the boss be updated

MSmits: probably

MSmits: how often does it happen\/

Hjax: not very often

Hjax: it just seems like something that should never happen

MSmits: well i always get *some* timeouts due to timing inaccuracy on CG servers I think

Hjax: i only search for 100 of my 150 ms

Hjax: because i time out otherwise

MSmits: wow that's a big buffer

Hjax: i get huge GC pauses

Hjax: which kill me

MSmits: mmh you can try and use an object pool to avoid GC?

Hjax: when i tried that it was super slow

Hjax: like, 1/5th the speed

MSmits: how is that possible?

MSmits: you sure you did it right?

MSmits: it should not be slower

MSmits: unless java does something weird

Hjax: java does many things weird

Hjax: this is why im trying to port to rust

MSmits: but I mean... an object pool is generated before the game starts

MSmits: after that you're just referencing it

Default avatar.png Ashraful: Why rust over python?

darkhorse64: For the boss, I removed the solver. The timeouts I had were related to pass moves. This is not the case in the replay. I set my time limits very high 1000ms/150ms. May be a hiccup.

Hjax: Ashraful python is horrifically slow

Hjax: and yeah thats what i did MSmits, im not sure why it was so slow

Hjax: java has to chase more references around i guess

MSmits: Ashraful: Python = fast development, slow program. C++ or Rust or similar = slow development, fast program.

MSmits: speed is not always important. But for multiplayer arena's it often is

Hjax: fast development fast program when?

MSmits: never ?

Hjax: :(

MSmits: It helps if you're really good with rust I guess

MSmits: skill also speeds up development

Hjax: yeah rust seems like its possible to develop somewhat quickly in if you are good at it

MSmits: well faster than in C++ no doubt

MSmits: c++ is a horrible language

Hjax: closures are really powerful, and lots of safe guards to prevent you from doing stupid stuff

MSmits: as long as the safeguards arent slowing you down

Hjax: become one with the borrow checker

MSmits: whats that

Hjax: the bit of rusts compiler that enforces the ownership rules that make rust safe

MSmits: ah ok

Hjax: new rust developers (like me) get into fights with it

MSmits: thats ok, as long as you win

eulerscheZahl: yay, no more CoC invites!

tomatoes: :tada:

Hjax: i see euler has already changed his status

eulerscheZahl: :P

Hjax: did automaton actually call you a noob?

eulerscheZahl: yes, do you think my new tagline is a lie?

eulerscheZahl: AutomatonNN what's your memory on this?

AutomatonNN: game is something to do

Hjax: AutomatonNN is euler a noob?

AutomatonNN: efficiency to work with a hard time to use contest code

Hjax: wow it didnt even ping you

Hjax: maybe its reformed

eulerscheZahl: it got some updates

eulerscheZahl: initially it pinged me in 1 out of 4 sentences maybe

Default avatar.png boinkus: why does js do this to me

Default avatar.png boinkus: Found: "-0" Expected: "0"

icecream17: Technically, -0 has a different "signed bit" than +0....

Default avatar.png boinkus: yeah but i want to die

Hjax: thats not true for twos complement binary numbers

Hjax: which is the representation most (all?) programming languages use

Hjax: do floats use a sign bit?

Hjax: i guess its true for floats, not for ints

eulerscheZahl: CG is just comparing by characters, not actual values



I guess javascript uses the system usually called "double" in Java or C# (because it says)

Default avatar.png boinkus: man idk anymore I found a way around it tho

Default avatar.png boinkus: I just added 0 to it

icecream17: that's nice

icecream17: wow that sounds ridiculous =D

icecream17: don't know why im smiling

struct: hello

Default avatar.png boinkus: Hey

icecream17: oh no

MSmits: :scream_cat:

Default avatar.png boinkus: whats happened

icecream17: my input is bad and i dont know why

MSmits: :crying_cat_face:


icecream17: Oh I figured it out now

MSmits: why would the opponent input be "oh wait" ?

icecream17: no no no lol

icecream17: ah. i see, i output '1 ' + sorted.join(' 1 ')

icecream17: Yes! I'm gonna beat wood 2!!!!

Default avatar.png Ashraful: Search on google "Bangla meaning of huga"

icecream17: hmm. i've never heard of bangla or huga...

Default avatar.png Ashraful: then search

struct: Hjax where is the rus t bot?

struct: tomatoes what are you currently using?

Hjax: the rust bot will be done when i understand enough rust to finish it

Hjax: this weekend probably

Hjax: i didnt feel like working on it last night

tomatoes: mcts with evals

icecream17: everyone's spawning in exactly the same place as me =/

Default avatar.png Ashraful: Everyone is spawning on huga

tomatoes: not sure what's important and how much

tomatoes: eval kinda manually bruteforced

jacek: thats minimax :v

tomatoes: but it has ucb1

jacek: then tomatomax

struct: so you go to certain depth and eval?

Astrobytes: minimato

Hjax: i think tomatoes is doing 0 depth evals now

Hjax: just replaced the rollout with the heuristic function

DiL: hi! disableChat is back! very apreciated! :-)

tomatoes: yes, and eval normalized to -1;1 and used as wins

tomatoes: somehow it works

Default avatar.png tendai1km: cc

Hjax: yeah i normalized to 0/1

Hjax: i was wondering if its better to not normalize, and convert to some win %

Hjax: to make the algorithm favor paths that give bigger heuristic scores

Astrobytes: Oware all over again

jacek: well it starts with o

jacek: as well onitama

Astrobytes: Still to do Onitama

MSmits: oltimate tic tac toe

Astrobytes: ffs lol

tomatoes: ucb skewed without normalizing

MSmits: the exploration parameter can be used to normalize any score

MSmits: the only reason to do something like this inside the eval is to cap the score so that it doesnt go out of hand in some specific situations

tomatoes: i also have preffered and penalties there :expressionless:

tomatoes: which decrease over visits

MSmits: ah yes, well you'll need 1 less parameter than you have terms in your UCB

MSmits: one can be 1, the others can be fitted

MSmits: no point to having a constant in front of all of them

tomatoes: and there is almost no random with eval, hard to bench locally vs old version

Hjax: tomatoes you beat me in ide

Hjax: with 3k playouts

Hjax: :(

tomatoes: and i hardcoded first turn and set first to 2s

tomatoes: no need to explore other

struct: do the 2 sec help anything?

struct: or would 1 sec be neough

struct: I just added it because Im bad and 1 sec isnt enough time for me

Hjax: its nice for tree reuse

tomatoes: initialization is very fast, almost all 2s are usual mcts stuff

Default avatar.png tendai1km: loz me nghia

jacek: yay for lucky oware resubmit

Nazrul: okay, got it

Astrobytes: nice jacek

Spacekiddx: Any resource for learning DFS? anyone?


Spacekiddx: Other than "geeksforgeeks"?

Default avatar.png JBM: oddly specific requirement

Default avatar.png JBM: what other reasonable resources should we exclude?

Default avatar.png JBM: probably wikipedia

Astrobytes: CLRS. Definitely don't consult that tome.

PatrickMcGinnisII: othello is being pain in my butt. I can only get 3k nodes somewhere in the middle of depth 5 before timeout

Astrobytes: Add an eval

PatrickMcGinnisII: and it plays horribly compared to my board score (no deepth) evaluator

Astrobytes: Use that eval at depth 4 and backprop it

Astrobytes: Or write in C :P

PatrickMcGinnisII: White is Arena code (0 depth), black is min/max w/ max nodes at 2,837


Astrobytes: Oh sorry, I thought you were doing MCTS

PatrickMcGinnisII: depth 4 @ 1,144 nodes still loses

Astrobytes: Well, something is wrong

PatrickMcGinnisII: min/max might work at late game, but decisions in early mid game might as well be random

struct: minmax depth 4 should always beat depth 0


Astrobytes: a/b minimax depth = whatever it reaches

Astrobytes: You may be evaluating the wrong things, or evaluating the right things wrong

jacek: or evaluating wrong things right

PatrickMcGinnisII: yea, i think my board scoring is a little wonky

PatrickMcGinnisII: but its not getting deep enough

PatrickMcGinnisII: so i guess I'll see how many i can get at MC

Astrobytes: There's a guy in Wood 1 who had depth 4 minimax and was top in Wood 2

jacek: plot twist: its aztrobytez

Astrobytes: Nope

PatrickMcGinnisII: I've optimized the board and move finder routines ... i don't think alpha-beta is gonna get me any better

Astrobytes: So don't give up on it Patrick

Hjax: yeah if alpha beta is making your bot worse, you have a bug

jacek: passing moves error?

PatrickMcGinnisII: no was trying to think of new diresction...min/max is failing... I'll redo the eval, I'm using a weighted board

Hjax: if your eval at depth 1 wins games, then minimax at depth 4 should win more games

Astrobytes: You can use the weighted board but definitely 100% don't make that your only eval

PatrickMcGinnisII: Hjax I would think so too, hmmm

PatrickMcGinnisII: I'm using a 16x8 board to weed out the movefinder better

Hjax: wut

PatrickMcGinnisII: eg. if (($bindex&136)^0) break;


PatrickMcGinnisII: page 30

Hjax: hmm, i see

Hjax: my movegen is just dumb7fill

Hjax: i mask off the edges from the propagator when doing horizontal directions

Astrobytes: ^same

PatrickMcGinnisII: tx for showing u kicking my ass Astrobytes

Astrobytes: PatrickMcGinnisII osrry bud, just to remind you not to give up on alpha beta ;)

Astrobytes: *sorry

PatrickMcGinnisII: it works for all directions

Hjax: i love how these bitboard things end up with magic numbers that you would never see otherwise

PatrickMcGinnisII: don't be sorry i was actually thanking you, it shows me that i give up corners too easily

Astrobytes: Yup

Hjax: how else would i encounter a number like 9114861777597660798

Hjax: which is essential to my move gen

PatrickMcGinnisII: i started with 8x8, but too many comparisons

Hjax: 8x8 is nice, fits in a nice 64 bit long

jacek: jacekmax is ridiculus

Astrobytes: You're used to bitwise manipulation Patrick, you'll love bitboarding

jacek: some tweaks in eval + jacekmax = profit in onitama

Astrobytes: Aha, going round updating all your bots eh jacek :)

PatrickMcGinnisII: I am wasting storage 3k nodes take up 768k at 1 byte per cell

jacek: this shit works and i dont know why

Hjax: its very convenient that theres so many 8x8 board games, nice and processor friendly

Astrobytes: Don't question it jacek

PatrickMcGinnisII: but i timeout before hitting mem max

jacek: well thats the essences of machine learning eh

Astrobytes: Indeed

Hjax: add enough constants and tweak them by hand and you have a really crummy neural network :D

Astrobytes: more of a neurosis network by the time your finished tuning by hand :P

Astrobytes: *you're

PatrickMcGinnisII: mcts has got to be better, if i dump everything into 3 stacks and cut the OOP, maybe i can get 20k sims. Who's doing MC, how many u get?

Hjax: me, about 10k in java

Hjax: about 30k with EPT

Astrobytes: OOP? What for?

PatrickMcGinnisII: if i drop the node class structure

PatrickMcGinnisII: really kills cpu cycles in php

PatrickMcGinnisII: EPT = GA?

tomatoes: some sort of procrastination, tuning constants again and again instead of doing something useful

tomatoes: happened in pacman's

Astrobytes: That's a familiar story tomatoes :)

tomatoes: ept = early play termination

Astrobytes: PatrickMcGinnisII: EPT = early playout termination

PatrickMcGinnisII: google, wth - EPT= Emerging Pandemic Threat

PatrickMcGinnisII: WTH

Hjax: i make 6 random moves, and then just return the result of an eval function @PatrickMcGinnisII

Hjax: it made my program considerably stronger than full random rollouts

Astrobytes: (within an MCTS framework that is)

Hjax: yes

PatrickMcGinnisII: well at least I'm pinching those in the top 10 for info. ;)

jacek: so the entire league?

Hjax: big benefit of multis over contests

Hjax: people dont keep as many secrets

tomatoes: 47-48

Hjax: fox blundered?

tomatoes: maybe bot shouldnt give up when solved for opponent :thinking:

tomatoes: solved for his win, but then he made mistake

Astrobytes: Yeah, don't assume perfect play

jacek: *game theorists triggered*

Astrobytes: :)

jacek: hmm hmmmm

jacek: i had this game->makeMove(moves[moves.size()%rand()]);

jacek: can you spot the thing?

Hjax: shouldnt it be rand()%moves.size()

tomatoes: swap

Astrobytes: lol

jacek: yes

jacek: but it didnt crashed or anything. just some garbage board

Hjax: i like how me and tomatoes point out the mistake

tomatoes: last

Hjax: and Astrobytes just laughs

Astrobytes: It's jacek, ofc I must laugh

dbdr: lol

tomatoes: or not last. next after :thinking:

Hjax: its amusing that C++ will happily just go off into memory somewhere and send you whats there

Astrobytes: 'cause you told it to!

Astrobytes: It's a feature :sunglasses:

eulerscheZahl: python is boring, no fancy memory access at random locations

Hjax: how about a more fun variant, a language that automatically takes % length of your index

Hjax: then youd never go off the end

Hjax: youd just get the wrong value from your array, and spend hours hitting your head against the wall

eulerscheZahl: Java2K is fun

tomatoes: its useful, but not auto

eulerscheZahl: only performs your commands with a certain probability

Hjax: lol, havent heard of that one

Hjax: what does it do otherwise?

eulerscheZahl: no idea

eulerscheZahl: functions returning incorrect results it seems

Astrobytes: So you have to write your program to account for the fact that everything you call might be wrong. Hmm.

Astrobytes: Intriguing exercise.

Hjax: "The language uses a base-11 number system to approximate base 10"

Hjax: oh no

Astrobytes: Grim.

dbdr: exercise: what's the distribution of N%(rand()%N) ?

tomatoes: error and 1..N-1 :thinking:

Hjax: i would a script to test

Hjax: wrote*

Hjax: and i have no idea what this result is

jacek: i bet it has something to do with modulo vias

jacek: bias even

eulerscheZahl: dbdr asking almost the same question that i was asking myself :D

eulerscheZahl: i was thinking about rand() % rand()

PatrickMcGinnisII: dbdr only uniformly distributed in Java ... everything else g/l

Hjax: so i wrote a script to count how many times each result of 100 % i comes up in range 100

Hjax: and i got a sequence ive never seen before

Hjax: and it isnt in the oeis

tomatoes: rand % rand should be some gradient i think

PatrickMcGinnisII: mind the gap

struct: dbdr do you still have any plans for othello?

MostComplicatedUsername: Why does no one have a cotr bot?

Default avatar.png JBM: Because it sucks?

POWERHAWK: Good morning

something_ok: :kissing_smiling_eyes:

Crypticsy: hey, anyone is willing to give my puzzle a try? It's been in the contribution section for 12 days now and has only upvotes with no approvals

LelouchVC2: An easy puzzle shouldn't be so wordy.

LelouchVC2: I don't think it would be hard to code, just hard to get to get through the description

LelouchVC2: Those upvotes are going to be people who saw it and thought it might be a cool puzzle, but, like me, weren't really interested in coding it

MarlynMatematico: how

Default avatar.png thienok: Come from Viet Nam ? tell me know