Chat:World/2021-07-20
queture: Dear all. Hello there.
dbdr: RPS intensifies :upside_down:
queture: me first time coding...
jacek: hm?
dbdr: https://www.codingame.com/multiplayer/bot-programming/oware-abapa/leaderboard
jacek: RoboStac 2nd? w00t
dbdr: killed by royale apparently
dbdr: no, mostly Marchete
ericlovesmath: I joined like 2 days ago and I have no idea what's happening
ericlovesmath: but now I'm in position 108 for Clash
KiwiTae: now get 108 in general ranking :nerd:
ericlovesmath: dear god no I'm just fast at typing, doesn't mean I'm any good at actual programming
ericlovesmath: only reason I'm here is because of those 30 second questions
ericlovesmath: don't need to know... algorithms and... actually study data structures for most of those
A-Za-z0-9: https://www.codingame.com/ide/puzzle/custom-game-of-life
A-Za-z0-9: can someone help me?
InternalErrror: What's ur problem?
A-Za-z0-9: I don't understand everything. :sweat:
revots: read the wiki article and watch the simulation to get a sense of what your trying to make
Marchete: start here: https://www.codingame.com/playgrounds/40701/help-center/community-help-center
KatMan911: game of life? shit. that way madness lies. MADNESS!
derjack: :upside_down:
Stefanuk12: bebus
KiwiTae: Marchete derjack o/
Marchete: o/
derjack: robo struggling?
Marchete: my only hope is that he tie more with Royale
Marchete: nvm :D
RoboStac: tried to make it slightly less deterministic so it doesn't get stuck on one result
Marchete: mine it's fully RPS
Marchete: it seems
Marchete: it's all in or all out
RoboStac: there's lots of different games vs you now at least
RoboStac: but I think the start is still pretty fixed
RoboStac: so they end up the same
RoboStac: just with slightly different lengths / final scores
derjack: use more random in start and less later
Marchete: you can't
Marchete: at least not from stats
Marchete: the problem is the fixed start
Marchete: less diversity
Marchete: ...and I'm out
Marchete: I'm sick of oware
derjack: oO
Marchete: so ugly rules
derjack: are you planning cgzero of other games
Marchete: after all the work I put on it
Marchete: I'm not 100% sure my sim is correct
Marchete: like endgame is tricky
Marchete: probably derjack, C4 seems fine
Marchete: but after reviewing it
Marchete: a Conv layer is just a Dense layer with less weights
martinpapa69: I observed a lot a repleys, where the bot is winning, and in the last step:sudden draw
Marchete: on what game martinpapa69?
martinpapa69: oware
Marchete: for me what I see if that my tree node reuse is near 0% I'm dead
Marchete: it's probably an unexplored section
Marchete: so it will play badly
martinpapa69: ye, I've seen that too, might be a bug
Marchete: probably
celxin: anouk can we be friends
martinpapa69: now what im trying is is to train a bigger network. generate a lot of replays
martinpapa69: and train a smaller net using only those
celxin: matrinpapa are you german
Marchete: matrinpapa is Spaniard right now
Marchete: ;)
martinpapa69: ye, I had to move to Spain
Marchete: :D
Marchete: :*
celxin: but you are a german in spain?
Tiramon: whats your problem?
Tiramon: you wish ..
Tiramon: i help with problems, but don't give out solutions =)
anoukiiii: you kicked my freind celine
Tiramon: sure .. you want to join him?
Tiramon: her ... doesn't matter ... people that can't behave are not needed in this chat
anoukiiii: whats your fucking problem
Marchete: banhammer
Tiramon: ok school kids are gone ... the chat is yours ;)
Marchete: :clap_tone2:
derjack: potw notification so late now
darkhorse64: less cp
Thyl: HellOo ?
Thyl: :)
Tiramon: hm maybe i'll also spend some time again to train my oware nn
Marchete: do you also had a NN framework?
Marchete: have*
Tiramon: my submit in oware is a NN .. it still has some major flaws
Tiramon: didn't train it that much yet
Tiramon: it's a nice small fully connected 12,64,64,6 network
martinpapa69: you dont have a value head ?
derjack: 12?
Thyl: why didn't do a 12 64 64 12 6
Thyl: ???
Tiramon: size 12 input layer, 2 hidden layers with 64 neurones and a output layer with 6 values
Thyl: 64->6 is a very big difference
Tiramon: because it was more or less working Thyl ;)
derjack: 12 inputs? only houses, no score?
RoboStac: the best move is the same no matter what the score is so if you aren't doing a search on with a value output the score isn't relevant
RoboStac: turn probably becomes important at that point though
Thyl: Your submit is good RoboStac !
derjack: Tiramon working? youre 173 :v
Tiramon: as i said it has some flaws ... didn't pass wood 2 boss because he always made moves my nn couldn't handle ;)
Tiramon: i lost interest in training it and was 2nd in wood 2 for quite some time
Tiramon: now i got pushed to wood 1
Tiramon: and yes in wood 1 it could definitly perform better
dbdr: RoboStac> the best move is the same no matter what the score I don't think that's true
dbdr: e.g. a move that gives 2 points to the opp then 10 points to you in the next two turns
dbdr: it's good, unless the opp has 23+pts
RoboStac: if you ignore turn limits then every seed has to come off the board so either +8 is the best you can do (and the opponent will always get at least 2 seeds and win) or it wasn't the best move.
Wontonimo: hi TeBounty and Benedikt.Huber
derjack: :thinking:
Marchete: :rolling_eyes:
Wontonimo: you two have such fragile masculinity ... free love people, free love
sprkrd: Hello lovely people :D
Wontonimo: :joy:
Wontonimo: :rofl:
Wontonimo: so, what's the topic of the day?
sprkrd: love indeed
Marchete: beards, chainsaw models and fragile masculinity
Wontonimo: i need a chainsaw actually
Wontonimo: i've got a bunch of fallen trees i need to buck then split
Wontonimo: i need a splitter also
Marchete: and manicure too
Wontonimo: yeah, after i'll need that
Wontonimo: cuz those woodchips and sap are a nightmare
sprkrd: so you're a bulky and rough lumberjack?
Wontonimo: lol
Marchete: the mountonimo
sprkrd: Mandatory video: https://www.youtube.com/watch?v=FshU58nI0Ts
Wontonimo: Marchete looks like your NN wirtup is getting a lot of people on the wagon!! Awesome
Wontonimo: Nice video sprkrd, and yes it is mandatory
Wontonimo: WAIT, those are Canadian Royal Mounties. I never noticed that before
Marchete: :steam_locomotive::railway_car::railway_car::railway_car::railway_car::railway_car:
sprkrd: I like one of the comments: "As a Canadian I find this deeply offensive, misrepresentative, and quite frankly insulting. I have many friends who are lumberjacks and only half of them are transvestites"
derjack: canadian royal ponies?
Marchete: I choo choo choose you!
Marchete: the more NN, the harder it's to stay on top...
Marchete: now top10 oware is NN
derjack: we need another breakthrough to NN
Wontonimo: a public contribution of computationally efficient Conv
Wontonimo: for CG
Marchete: for CG?
Marchete: I reviewed it
Wontonimo: !!
Marchete: in the end a Conv is just a Dense with less weights
The_Camoflauged: I just realised that unity uses C-sharp
Wontonimo: yes, of course it is
Marchete: then?
Marchete: It's slower than Dense, but because it's "bigger"
Marchete: you can review it in https://github.com/marchete/Mokka
Wontonimo: !! oh !! Awesome
martinpapa69: would be nice to build a mini opensource nn lib, just for cg, that later is added to the cg server and you can include it to your file
Marchete: I did some tests and it slower than Dense, but faster than vanilla
Marchete: then they should add proper frameworks
Wontonimo: slower as in 10x10->5x5 is slower than 10x10-c->5x5 ?
martinpapa69: ye or they could just add support for tensorflow
Marchete: I prefer that
Wontonimo: yeah, that would make the cost of entry a lot lower
Marchete: Wontonimo I don't know how to measure sample inference time in new TF versions
Marchete: but my MNIST CNN was 20usec/sample
Marchete: my TF was saying 676usec
Marchete: but maybe I wasn't measuring the same thing
Marchete: check images on github
Marchete: I did evaluate(batch_size=1)
Wontonimo: yeah, i don't really know what TF 676us/step means, probably batch
Wontonimo: I'd guess that is a fairly accurate comparison and that your implementation just may be 30x faster
Marchete: I don't think so
Wontonimo: but tensorflow flow really shines with larger batches and network sizes on GPU
Wontonimo: cpu isn't its "thing"
Marchete: just the opposite than CG
Wontonimo: and you don't have any bloatware in yours
Wontonimo: so, it's believable imo
Wontonimo: even their cpu version is optimized for larger batches. in production at work, i use batches of 200 on cpu because it is only 1/2 the speed of single item inference.
Wontonimo: so 100x faster to batch 200 on tensorflow with cpu
Wontonimo: for my particular network
Wontonimo: (don't ask why we arnt running on gpu :unamused:)
martinpapa69: I dont think if you wrote an nn inference lib it would run any faster on cpu
martinpapa69: tf might contain a lot of bloatware, and for general use, but im sure they optimized the s* out of it
Marchete: I disagree
Wontonimo: the model is 300mb. So, you have to move the entire model from RAM through the cpu. If you do 200 items at a time, then you only move that model once through the bus
Marchete: counterexample, one hots
derjack: :fire:
Marchete: :digit_one::fire:
Wontonimo: :2: :fire:
Wontonimo: :(
martinpapa69: ye Marchete, in few special cases it can be faster. Wontonimo if your model doesnt change, why would you reinitalize it ?
Marchete: then "I dont think if you wrote an nn inference lib it would run any faster on cpu" maybe it's not true
Wontonimo: it isn't reinitalized :puzzled-and-confused:
Marchete: I'm sure Robo's NN is 2-3x the TF
Bari: sus
martinpapa69: thats sick tho
martinpapa69: maybe than I should say, I (and 99% of community) cant write faster inference :D
martinpapa69: Wontonimo why do you have to move the model in the ram, if you dont reinitalize it ?
RoboStac: tf doesn't optimise for the same use cases we have, I'm pretty sure it's fairly easy to outperform it on single inferences with small networks
Wontonimo: i don't have gpu (in this env), it doesn't fit in L3, and keeping it on disk would be way too slow.
Wontonimo: to do any calculation with it, the values have to move from ram, across the bus, load into the cpu
Marchete: it's like vanilla MCTS, if you try to use new, all non-fast math operations, divisions, etc it would be much slower
Marchete: so most top "NNers" :D surely outperforms commercial/general user NN frameworks
Marchete: use*
martinpapa69: if you run a batch on cpu Wontonimo, your model wont be "loaded into the cpu"
Wontonimo: perhaps my word choice is wrong. what i mean to say is, the model is "just a bunch of matrix operations", 300mb of them
Wontonimo: and for each matrix to do it's operation, the values have to move across the bus
Wontonimo: just like anything that is in ram that need to be processed by the cpu
Wontonimo: it isn't "loaded" in some way that is different than just regular programming
RoboStac: yeah - it probably uses the weights for the first layer on all samples before moving onto the second layer
RoboStac: which will be a much better use of cache
Wontonimo: it does indeed
Wontonimo: it loads all samples as a matrix
Wontonimo: and operates on them as one block
RoboStac: plus I imagine theres all sorts of threading going on that scales with more data
Wontonimo: so, instead of iterating through the 300mb of matrix operations 200x for 200 samples, it makes only 1 pass over the 300mb of matrix operations
martinpapa69: ah, okay i get it now. ye sure it has to be faster, to run batches on cpu, rather than running 1by1
Wontonimo: i mean, it would be way better to use a GPU here
Marchete: gaming
Wontonimo: i tend to make up terms as idea placeholders. so sorry if my explination was confusing
martinpapa69: ye, I do that too :D many times ppl dont understand what im talking about
Wontonimo: so, we needed the "next level" of nn, and boom Marchete you pre-deliver conv
Wontonimo: what's next? voxels?
Marchete: it seems conv is not that useful on CG
Marchete: or at least it doesn't seem to
Marchete: environment is tiny, so not much to improve
Marchete: probably nnue or similar approaches
Marchete: or anything better than alphazero
RoboStac: yava / breakthrough I have much better results with conv
Wontonimo: i would think breakthrough would benefit a lot from it
Marchete: but not on C4
Wontonimo: because the whole idea of conv is that what you learn in one patch is now transfered to all other patches
specdrake: talking about CNNs?
Marchete: yes
RoboStac: no, c4's still awkward because of how the endgame works
RoboStac: same with othello
RoboStac: (though I think recurs is conv there and better than mine)
Wontonimo: you do any CNN programming specdrake ?
specdrake: Uhm no I just know what it is. Planning to do some the coming semester.
Wontonimo: are you familiar with dense NNs ?
derjack: i prefer BBC :V
specdrake: yeah kind of
Wontonimo: so, if i have 400 inputs (a 20x20 board) and I want a NN to determine if there is exists a 5x5 pattern on that board
derjack: then use n-tuple network [solved]
Wontonimo: nice!
Wontonimo: you know what, a youtube video would do way better than a bit of text here
derjack: i prefer reading
Wontonimo: arxiv for you mr scholar
derjack: hmm looks interesting https://arxiv.org/abs/2107.08387
AllYourTrees: GNNs :nauseated_face:
AllYourTrees: wow that looks interesting
derjack: GNNs :hugging:
Wontonimo: by training it for only three days on small Othello boards, it can defeat the AlphaZero model on a large board, which was trained to play the large board for 30 days.
Wontonimo: x10 training speedup by being clever with training. It's as if a good teacher makes a difference
AllYourTrees: oooh nice and GNNs take advantage of the invariance/symmetries by default
AllYourTrees: is what they say
AllYourTrees: cool paper, ty for sharing derjack!!
derjack: there was other paper on learning small boards and using for bigger boards
derjack: https://arxiv.org/abs/2001.09832
AllYourTrees: nice, seems like nn structure is very important
TeBounty: I know this is not a topic for this forum but I would like to improve my English. I need someone who wants to talk with me. Please.
Wontonimo: just talk about coding here
derjack: English? weird programming language :v
TeBounty: It's ok sorry. Goog day.
r0bd0g: help i dont know what im doing im in yr10 and i dont know how to code help me!!!!
nulte: hi
r0bd0g: help me i cant code but i got this far somehow
Wontonimo: hi r0bd0g
Wontonimo: i'll PM you
Wontonimo: DM
Wontonimo: for people who are looking for an intro to python https://www.hackinscience.org/exercises/
nicola: PM is private message.
derjack: whats PMS then
MSmits: nulte, got time for an avx question?
nulte: yes
MSmits: allright here goes
MSmits: http://chat.codingame.com/pastebin/c48b38f9-118b-4db5-8c2a-f70ebff07046
MSmits: I am doing a lot with those "top connection" things
MSmits: so those can be considered a constant vector for some time
derjack: loony tunes
nulte: ok, i check in a minute or so
MSmits: the first 4 lines
MSmits: I wonder if i can parallelize the 4 shifts and &
MSmits: i remember that shifts all need to have the same direction for this to work
MSmits: but maybe you have an idea
MSmits: btw the loony thing are D&B boxes where you can't play a line or the opponent can fill it in :)
nulte: ok im checking now
nulte: so only the shifts and the ands?
MSmits: yeah
FriendlyKh: hi
MSmits: hi FriendlyKh
FriendlyKh: hi
MSmits: you said that already
FriendlyKh: so what do you talking about
MSmits: https://www.codingame.com/multiplayer/bot-programming/dots-and-boxes
FriendlyKh: ah ok
nulte: do you do this multiple times in the same function?
MSmits: i do similar things with the same vector of "top connection", etc
MSmits: it's just the first vector thats different
MSmits: so that "two2Neighbors"
MSmits: that one changes
nulte: also is topConnection and other constant?
MSmits: for example:'
MSmits: uint64_t tF = (m.loonyFront >> 8) & topConnection; uint64_t bF = (m.loonyFront << 8) & botConnection; uint64_t lF = (m.loonyFront << 1) & leftConnection; uint64_t rF = (m.loonyFront >> 1) & rightConnection;
MSmits: crap lol
MSmits: 1 line too few
MSmits: nulte it's constant for a little while. I use it maybe 5 times
MSmits: but not for the runtime of the program
MSmits: whenever I play a move it may change, but after a move is played a whole analysis is done where i do multiple things of this nature
MSmits: I mainly thing the bi-directional shifts are the problem
MSmits: think
RoboStac: if you've got the same shifts and ands with 4 separate inputs you could do all 4 in a vector instead of trying to vectorise them individually
MSmits: I had to think about that one, but I think I understand what you mean
MSmits: you mean analyzing 4 different moves at the same time, running the same function 4 times
derjack: jeff bezos going to space eh
MSmits: I guess that can be done
MSmits: but really complicated
MSmits: he can stay there
MSmits: mmh nah i think this would be too messy, vectorizing the whole thing. It's a recursive situation. It would be like vectorizing a minimax algorithm
MSmits: mmh though, if i know I am going to have to apply at least 4 moves, I could do something ahead of time maybe and just keep the analysis results on the stack
MSmits: like simming 4 moves in a minimax, while only continuing DFS on one of them at a time
RoboStac: so you don't have two2Neighbours and m.loonyFront at the same time?
MSmits: ohh is that what you mean, hmm let me check
MSmits: nope that's sequential unfortunately
MSmits: I also have this bitboarded floodfill
MSmits: http://chat.codingame.com/pastebin/3cbbeb43-b003-4f4a-8d8c-e31da9e52772
MSmits: same thing, second vector stays constant, first vector is changing all the time
RoboStac: yeah, same problem that the only operation you do to all 4 is 'and' and it's probably not worth the overhead to avx them just for that.
MSmits: I was afraid of that. Thanks for confirming. I can let that go then :)
Shyweirdo: am having problems with the first level of the bot game
darkhorse64: clobber ?
BlaiseEbuth: The only one. The unique. The famous... Bot Game !
DaNinja: ignore Blaise, whats the problem?
BlaiseEbuth: Wut.
BlaiseEbuth: Don't ignore me or you gonna be in trouble.
BlaiseEbuth: Don't say to ignore me or you're also gonna be in trouble.
Astrobytes: So ANYWAY. What is the nature of your coding emergency Shyweirdo?
DaNinja: this chat needs a /ignore
Shyweirdo: ok so i'm meant to win the race by edtiting a line of code to output the target position
BlaiseEbuth: This work
Astrobytes: we're all noobs once
Astrobytes: That was kinda unnecessary Blaise dude
Shyweirdo: so um anyone know how i can solve this please?
BlaiseEbuth: No it wasn't
Shyweirdo: i can't like copy the entire code here lol oh wait can i just do that?
Astrobytes: Shyweirdo: If this is the very first level, take a look at the code and see if you can see anything strange about it
Shyweirdo: literally started playing like maybe 20 minutes ago
BlaiseEbuth: Even if I said it on a joke tone, my remark was serious. I'm tired of all this context free questions. An I'm tired of the pair of users that treat me/ and say to other to treat me as nothing more than a troll, in every situation, just because I'm speaking sarcasticly.
BlaiseEbuth: Eat my second degree.
jacek: Shyweirdo you need to print X and Y. the code has only X and X (or Y and Y?)
Astrobytes: Yes jacek, I was trying to get him to notice for himself.
Shyweirdo: i get it now thanks guys
jacek: oh
Shyweirdo: yes i did notice after your message astro thanks
Astrobytes: BlaiseEbuth: Alright, I see your point.
Astrobytes: Ah that's good Shyweirdo
BlaiseEbuth: Thanks.
BlaiseEbuth: And sorry for the bad vibes Shyweirdo
jacek: BlaiseEbuth what if the question is about context-free grammar
BlaiseEbuth: :thinking:
pthebaul: haha jacek
BlaiseEbuth: :cookie:
Shyweirdo: i really don't know if it's just my dumb head but i seam to be confused again
BlaiseEbuth: hm?
Shyweirdo: so i'm on the decent game
Shyweirdo: on the algorithm tree section
BlaiseEbuth: :sleeping:
Wontonimo: i can give you a hand
Wontonimo: how about we take this to PM
Wontonimo: you can find the PM at the top of chat as a new tab
**BlaiseEbuth start whistling...
Wontonimo: use #furry for furry conversations
jacek: :3
jacek: yuore quite furrious today
MSmits: fast and furrious?
**xqderpcvhr hi
xqderpcvhr: lol wut
**xqderpcvhr slaps debbielf around a bit with a large fishbot
xqderpcvhr: (sorry lol)
Cocopuffsplayz: hi
struct: running out of ideas for breakthrough :/
FalINTOblivion0112: oh lol
BlaiseEbuth: ngl
bluefacebaby: C is fucking noob
BlaiseEbuth: ...
adilmarghadi1: Help On This exercie https://www.codingame.com/playgrounds/56102/les-chaines-de-caracteres
Astrobytes: afk, I'll leave that one for you Blaise :P
struct: Not sure if I should improve breakthrough a bit more or try clobber
BlaiseEbuth: Ask to the tech.io community.
MSmits: struct, it's fairly easy to copy your c4 bot to clobber, just change the sim a bit
MSmits: but it's a math game to some extent, like D&B, not as much as D&B, but more than the regular boardgame on CG
MSmits: so after your mcts is done, there's no point going for max performance. anything you succesfully do with math is going to outdo any performance improvements
struct: Hmm I guess Ill skip it then
struct: :D
MSmits: well as i said, it can be fun to just write a good sim. you'll be top 10 anyways
MSmits: you can be top 10 in D&B easily, without math also
struct: Ill try it
struct: But ill try to improve breakthrough for 1 more day or 2
Marchete: for 50$, MSmits' sentences that doesn't contain "D&B" in them
Marchete: :D
MSmits: :)
struct: I solve quite early on breakthrough
struct: compared to some other bots
MSmits: I think i am going to do something cheeky to try and beat mikla
Counterbalance: clobber needs more than a good sim to be top 10
MSmits: i mean sim + search
Marchete: you are attracting ppl to D&B...
Marchete: don't lie
Counterbalance: i've an mcts with extremely fast sim.. top 15
MSmits: Counterbalance I worked on it for 1 day, it's still 8th. there's no math in it
MSmits: struct is a master at performance, his C4 is faster than mine
MSmits: so thats why i said he can do clobber top 10
Counterbalance: i'm sure he can
MSmits: hmm
Marchete: I just need 30000 coeffs, ezpz
MSmits: if your sim is extremely fast i am surprised it is only top 15 though Counterbalance. let me see if i use some trick i can share
Counterbalance: I've got 1.5M sims, 27k-80k rollouts
MSmits: okt let me check
MSmits: what is a sim in your case?
Counterbalance: performing 1 move for 1 player
MSmits: oh ok
Counterbalance: including finding legal moves
struct: all legal moves?
MSmits: i have to redefine then sec
struct: or just 1?
Counterbalance: something inbetween :)
struct: I have no idea how many sims i have in c4/bt
jacek: hm?
Counterbalance: well, actually, all. But I don't store them during rollout
struct: I know that I have like 5M rollouts on first turn on bt
struct: on c4 Its 3M+-
MSmits: Counterbalance i have 4.1 million sims in your definition
struct: if you are gonna play a random move you dont need to calculate all
MSmits: i counted every time a move is applied
MSmits: so during selection and during random rollout
Counterbalance: I don't apply moves during selection
MSmits: ok sec
MSmits: yeah that did not matter
MSmits: 4.4 million now without selection
MSmits: different cpu i guess
MSmits: i do 1 selection and then rollout from each child
MSmits: so selection is negligible
MSmits: because... many children
MSmits: this means i very few expansions also
MSmits: i do
MSmits: so most of calculation time is in the random rollout
MSmits: and that is ridiculously fast so, that explains the high simcount
Counterbalance: Mmm okay.. I've got < 50% of time in rollout, ; 33% in selection.
MSmits: without testing i am pretty sure it's 90+% in random rollout for me
MSmits: i do it 100 times or so in the first few turns, just for 1 expansion
Counterbalance: aww dinner - bbl, curious to learn more!
MSmits: this was just a first try that turned out ok. Could have failed miserably tbh
MSmits: another time then, have a good dinner :)
MSmits: so about D&B. I have an idea Marchete
MSmits: mikla still beats me by a little bit with nim
MSmits: not as much as before, but still does
MSmits: but he has no idea how to play out the endgame
MSmits: properly anyways
Marchete: well "no idea" != "perfectly"
MSmits: so what if i just make a ton of loops and other small object. In that case having control is not enough
Marchete: or properly :D
Marchete: I said that Smits
MSmits: no i mean, compared to the rest of the top 10
MSmits: everyone else does it better
MSmits: top 20 even
Marchete: trying to create hard to solve solutions for others
MSmits: yeah
MSmits: you did say that
MSmits: I think mcts might be good here
Marchete: with my graph too
MSmits: random rollout with an eval of the objects at the end
Marchete: I can "create" loops, giving some small bonus
MSmits: yeah, but big loops are bad too
MSmits: a 8 loop is neutral
MSmits: and a 4 chain also
MSmits: 4 loop is bad for the person in control
MSmits: 6 loop too
MSmits: and 3 chain
MSmits: I wont need to do it with graph I think. I can just randomly fill the board safely and do a bunch of floodfills to count loops and chains at the end
MSmits: i do floodfills for my score solver too, to build a graph, so i already have the floodfill, i just dont need the graph itself
MSmits: will be cool to have something to use calculation time for in the beginning of the game
matteoc11: hi
jxsxtx03: http://chat.codingame.com/pastebin/ae8ba429-5523-4670-a33e-9405e40c785e
jxsxtx03: why this ocde does not work??
jxsxtx03: it has to be like that: u digit a number and tthe output is the multiplication of the digits. p.e --> 23 --> 6 // 48 --> 32
OldJohn: @martinpapa69
martinpapa69: sup OldJohn
Marchete: :rage:
MSmits: hi OldJohn
MSmits: and Marchete
MSmits: or martinpapa69
OldJohn: Hi MSmits
martinpapa69: yo
LibgdxKotlinChampion: someone make youtube videos of owning in clash of code
Thyl: Sokoban finished
MSmits: grats
Counterbalance: back (thanks MSmits)
MSmits: hey wb
Counterbalance: so I guess your trick is to do more than 1 rollout at once?
MSmits: it might be yeah
MSmits: i often do this in boardgames
MSmits: just roll out each child and backpropagate the combined results
MSmits: I also have mcts solver, not sure if you're using that
MSmits: seems standard for most players
Counterbalance: Not sure what that is..
MSmits: ah well that explains a lot
MSmits: mcts solver solves the game
MSmits: in addition to just gathering statistics
BlaiseEbuth: What a surprise... The name is pretty cryptic...
MSmits: https://www.codingame.com/replay/571192118
Counterbalance: :) I found this - https://dke.maastrichtuniversity.nl/m.winands/documents/uctloa.pdf
MSmits: yeah thats where it comes from but the code is not great
Counterbalance: ok i'll read it to get the idea.
Astrobytes: ah, everyones favourite pseudocode :D
struct: The code made me not want to learn it
MSmits: http://chat.codingame.com/pastebin/a8e4b556-78a6-41c2-bc0a-243c103f650c
MSmits: selected is an array of selected nodes i also use for backpropagation
MSmits: (I dont store parent or anything
Astrobytes: I thought I understood before I read the code
Astrobytes: Turned out I did lol
MSmits: for clarification: status 2 = ongoing game, status 1 is win, status -1 is loss
AntiSquid: how do you make random rollouts without making it too time consuming ?
MSmits: normally i also have 0 for draw
struct: which game AntiSquid?
AntiSquid: like i get how to represent any board game through bit magic and use bit operations, but then going through the bits to find what's on and picking at random seems to drag me down
struct: pdep
AntiSquid: any board game really . square grids
MSmits: basically Counterbalance, you expand your leaf and if you encounter a win or loss, you start propagating that up the tree. Every node will have a flag
MSmits: you never select solved nodes again
MSmits: which is where the gain happens
MSmits: especially in nim games like clobber
struct: const uint64_t pdep = _pdep_u64((1ULL << rand(__builtin_popcountll(moves_mask))), moves_mask);
struct: that returns the mask of a random move
struct: a random set bit
MSmits: also AntiSquid, for selection of random moves, dont create a vector or something
Astrobytes: I have _tzcnt_u64(_pdep_u64(1ULL << rnd64.getRandomInt(_mm_popcnt_u64(mask))), mask));
Astrobytes: same thing more or less
AntiSquid: isn't the rollout itself also wasteful ? is it worth having one instead of just scoring the node arbitrarily ?
you need to apply the move to the rollout state
MSmits: this depends on how good you can score it
MSmits: a random score is by definition going to be worse than a random rollout
MSmits: but a sensible eval might be better
MSmits: random rollouts work well for games that are hard to score
MSmits: I use it for langtons ant, uttt, bandas, c4
AntiSquid: and if i have the score from the game itself ? say code a la mode ?
MSmits: oh and clobber i guess
MSmits: code a la mode is a horrible example because it's cooperative, but i get your point
MSmits: the game score can be part of eval
MSmits: my oware score is part of my eval i
MSmits: so is the number of seeds
MSmits: how many in each hole
MSmits: etc
MSmits: if you mean the game score at the end of the game, then thats different
MSmits: from what i read in papers it's generally worse to backpropagate end of game score, than the actual win/loss result
Counterbalance: msmits: i always backprop the outcome, but, are you saying to mark all ancestor nodes as a 'terminal node' based on 1 rollout?
MSmits: not all ancestor nodes
struct: based on expansion
MSmits: say you got to a leaf
MSmits: on expansion you find the leaf is a win
MSmits: then the parent automatically is a loss
MSmits: if all siblings of that parent are losses, then the grandparent is a win
MSmits: and so on
MSmits: on a win you need only 1 child for the parent to become a loss
MSmits: on a loss, all children need to be losses for the parent to be a win
MSmits: thats the basics
MSmits: so you backpropagate the normal statistics
MSmits: but you *also* backpropagate terminal status
MSmits: in a separate function
MSmits: this is the solver
MSmits: it terminates when it encounters a loss where the siblings have not been solved (they could still be wins)
Counterbalance: okay, interesting. It does seem weird to me to mark a node as win/loss based on a single rollout of it's children though
MSmits: no, not based on a rollout
MSmits: on the actual end of the game
Counterbalance: that's what I mean by rollout - it sims until end of game
MSmits: when you expand, one or more of the expanded moves ends the game
MSmits: i mean you dont even do a random rollout
MSmits: because the game is over
MSmits: thats when you solve
Counterbalance: ohh okay, so when at least 1 child is a terminal node, say
MSmits: if its a win, then 1 is enough
MSmits: if it's a loss, then they all need to be losses
Counterbalance: Yes indeed.. I did struggle with that - the select() kept finding those nodes
Counterbalance: Cool thanks, that'll speed things up a lot, I think
MSmits: yes, for some games it works better than others
MSmits: i suspect it will work wonders for clobber
MSmits: because nim games are all or nothing and you need to fully solve to be certain
Counterbalance: it's also a great game for a fast sim - very elegant
MSmits: yeah
MSmits: thats why i quickly wrote a bot, i could just copy from another game and easily put in the sim
Counterbalance: yup.. valid moves calculation is just 4 shifts and 6 ands :)
MSmits: yeah
jacek: clobber is the new kink eh
MSmits: not mine
MSmits: but I like it
69razer69: i am just amazed i was solving the chuck nourris code golf using python and coudnt do better than 140 found ppl using python did it in 86 character
AntiSquid: if it's a solo game what do you suggest backpropagating then MSmits ?
GregMc: I'm 0.09 points short of Wood 1 in Klobber :slight_frown:
AntiSquid: there's no real win/loss there
jacek: everyone is winner in single player game
AntiSquid: yes
GregMc: Idk, I've lost solitaire a few times
jacek: oO
MSmits: I used solo mcts for that coloured balls optim
MSmits: i forgot the name
jacek: the same
MSmits: but i basically backpropagated end of game score, or max score
MSmits: it wasnt that great
AntiSquid: coloured balls optim ... need to figure out which one that is
MSmits: but apparently it's what scientists tried in papers too, so i didnt do something stupid
MSmits: same game
AntiSquid: square balls ? :P
Astrobytes: balls aka squares
MSmits: are they square?
Astrobytes: yes
MSmits: i forgot the shape
MSmits: it's not relevant :p
Astrobytes: StC has balls
NinjaDoggy: Hey MSmits, for MCTS solver how do you typically handle draws?
MSmits: sec
jacek: he cries then
MSmits: http://chat.codingame.com/pastebin/28dd0b46-ddbb-401e-9bd5-c723b8194575
Astrobytes: cries in bits
NinjaDoggy: mainly the following case:
MSmits: same as my previously shared code
MSmits: only for draws
AntiSquid: forgot stc has balls
MSmits: -1 loss, 0 draw, 1 win, 2 = ongoing
NinjaDoggy: but isn't it sometimes bad to ignore draw nodes?
MSmits: there's ways to deal with that, but in my experience they make performance worse
NinjaDoggy: for example: let's say a node's true value is draw and it only has 1 child node that leads to a draw and the rest are losses
NinjaDoggy: then the draw child node is quickly solved and ignored in further select()
NinjaDoggy: and the node seems worse than it would be if MCTS solver wasn't implemented
MSmits: in practice this never happens though, as draws are almost always harder to solve
MSmits: but sometimes they solver sooner because they get more visits, sure
MSmits: but they need A LOT more visits to solve
MSmits: sometimes hundreds of times more
NinjaDoggy: is that true?
MSmits: so the statistics are skewed less than you think
NinjaDoggy: can't you get a lot of game states where you can immediately end the game for a draw
MSmits: yes because, on a win the parent is a loss
NinjaDoggy: but if you choose other moves to play on, you'll eventually end up with a loss?
MSmits: on a draw, the parent is only a draw when all nodes are drawn
MSmits: i guess it dpeends on the game
NinjaDoggy: yes so just thinking about the search tree that makes sense, but terminal nodes aren't all at the same depth right
MSmits: if there are games where you can do this, it could become problematic
MSmits: for some games terminal nodes are all at the same depth more or less
MSmits: for some games they arent
NinjaDoggy: I guess most games don't have this property though so you're right, in practice this doesn't really happen
RoboStac: it matters quite a bit in nn based oware I think (it's the only one I do the proper thing)
MSmits: yeah it might matter there. It doesn't in uttt for example
MSmits: not in my experience
MSmits: I tried selecting drawn nodes even when they were solved
MSmits: wasnt better
NinjaDoggy: wait so... what's the "proper" thing?
MSmits: i guess the proper thing might be to select the possible loss, but backpropagate a draw anyway?
RoboStac: don't choose draw nodes in selection but if a parent has a drawn child convert any losing back prop scores into drawn
MSmits: this also biases
NinjaDoggy: ok yea that does make sense thanks :)
MSmits: because a losing node may still backpropagate 20% wins
MSmits: and if you turn 80% loss into draw and 20% win not into draw, the loss will seem winning
MSmits: the draw i mean
MSmits: the trick is to only start backpropagating wins, when the unfinished node value is higher than the draw value
MSmits: otherwise only backpropagate draws
RoboStac: but theres no possibility of it being a loss as there is a guarenteed draw
MSmits: of course
NinjaDoggy: but loss nodes might result in a win
NinjaDoggy: so if you only correct the loss results
NinjaDoggy: you get bias is the point i think
MSmits: you get a net positive score
MSmits: instead of 0
MSmits: and it should be 0
RoboStac: if there are nodes that are still winning it shouldn't be 0 though
NinjaDoggy: well a node could be a dead loss
NinjaDoggy: but some iterations lead to a win
NinjaDoggy: like 10% win, 90% loss or something
NinjaDoggy: if you only zero out the 90% loss, the losing node seems positive
MSmits: at least during backpropagation
RoboStac: yeah, I guess from the point of view of random rollouts it matters
MSmits: i solved this by capping to the value of the lost node
MSmits: the losing node
MSmits: it cant propagate wins until it's average value is higher than the draw
MSmits: so, never
MSmits: and if it ever becomes better than the draw, well then its proper to backprop wins
MSmits: in any case, the small hit from these checks made it worse for me
MSmits: you can also do ab pruning for mcts solver btw
MSmits: well something similar anyways
MSmits: https://imgur.com/a/3f9dfPw
MSmits: this shows you mcts ab pruning with draws
MSmits: you dont need to finish all nodes to know the top node is a draw
NinjaDoggy: :O
MSmits: just keep a flag on each node ("has child with draw"
MSmits: then you can write a more complicated solver function that uses this
MSmits: i did it before, it works, but very messy
jacek: but is it worth it online?
MSmits: pretty negligible in uttt
MSmits: barely any benefit, definitely not worth the time debugging
MSmits: i guess it could be good for games with lots of draws
struct: wtb eval
jacek: for what
MSmits: bt
MSmits: he's still obsessed
NinjaDoggy: bt?
Astrobytes: breakthrough
jacek: i was obsessed with it for long time
MSmits: yeah you actually had a really strong eval before you wrote a NN
MSmits: i think it might have been the best, wasnt it?
MSmits: before NN's existed
jacek: top 3 was tied
MSmits: ah
jacek: and eval was: piece count, pst, penalty for attacked undefended piece if not my turn, bonus for horizontal connected on row 6
jacek: mostly hand tuned
struct: my eval is random stuff
martinpapa69: why dont you train an nn to find the best coeffs for your eval
struct: i dont know how :'(
jacek: use texel method?
struct: Im not even sure if this formation is good or not
struct: https://i.imgur.com/MEyf5Zf.png
jacek: oO
GregMc: Ayyy I finally got top 500 in clash :sunglasses:
struct: grats
xxd: what is ut16
xxd: trick
jacek: hm?
Marchete: lol
BlaiseEbuth: ngl
xxd: some guy in his twitch stream description said he wont use the ut16 trick in private clashes
jacek: utf16 trick
jacek: yeah, who uses that :unamused:
xxd: ah
Husoski: I don't like it. It's a cheat, since the actual source file size (assuming UTF-8 encoding) is larger than the unencoded version.
Astrobytes: Since anything is allowed, it's not technically a cheat though.
struct: jace k playing coc o.o
Astrobytes: oO
jacek: urmum
jacek: why i cant invite cocbytes
GregMc: Utf16 isn't literal cheating, but it's definitely moral cheating
struct: bt needs a boss so it can get potwk
struct: potw*
Marchete: moral?
Marchete: lol
struct: just play multis, dont think you can cheat there
struct: "cheat"*
jacek: but bt was potw already
struct: oh really
Marchete: yeah, there you can use UTF16 to send garbage character :D
Marchete: can't
jacek: it was before the quest ma[
jacek: map
struct: ah
struct: What rank was your non NN bot on breakthrough?
struct: +-
jacek: top 3
jacek: rps between top3 actually
struct: MCTS or minimax?
jacek: minimax
Husoski: GregMc Agreed...but if the scoring system measured actual code size rather than codepoint count in the editor, that would make the annoyance go away. The point of CoC is for people to try out ideas and learn new things. You don't learn squat from a pseudorandom garbage string.
Marchete: you learned a new layer of making code shorter
Husoski: Longer
Husoski: Each of those "two character" codes takes at least 3 bytes in UTF8
Marchete: python3 has this functionality by default? if yes, then it's correct to use any python3 utility available to win
Husoski: Yes, and it's only a win because the scoring doesn't count code size correctly. IMHO, of course.
Marchete: indeed
Marchete: but as it counts chars
Marchete: it's the best tool to win
GregMc: You may win by doing it, but no one will like you for it :joy:
Astrobytes: It's correct for here though. Plenty other places to golf in bytes.
jacek: but that allows NN geeks to encode almost 2x more weights
Counterbalance: does it only work for utf16 or also for utf8?
jacek: utf8 is 1 char/1 bytes already no?
RoboStac: it's java's string length so uses utf16
GregMc: You encode it to utf16 then use a decode and an eval to run it
Counterbalance: no, 5 bytes per char possible
Marchete: that damn guy is a cheater
Marchete: https://www.youtube.com/watch?v=CZsH46Ek2ao
Marchete: how dare to do that!? that's cheating
RoboStac: teaching people that length of string != size of string in bytes is probably the most educational thing to come out of coc
Astrobytes: Perhaps the only thing? :D
jacek: reminds me of that RL walking robot (spider?) that found bizarre way of walking
jacek: as long as it works...
GregMc: Yep, and it's a neat learning tool. That's why I called it moral cheating; you know when you're using it just to win instead of to learn
Marchete: use that too
Marchete: you have the tool
Astrobytes: I think you'll learn more doing something other than clashes tbh, they're just supposed to be 'fun'
Marchete: in multiplayer games I saw that NN guys were cheating
Marchete: so I forced me to learn
Marchete: they still beat me but I wasted 1 year doing it :rofl:
Astrobytes: Just my opinion ofc :innocent:
Astrobytes: lol
GregMc: Yep, clashes are just what I do in my spare time at work
MSmits: I had students this year that were cyberslacking (= playing on computer during school) by playing clashes
MSmits: I was sort of ok with it
Astrobytes: Yeah exactly. More learning value in puzzles or the multiplayers (depending what you like) imo
MSmits: at least they were practicin coding a bit
Astrobytes: hahaha that's amusing
Astrobytes: "But Mr Smits - you play on that site too"
GregMc: Clashes are nice bc I don't have the time to actually sit and focus on making a decent bot. Tried to do Clobber today, ended up half paying attention, getting mad, and dumping in 200 if statements with a sprinkle of Math.random
Husoski: That's where most of the good coders came from when I was in school. Hangers around the data center (yep, that's how old I am) doing stuff that wasn't assigned.
MSmits: Astrobytes yeah, they knew
Astrobytes: GregMc: yeah totally understand, it does take some investment time-wise for the bot stuff, puzzles not so much
Astrobytes: Also, those board games aren't easy to write a really quick bot for (usually)
MSmits: GregMc it helps if you have a basic bot to start from. If you make one basic mcts bot for some game, you can easily adapt it (takes 2-4 hrs) to different games
struct: step 1 make mcts for normal TTT
MSmits: the search algorithm is the same, only the simulation is different
struct: step 2 copy paste
GregMc: What's mcts?
struct: monte carlo tree search
MSmits: monte carlo tree search
MSmits: match!
Astrobytes: Convergence.
jacek: slow poke
GregMc: Ah, gotcha. I should probably learn how to do that
MSmits: for some people minimax is easier
PatrickMcGinnisII: puzzle done, back to work
struct: connect 4 should be one of the easier to start with
MSmits: also can be plugged in to many games
PatrickMcGinnisII: glhf
Astrobytes: get to grips with minimax first I think
Astrobytes: It helps later on
MSmits: minimax is simpler and gives you a better understanding of game trees i think
MSmits: you avoid the statistics stuff
MSmits: easier to debug too
GregMc: I mean, I did great at statistics in college. Data structures was the class I failed :joy:
MSmits: is a bitboard a data structure?
Wontonimo: hey, if you are good at stats and not a fan of trees, do i have the bot for you! FlatMC !
MSmits: oh yeah, do his flat mc thing
MSmits: great place to start also
Astrobytes: WontonimoBot right on time :D
Wontonimo: https://www.codingame.com/forum/t/ultimate-tic-tac-toe-puzzle-discussion/22616/114
Astrobytes: Yeah for sure.
MSmits: Marchete, I think this guy is doing what i want to do: https://www.codingame.com/replay/571215989
Wontonimo: This is FlatMC as applied to Tic Tac Toe.
MSmits: i often see games like this vs him
GregMc: I googled "flat monte carlo", and I gotta say, those are some nice 1 bedroom apartments
Counterbalance: MSmits that 4M simcount was in < 100ms right?
Wontonimo: it is also called Plain MC, MC, and LazyMammal has called it 1plyMC
Astrobytes: lol, it's a random search.
MSmits: yeah, i got 40+ million on turn 1
Counterbalance: only 22M here
Astrobytes: You can go as deep as you like but often not worth going overly deep
MSmits: might be my sim is faster, let me check
MSmits: I'll pm you something
Counterbalance: I added that solver thingy but it makes no difference
MSmits: it fully works?
MSmits: you can check vs my bot
MSmits: they should agree
struct: Which game are you playing counter?
struct: I forgot
Astrobytes: Clobber
struct: ah right
struct: I need to rest, breakthrough has been killing me
Counterbalance: i'll need to get back to D&B, dropped 35 ranks
MSmits: if you do, try the math. It's everything in D&B
MSmits: it's pretty different from other games
MSmits: also still no NN there
Marchete: indeed, nim game
MSmits: not that you can't use them at all, but if you do, it will be NN + math, not just NN and so long as someone isn't willing to get into the math, then the NN is pointless
Marchete: I'm not sure
Marchete: as I said
Marchete: I can feed a NN with my graphs
Marchete: maybe it works
MSmits: it needs to play perfectly for 70 moves
MSmits: NN's dont generally play perfectly
MSmits: the math does
Marchete: what 70 moves
Marchete: on solved?
MSmits: I mean plies
MSmits: my nim solver works from frame 40 or so sometimes, sometimes 45
MSmits: game has 112 plies
MSmits: so if you're going completely mathless, it has to be able to do that too
Marchete: at 57 is classic nim, no?
MSmits: in other games, 1 or 2 mistakes is fine. Here 1 mistake = loss
MSmits: 57 is the endgame
MSmits: nim solver solves way before the end game
MSmits: i can score solve around 50 probably
MSmits: but nim solver 40-45
MSmits: mikla can do usually 1 or 2 plies before me :(
MSmits: not always though, i beat him to it sometimes, but that doesnt mean i win
Marchete: at turn 40?
Marchete: so 17 turns ahead
Marchete: it's a lot
MSmits: yeah it is
MSmits: because of divide and conquer
MSmits: https://www.codingame.com/share-replay/571216630 this is typical
MSmits: he says win and my bot cries on the next frame
MSmits: then we both nim-solved
AllYourTrees: what is a nim solver?
MSmits: do you know nim?
AllYourTrees: the programming language?
Astrobytes: https://en.wikipedia.org/wiki/Nim
MSmits: it's a game where the last player to pick up an item from a stack, loses (or wins depending on rules)
MSmits: in D&B the last player to make a safe move usually wins
MSmits: then the next player has to open a chain
MSmits: and the other player can keep control and capture most of the boxes
MSmits: the nim solver just calculates which player is last to open a safe move, basically
MSmits: it doesnt care about score
MSmits: and you can use divide and conquer to solve isolated areas separately
AllYourTrees: huh interesting
MSmits: yeah its a whole area of research
MSmits: combinatorial game theory
Astrobytes: ^
AllYourTrees: :scream: ty for info!
MSmits: np :)
AllYourTrees: so what you're saying is we need to use the GNN + AZ approach that derjack linked earlier to apply AZ to smaller parts of the game?
MSmits: no, i was saying that you can use a NN early on in the game, when nim solving is not possible
MSmits: there's all sorts of ways serious players count chains to predict what the nim score will be
MSmits: a NN can sort of do this
MSmits: it wont be exact, but may boost win probability
AllYourTrees: ah so there's like multiple phases of the game? first part is normal, last part is resolving the chains?
MSmits: i would say 3 phases
jacek: GNN eh
MSmits: opening phase where almost noone knows what to do
MSmits: then nim solve phase (after 35 it's possible, usually 40)
MSmits: then after 50 or so you can score solve
MSmits: and then it's just finishing up till frame 112
AllYourTrees: interesting game
MSmits: yeah
MSmits: it's the most well known game on CG outside of CG I think
MSmits: except maybe Go
MSmits: and checkers
AllYourTrees: you mean people don't know about the game "Spring Challenge 2021"?
AllYourTrees: :)
MSmits: hehe
MSmits: even my wife knows how to play it
MSmits: D&B i mean
MSmits: and she would not know any of the other games
struct: not even yavalath?
AllYourTrees: ya thats awesome
MSmits: nope
MSmits: nor checkers
MSmits: apparently if you play 3x3 boxes D&B the game is easier to play perfectly than TTT
MSmits: but people generally dont know the solution
jacek: then we need ultimate d&b
MSmits: well we have 7x7, it's pretty ultimate :)
MSmits: it scales very hard with increasing size
jacek: and i dont know if many people know the rules of 'standard' checkers
MSmits: well i learned a similar game when i was young. 10x10 checkers but with slightly different rules
MSmits: the kings could move any distance
MSmits: and you could jump backwards even for non-kings
jacek: thats international draughts
MSmits: oh ok
MSmits: well thats what i learned then :p
jacek: but at school kids often played version without mandatory jumps :s
MSmits: oh ok we did use mandatory jumps
jacek: is chess known outside of CG? :thinking:
MSmits: 960 isnt
struct: we need ultimate hex
struct: https://boardgamegeek.com/boardgame/322205/maphex
Wontonimo: UTTT meets hex lol
MSmits: as long as it's balanced with steal this time. C4 proves how necessary that is
MSmits: or some other method, but probably steal
MSmits: well yavalath proved it first. I mean that game is completely pointless without steal
jacek: but does it have memes like c4?
MSmits: haha no
MSmits: i love those
MSmits: link the page again, maybe someone hasnt seen it
jacek: its in the forums
MSmits: oh ok
jacek: https://9gag.com/gag/aeDNdGv
Astrobytes: I was thinking of porting Trevor Is Dead
Astrobytes: (in the link)
MSmits: how does that work?
Astrobytes: no clue
Astrobytes: (it was a joke btw)
MSmits: ah ok, it just wooshed me is all
MSmits: as they sometimes do
Astrobytes: Just sometimes eh
MSmits: sometimes has a wide range
Astrobytes: hehehe
Astrobytes: hello
Wontonimo: last uttt - 30th @24.65 ... shooting for higher
Wontonimo: up to 28th @25.31
Wontonimo: hey new ppl
Wontonimo: i had nachos tonight
Wontonimo: like tacos, but open face and closer to chaos
BlaiseEbuth: :taco:
Wontonimo: Submitting version of UTTT without board in the node. Node size is now 24
Wontonimo: Thanks BlaiseEbuth! I appreciate it. Here is one in return :taco:
BlaiseEbuth: :hugging:
Wontonimo: oh, this bot shot up in the ranks pretty fast
Wontonimo: and then stalled. bad bot!
BlaiseEbuth: hm?