0,]']±>Sï}WÿÍu§ðp8·d%qy)6o;]ÉA¦ösï÷ôôô”°ÂVl†38”9‰;³<«7f9áÀ;±>¤1™:?2~4>À?ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª"¢ªªªª"¢ªªª"¢ªª"ªªªªªªªªªª"ªªªªªªªªªªªª*"¢ª"¢*"¢ª"ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª*¢*ª"¢*¢*ªª*¢*ª""*¢*ª"¢*"¢*""*¢**"¢ª"¢ªªªª"*¢"ªª"*"ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª*¢**¢**¢ªªª*¢**ª"*¢**¢"*¢*ª"ª*¢**¢**¢"ªªª"¢*"*ª"¢ª"ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª*""*¢**¢*ªª*""*ª"ª"¢*"ª*¢*ª"ª*¢**¢ª*"ªªª*¢ª*¢**¢ªª"ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª*¢*ª"¢ª"¢ªª*¢*ª""ª*ªª"¢*¢*ª*"ª"¢*¢ªª"¢ªª*""ª"¢*""*"¢ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª¤ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªD¤ªDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDDDDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªDDDDDDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªDDDDDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªDDDDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDDDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDDDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDDDD¤ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªDD¤JD¤ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªDDªªDDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJDªªªJDªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªJ¤ªªªªJ¤ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªw§ª§ªªª§ªªªwªªªªªªªªªªwªªªªªªªªwªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªzw§zw§ªw§ªwwªwwªªz§zzªww§zªªzwwªw§ªªªwwzwwªwwzw§zwwªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªz§zz§zz§wzwªzwªªªz§zzªªwªzªªªwªz§zªªzwªªwªzªwz§zªwªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªz§zz§ªzwªªzwªzwªªzwwzªz§ªzªªªwªz§zªªªzwªwªzªwz§ªªwªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªzw§z§ªªw§zw§zw§ªªz§zª§ww§§ªªªzwªw§ªªzw§ªzwªwwz§ªªzwªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªz§ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªW-- title: AoC2021 - a game -- author: /u/ffrkAnonymous -- art by ffrkAnonymous jr. -- original puzzles by Advent of Code -- desc: Advent of Code 2021 https://adventofcode.com/2021 -- Find stars. Save xmas. -- Submission to /r/adventofcode/comments/r66wgb/aoc_2021_adventure_time -- script: lua fps=60 t=0 index=0 sprite_sz=8 screen_width=30 --8px sprites screen_depth=17 --8px sprites sprite_x=0 sprite_y=0 puzzles={} -- Day0 -- -- Title screen function day0() cls(10) print("AoC Adventure 2021",75,40,02) print("press A(z) to start",75,100,07) spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) --spr(35+t%60//30*1,120,60,14,1,0,0,1,1) -- spr(1+t%60//30*2,x,y,14,3,0,0,2,2) end -- End Day0 -- -- Day1 -- d1tally=0 depths={} d1input=[[ 199 200 208 210 200 207 240 269 260 263 ]] function d1init() for i in string.gmatch(d1input,"(%d+)") do table.insert(depths, math.tointeger(i)) end x=-120 --start left of 0 (absolute_x) y=depths[1]*sprite_sz-screen_depth-(136//2) --absolute_y) camera_x=x//sprite_sz camera_y=y//sprite_sz sand=16 star=21 fish=6 depth_ct=0 floor_shown={} floor_shown[0]=true end d1init() -- function inside_sonar(index) if index <=0 then -- no data -make infinite land left depths[index] = depths[1] end if index >= #depths then -- no data - make infinite land right depths[index]=depths[#depths] end -- sonar is midde of screen sonar_left=camera_x+screen_width//2-3 sonar_right=camera_x+screen_width//2+3 sonar_top=camera_y+screen_depth//2-2 sonar_bottom=camera_y+screen_depth//2+2 if sonar_left <= index and index<=sonar_right -- playtest QoL: sonar inside land should detect land and depths[index] <= sonar_bottom then return true end return false end -- function draw_sea_floor() for sprite_x=0,screen_width do for sprite_y=0,screen_depth do scr_x=sprite_x*sprite_sz scr_y=sprite_y*sprite_sz index=camera_x+sprite_x if depths[index] and floor_shown[index] then -- draw sand if camera_y+sprite_y >= depths[index] then spr(sand,scr_x-x%8,scr_y-y%8) --attempt smooth scroll end else --floor not discovered if inside_sonar(index) then floor_shown[index]=true end end -- playtest QoL-always draw star if index==stars[1][1] and camera_y+sprite_y+2==stars[1][2] then spr(star,scr_x-x%8,scr_y-y%8,14,1,0,t%(fps*4)//fps,2,2) end end end print("hor:"..(camera_x+screen_width//2).." depth: "..(camera_y+screen_depth//2),0,6) end -- function draw_sub() subx=240//2-8-8 suby=136//2-12 spr(1+t%fps//30*2,subx,suby,14,2,0,0,2,1) end function draw_sonar() ellib(240/2,136/2,24,16,12) ellib(240/2,136/2,16,10,12) ellib(240/2,136/2,8,5,12) end -- d1p1 = coroutine.create(function () local tally=0 for i=1,#depths-1 do if depths[i+1]>depths[i] then tally=tally+1 end -- trace("Day 1- tally:"..tally) coroutine.yield(tally) end --rudimentary test case if not (tally==7) then tally="Day1 broken" end return tally end ) function day1() cls(10) draw_sea_floor() draw_sonar() print("Day 1: Sonar Sweep - tally:"..d1tally) if (coroutine.status(d1p1) == "suspended") then _, d1tally=coroutine.resume(d1p1) end -- if star found set day2 and reset position if camera_x+15==stars[day][1] and camera_y+8+2==stars[day][2] then --+2 because put star is ON seafloor, not in floor day=2 x=-15*8 --start left of 0 (absolute_x) --y=depths[1]*sprite_sz-screen_depth-(136//2) --absolute_y) y=-7*8 btnp(1) btnp(2) btnp(3) btnp(4) end end -- End Day 1 -- -- -- Day2 --- path=0 --sprite0 paths={} product=0 d2input=[[ forward 5 down 5 forward 8 up 3 down 8 forward 2 ]] commands={} for w,i in string.gmatch(d2input,"(%a+) (%d+)") do table.insert(commands, {w, math.tointeger(i)}) end function draw_fish() cls(11) for sprite_x=0,screen_width do for sprite_y=0,screen_depth do scr_x=sprite_x*sprite_sz scr_y=sprite_y*sprite_sz index=camera_x+sprite_x indey=camera_y+sprite_y if indey>=0 then spr(fish,scr_x-x%8,scr_y-y%8,14) end end end end function draw_path() for sprite_x=0,screen_width do for sprite_y=0,screen_depth do scr_x=sprite_x*sprite_sz scr_y=sprite_y*sprite_sz index=camera_x+sprite_x indey=camera_y+sprite_y if paths[index] and paths[index][indey] then spr(path,scr_x-x%8,scr_y-y%8) --need blue water tile end -- playtest QoL-always draw star if index==stars[day][1] and camera_y+sprite_y+2==stars[day][2] then spr(star,scr_x-x%8+8,scr_y-y%8+12,14,1,0,t%(fps*4)//fps,2,2) end end end end d2p1 = coroutine.create(function () f=0 d=0 -- trace("Day 2 -"..f..","..d) for i=1,#commands do --direction for j=1,commands[i][2] do -- magnitude if commands[i][1]=="forward" then f=f+1 elseif commands[i][1]=="down" then d=d+1 elseif commands[i][1]=="up" then d=d-1 end if not paths[f] then paths[f]={} end paths[f][d]=true --trace("paths"..commands[i][2].."."..f..","..d) --trace(paths[f][d]) end coroutine.yield(f,d) end stars[2]={f,d} product=f*d if not (product==150) then product="Day2 broken" end return f,d end ) function day2() if d==nil then d=0 end if f==nil then f=0 end if (coroutine.status(d2p1) == "suspended") then _, f,d=coroutine.resume(d2p1) end cls(10) draw_fish() draw_sea_floor() draw_path() draw_sub() -- print("Day 2: Dive! - hor:"..(camera_x+screen_width//2).." depth: "..(camera_y+screen_depth//2)..f*d) print("Day 2: Dive! - product: "..product) if camera_x+15==stars[2][1] and camera_y+8==stars[2][2] then day=3 end end -- End Day 2 - -- -- Day3 -- d3input=[[ 00100 11110 10110 10111 10101 01111 00111 11100 10000 11001 00010 01010 ]] binary={} gamma={} --greater epsilon={} --lesser for s in string.gmatch(d3input, "(%d+)") do table.insert(binary, s) end d3p1=coroutine.create(function() for i=1,#binary do trace(binary[i]) --trace(string.sub(binary[i],1,1)) for j=1,#(binary[i]) do --print(string.sub(binary[i],j,j),00,75,100) c=string.sub(binary[i],j,j) if gamma[j]==nil then gamma[j]=0 end gamma[j]=gamma[j]+math.tointeger(c) end power=calc_power(gamma) coroutine.yield(power) end return power end )--end coroutine function calc_power(gamma) -- table of binary string (not num) to decimal power g=0 e=0 for i=#gamma,1,-1 do --trace(power) --trace(gamma[i].."/"..#binary//2,02) if gamma[i]>=(#binary//2) then --winner of all binary numbers g=g+2^(#gamma-i) --so hacky to invert the decrementing index 2^0 first else e=e+2^(#gamma-i) --trace(e) end end power=g*e return power --return power end function draw_presents() i=1 gift=17 coal=18 sprite={} sprite["1"]=gift sprite["0"]=coal sprite["arrow"]=19 sprite["blank"]=0 sprite["star"]=20 -- y=0 to 136 per 60%3 -- sprite is 8px+8space =16 startx=60 starty=32 for i=1,#binary do -- for y=0 to y=136 is 136/8=17 tiles, 136/16=8.5=9 if starty-i*16+y >0 and starty-i*16+y<136 then for j=1,#(binary[i]) do c=string.sub(binary[i],j,j) --draw going right and up, because they're falling down spr(sprite[c],startx+j*16,starty-i*16+y,14,2) end end end if coals>score then spr(coal,100,starty-(#binary+5)*16+y,14,4,0,t%(fps*4)//fps) else spr(gift,100,starty-(#binary+5)*16+y,14,4,0,t%(fps*4)//fps) end end function d3update() target_l=(y-80)//16+1 gifts={[1]={2,3},[2]={1,2},[3]={0,0},[4]={3,1}} for i=1,#gifts do if binary[target_l] and btnp(gifts[i][1],30,30) then spr(sprite["arrow"],startx+16*i,104+2,00,2,0,gifts[i][2]) if string.sub(binary[target_l],i,i)=="1" then print("gift",0,110) score=score+1 else coals=coals+1 end else spr(sprite["arrow"],startx+16*i,104,14,2,0,gifts[i][2]) end end print("gifts: "..score.." coals: "..coals, 0, 6) end function d3init() x=0 y=0 init=true score=0 coals=0 d3complete=false end function d3scroll_y() if y < starty+(#binary+7)*16 then if t%5==0 then y=y+1 end --if btn(4) then y=y+1 end else if btnp(0,60,60) then d3complete=true end -- if d3complete==true then -- spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) -- spr(star,108,starty-(#binary+4)*16+y,14,4,0,t%(fps*4)//fps) --end end end function day3() if day==3 and init~=true then d3init() end if (coroutine.status(d3p1) == "suspended") then _,power=coroutine.resume(d3p1) end cls(10) draw_presents() print("Day 3: Binary Diagnostic - power: "..power) -- print("Work in Progress.",75,78) -- print("Press A to restart",75,84) if d3complete==true then if (score>=coals) then spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) end if btnp(0) then day=day+1 end end d3scroll_y() d3update() end -- End Day 3-- -- -- Day 4 -- d4p1=coroutine.create(function() coroutine.yield() end )--end coroutine function day4() if (coroutine.status(d4p1) == "suspended") then _,gamma,d=coroutine.resume(d4p1) end cls(10) print("Day 4: Giant Squid") print("Work in Progress.",75,78) print("Press A to restart",75,84) spr(08,96,28,11,3,t%(fps*2)//fps,0,2,2) end -- End Day 4 -- -- -- Day 5 -- d5p1=coroutine.create(function() coroutine.yield() end )--end coroutine function day5() if (coroutine.status(d5p1) == "suspended") then _,gamma,d=coroutine.resume(d5p1) end cls(10) print("Day 5: Hydrothermal Venture") print("Work in Progress.",75,78) print("Press A to restart",75,84) spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) end -- End Day 5 -- -- -- Day 6 -- d6input=[[ 3,4,3,1,2 ]] lanternfish={} numfish=0 --parse input string for i in string.gmatch(d6input,"(%d)")do table.insert(lanternfish, math.tointeger(i)) end --sort lanternfish into buckets buckets={[0]=0,0,0,0,0,0,0,0,0} buckets["temp"]=0 for i=1,#lanternfish do -- trace(lanternfish[i]) buckets[lanternfish[i]]=buckets[lanternfish[i]]+1 end --count them up gen=0 d6p1=coroutine.create(function() for gen=1,80 do -- for gen=1,256 do --shift buckets-order matters due to [0][6][7][8] buckets["temp"]=buckets[0] buckets[0]=buckets[1] buckets[1]=buckets[2] buckets[2]=buckets[3] buckets[3]=buckets[4] buckets[4]=buckets[5] buckets[5]=buckets[6] buckets[6]=buckets[7] buckets[7]=buckets[8] buckets[8]=buckets["temp"] --new spawn buckets[6]=buckets[6]+buckets["temp"] -- reset age --sum updated buckets numfish=0 for i=0,8 do numfish=numfish+buckets[i] end coroutine.yield(gen, numfish) end return gen, numfish end )--end coroutine function day6() if (coroutine.status(d6p1) == "suspended") then _,gen,numfish,d=coroutine.resume(d6p1) end cls(10) print("Day 6: Lanternfish!") print("Day "..gen..", #fish "..numfish,0,6) print("Work in Progress.",75,78) print("Press A to restart",75,84) spr(06,116,60,14,2,0,t%(fps*4)//fps,1,1) end -- End Day 6 -- -- -- Day 7 -- crabx={ 16,1,2,0,4,2,7,1,2,14 } crabsorted={ 16,1,2,0,4,2,7,1,2,14 } --duplicate because sort is in place table.sort(crabsorted) farthest_crab=crabsorted[#crabsorted] eff_pos=0 min_fuel=1000000 fuel_used={} cur_x=1 cur_y=1 d7floor={} for i=0,farthest_crab do d7floor[i]=16 --sand=16 end d7p1=coroutine.create(function() trace(#crabsorted..","..farthest_crab) for i=0,farthest_crab do --for each column fuel_used[i]=0 for _,c_pos in ipairs(crabx) do --move the crab and calculate fuel fuel_used[i]=fuel_used[i]+math.abs(c_pos-i) --trace(i.."-"..c_pos.."="..fuel_used[i]) --coroutine.yield() end trace(i.."=>"..fuel_used[i]) if fuel_used[i] < min_fuel then min_fuel=fuel_used[i] eff_pos=i end -- trace(min_fuel.."fuel@pos"..eff_pos) coroutine.yield(eff_pos,min_fuel) end return eff_pos, min_fuel end )--end coroutine crab=35 --sprite function draw_crabs() for i,c_pos in ipairs(crabx) do spr(crab+t%60//30,c_pos*8+22,i*8+24,14) --spr(1+t%60//30*2,x,y,14,3,0,0,2,2) --trace(i.."-"..c_pos.."="..fuel_used[i]) end -- trace(i.."=>"..fuel_used[i]) -- trace(min_fuel.."fuel@pos"..eff_pos) end function draw_grid() for i=0,farthest_crab do print(i,i*8+24,24,00,false,1,true) line(i*8+26,30,i*8+26,136,06) end end function d7update() --x,y transposed to y,x on screen if btnp(0) then cur_x=cur_x-1 end if btnp(1) then cur_x=cur_x+1 end if btnp(2) then crabx[cur_x]=crabx[cur_x]-1 end if btnp(3) then crabx[cur_x]=crabx[cur_x]+1 end --bound check if crabx[cur_x]== nil then cur_x=1 end cur_y=crabx[cur_x] print(cur_x..","..cur_y,0,100) rectb(cur_y*8+24-3,cur_x*8+24,10,10,05) --extra pixel around pos=crabx[1] for i=1,#crabx do if crabx[i]~=pos then break end if i==#crabx then --checked all crabs if pos==eff_pos then d7floor[pos]=gift print("Press A to continue",75,84) spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) else d7floor[pos]=coal end end end for i=0,farthest_crab do spr(d7floor[i],i*8+24-3,136-8) --extra pixel around end end function day7() if (coroutine.status(d7p1) == "suspended") then _,eff_pos,min_fuel=coroutine.resume(d7p1) end cls(10) print("Day 7: A Treachery of Whales") print("min_fuel: "..min_fuel.." @["..eff_pos.."]",0,6) -- print("Work in Progress.",75,78) draw_grid() draw_crabs() d7update() end -- End Day 7 -- -- -- Day 8 -- d8input=[[ be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce ]] input={} tally=0 wire={ --[wire]=>segment ["a"]=nil, ["b"]=nil, ["c"]=nil, ["d"]=nil, ["e"]=nil, ["f"]=nil, ["g"]=nil, } guess={ ["a"]="a", ["b"]="b", ["c"]="c", ["d"]="d", ["e"]="e", ["f"]="f", ["g"]="g", } d8ans={} --wrong=correct cur_wire=1 --grid row. the col is calculated randchoice=0 --split lines d8p1=coroutine.create(function() tally=0 for a, b, c, d, e, f, g, h, i, j, k, l, m, n in string.gmatch(d8input, "(%a+) (%a+) (%a+) (%a+) (%a+) (%a+) (%a+) (%a+) (%a+) (%a+) | (%a+) (%a+) (%a+) (%a+)") do trace(k..l..m..n) trace("break") table.insert(input,{a,b,c,d,e,f,g,h,i,j,k,l,m,n}) if #k==7 or #k==2 or #k==3 or #k==4 then tally=tally+1 end if #l==7 or #l==2 or #l==3 or #l==4 then tally=tally+1 end if #m==7 or #m==2 or #m==3 or #m==4 then tally=tally+1 end if #n==7 or #n==2 or #n==3 or #n==4 then tally=tally+1 end coroutine.yield(tally) end -- trace("p1tally: "..tally) -- for _,s in ipairs(input[1]) do -- trace(s) -- for c in string.gmatch(s,"(%a)") do -- trace(c) -- end -- end randchoice=math.random(#input) trace("randchoice="..randchoice) d8solve(input[randchoice]) return tally end )--end coroutine numeral={} unknown={} function d8solve(inputs) --table for i,segments in ipairs(inputs) do trace(segments..#segments) unknown[i]={} for c in string.gmatch(segments,"(%a)") do unknown[i][c]=true trace(i..c) --trace(unknown[i][c]) end end -- trace(unknown[14]["c"]) -- trace(#unknown[14]) --segments of 1,7,4,8 are uniquely known for k,v in ipairs(unknown)do --trace(k) --trace(v) local len=0 for _,_ in pairs(unknown[k]) do len=len+1 end -- trace("unknown"..k.." len: "..len) if len==2 then numeral[1]=unknown[k] trace("found 1") elseif len==3 then numeral[7]=unknown[k] trace("found 7") elseif len==4 then numeral[4]=unknown[k] trace("found 4") elseif len==7 then numeral[8]=unknown[k] trace("found 8") end end --after all 1,7,4,8 -- credit /r/adventofcode for k,v in ipairs(unknown)do --trace(k) --trace(v) local len=0 for _,_ in pairs(unknown[k]) do len=len+1 end -- trace("unknown"..k.." len: "..len) if len==5 then if num_matches(unknown[k],numeral[1])==2 then numeral[3]=unknown[k] trace("found 3") elseif num_matches(unknown[k],numeral[4])==2 then numeral[2]=unknown[k] trace("found 2") else numeral[5]=unknown[k] trace("found 5") end elseif len==6 then -- trace("loop len=6") -- trace(unknown[k]) -- trace(numeral[1]) if num_matches(unknown[k],numeral[1])==1 then numeral[6]=unknown[k] trace("found 6") elseif num_matches(unknown[k],numeral[4])==4 then numeral[9]=unknown[k] trace("found 9") else numeral[0]=unknown[k] trace("found 0") end end end wire["a"]=tab_sub(numeral[7],numeral[1]) wire["c"]=tab_sub(numeral[8],numeral[6]) wire["d"]=tab_sub(numeral[8],numeral[0]) wire["e"]=tab_sub(numeral[8],numeral[9]) wire["f"]=tab_sub(numeral[1],numeral[2]) wire["b"]=tab_sub(numeral[4],numeral[3]) wire["g"]=tab_sub(numeral[8],{[wire["a"]]=true,[wire["b"]]=true,[wire["c"]]=true,[wire["d"]]=true,[wire["e"]]=true,[wire["f"]]=true}) trace("wire a => seg "..wire["a"]) trace("wire b => seg "..wire["b"]) trace("wire c => seg "..wire["c"]) trace("wire d => seg "..wire["d"]) trace("wire e => seg "..wire["e"]) trace("wire f => seg "..wire["f"]) trace("wire g => seg "..wire["g"]) for k,v in pairs(wire) do d8ans[v]=k -- d8ans[wrong segment]=correct segment end end function num_matches(table1, table2) local num=0 for k1,v1 in pairs(table1) do -- trace(k1) for k2,v2 in pairs(table2) do if k1==k2 then num=num+1 -- trace("matches: "..num) end end end -- trace("total matches: "..num) return num end function tab_sub(table1,table2) --subtract table2 from table1. --requires single difference to work properly --return single element (not table) --reference to original table. need make copy. local tmp={} for k,v in pairs(table1) do tmp[k]=v --trace("table1 "..k) end --subtract from tmp (table1) for k,v in pairs(table2) do --trace("table2 "..k) tmp[k]=nil end --return single element. for k,v in pairs(tmp) do return k end trace("should never reach here") end function d8draw_grid() coords={"a","b","c","d","e","f","g"} icoords={} for i,v in ipairs(coords) do icoords[v]=i end print("correct",40,20) for i,v in pairs(coords)do --for k,v in pairs(disp_seg)do line(i*8+26,30,i*8+26,110,06) print(v,i*8+24,24,00,false,1,true) --end end for i,v in pairs(coords)do --for k,v in pairs(disp_seg)do line(0,i*8+26,84,i*8+26,06) print(v,24,i*8+24,00,false,1,true) --end end print("w",16,30) print("r",16,36) print("o",16,42) print("n",16,48) print("g",16,54) --draw dots on grid for seg,ans in pairs(guess) do for i,v in ipairs(coords)do if seg==v then print(guess[seg],icoords[guess[seg]]*8+24,i*8+24,00,false,1,true) --line(30,i*8+26,84,i*8+26,06) end end end --draw cursor curx=22 cury=22 --cur_wire=1 --grid row. the col is calculated rectb(curx+icoords[guess[coords[cur_wire]]]*8,cury+cur_wire*8,9,9,00) if btnp(0) and cur_wire>1 then cur_wire=cur_wire-1 end if btnp(1) and cur_wire<7 then cur_wire=cur_wire+1 end if btnp(2) and icoords[guess[coords[cur_wire]]]>1 then guess[coords[cur_wire]]=coords[icoords[guess[coords[cur_wire]]]-1] end if btnp(3) and icoords[guess[coords[cur_wire]]]<7 then guess[coords[cur_wire]]=coords[icoords[guess[coords[cur_wire]]]+1] end -- puzzle if input[randchoice] then x=4 --trace("#input="..#input) for i,v in pairs(input[randchoice]) do draw_seg(v,x) x=x+print(v,x,100-(i%2)*4,00,false,1,true) x=x+4 end end end function draw_seg(v,x) --draw all 7 off spr(40,x,104,14,1,0) spr(40,x-3,108,14,1,0,1) spr(40,x+3,108,14,1,0,1) spr(40,x,112,14,1,0) spr(40,x-3,116,14,1,0,1) spr(40,x+3,116,14,1,0,1) spr(40,x,120,14,1,0) --overdraw connected for c in string.gmatch(v,"(%a)") do local i=icoords[guess[c]] if i==1 then spr(39,x,104,14,1,0) elseif i==2 then spr(39,x-3,108,14,1,0,1) elseif i==3 then spr(39,x+3,108,14,1,0,1) elseif i==4 then spr(39,x,112,14,1,0) elseif i==5 then spr(39,x-3,116,14,1,0,1) elseif i==6 then spr(39,x+3,116,14,1,0,1) elseif i==7 then spr(39,x,120,14,1,0) end end end function d8check(guess, d8ans) for k,v in pairs(guess) do if guess[k]~=d8ans[k] then return false end end spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) end function day8() if (coroutine.status(d8p1) == "suspended") then _,tally=coroutine.resume(d8p1) end cls(10) print("Day 8: Seven Segment Search - p1tally: "..tally) --print("Work in Progress.",75,78) --print("Press A to restart",75,84) --spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) d8draw_grid() d8check(guess, d8ans) end -- End Day 8 -- -- -- Day 9 -- d9input=[[ ]] d9p1=coroutine.create(function() tally=0 coroutine.yield(tally) return tally end ) function day9() if (coroutine.status(d9p1) == "suspended") then _,tally=coroutine.resume(d9p1) end cls(10) print("Day 9: Smoke Basin - tally: "..tally) print("Work in Progress.",75,78) print("Press A to restart",75,84) spr(star,116,60,14,1,0,t%(fps*4)//fps,2,2) end -- End Day 9 -- -- Stars -- stars = { {#depths, depths[#depths]}, -- day 1 {0,0}, --day2 updated in game {0,0}, --day3 } -- End Stars -- --puzzle function references (not regular numerical values) puzzles={ [0]=day0, day1, day2, day3, day4, day5, day6, day7, day8, day9, } function debug() print("map: "..x..","..y,0,12) print("camera "..camera_x..","..camera_y,0,18) end -- Start Game -- day=0; function TIC() if day==1 or day==2 then if btn(0) then y=y-1 end if btn(1) then y=y+1 end if btn(2) then x=x-1 end if btn(3) then x=x+1 end end if btnp(4, 180, 180) then day=day+1 end --btn A if btnp(5, 180, 180) then day=day-1 end --btn B camera_x=x//sprite_sz+1 camera_y=y//sprite_sz-1 day=day%(#puzzles+1) --'#' excludes 0 -- call the relevant puzzle. NO IFs! puzzles[day]() t=t+1 -- debug() end function temp() if t%fps==0 then index=(index+1)%#depths end end