package Y::AoC::Task; use v5.36; use Exporter ('import'); use IO::Handle; our @EXPORT = qw(t asay bsay); use Y::AoC qw(red white grey yellow day year); our $printed_err; $SIG{__DIE__} = sub($msg) { $msg =~ s/\A(.*?)( at \S+ )(line \d+)/red($1).$2.white($3)/e if -t STDERR && !$printed_err++; say STDERR $msg; die "\n"; }; $SIG{__WARN__} = sub($msg) { $msg =~ s/\A(.*?)( at \S+ )(line \d+)/red($1).$2.white($3)/e if -t STDERR && !$printed_err++; say STDERR $msg; }; STDOUT->autoflush(1); STDERR->autoflush(1); our $in_test; sub t($subtest = ()) { $subtest //= ''; $ARGV[0] =~ s/in\.txt/test$subtest.txt/ if defined $ARGV[0]; $in_test = 1; } sub asay(@msg) { try_submit(1, @msg); } sub bsay(@msg) { try_submit(2, @msg); } sub try_submit($part, @msg) { my $msg = join($, // '', @msg); my $ans; $msg =~ s/(\w+)\z/white($ans = $1)/e; say $msg; return if $in_test; my $day = day; my $year = year; my $url = "https://adventofcode.com/$year/day/$day/answer"; my $cachefile = "ans-$year-$day-$part-$ans.html"; local $| = 1; print "\nSubmit $url\nlevel=", white($part), ' answer=', white($ans), ' ? [Enter]/[Ctrl-C]: '; local $/ = "\n"; scalar ; eval '{ local $SIG{__DIE__}; require Y::AoC::UA; }'; my $res = Y::AoC::UA::request($url, { form => { answer => $ans, level => $part, }, cache_to => $cachefile, }); my $art = $res->find('main > article > p')->join("\n"); if (!$art) { say $res->to_string; return; } $art =~ s/'/'/g; $art =~ s/(?<=That's )not(?= the right answer)/red($&)/e; my $ok = $art =~ s/(?<=That's the )(right answer)/yellow($&)/e; $art =~ s/(gold stars?)/yellow($&)/e; $art =~ s/(silver star)/grey($&)/e; Y::AoC::UA::cache_del($cachefile) if $msg =~ s/(?<=Please wait ).*?(?= before trying again)/white($&)/e; $art =~ s/(?<=your answer is )([^\.;]+)/red($&)/e; $art =~ s/([^<]+)<\/code>/white($1)/e; $art =~ s/<[^>]+>//g; if ($ok) { system "cp $0 backup/$0-ok-$ans-$part"; } say $art; } 1;