#!/usr/bin/env perl

use warnings;
use strict;

my %alpha;
sub alpha {
  my $i = shift;
  return $alpha{$i} //= int rand 10;
}

my %cache;
sub ask {
  my ($name, @is) = @_;
  print "[$name] ";
  for my $i (@is) {
    print "$i(@{[ alpha($i) ]}) ";
  }
  print "? ";

  if(exists $cache{$name}{"@is"}) {
    my $v = $cache{$name}{"@is"};
    print "cached: $v\n";
    return $v;
  }

  my $response;
  if(1) {
    chomp($response = <>);
  } else {
    if($name eq "B") {
      $response = (@is >= 3 and @is >= alpha($is[0])) ? "!" : "";
    } elsif($name eq "good") {
      $response = "";
      OUTER: for my $i (0..$#is-1) {
        for my $j ($i+1..$#is) {
          if(alpha($is[$i]) <= alpha($is[$j])) {
            $response = "$is[$i] $is[$j]";
            last OUTER;
          }
        }
      }
    } else {
      die;
    }
    print "$response\n";
  }

  if($response =~ /(\d+)\s+(\d+)/) {
    return $cache{$name}{"@is"} = [$1, $2];
  } elsif($response =~ /!/) {
    return $cache{$name}{"@is"} = "!";
  } else {
    return $cache{$name}{"@is"} = 0;
  }
}

sub go {
  my ($n, $is, $sads) = @_;

  if(my $ij = ask("good", @$is)) {
    my ($i, $j) = @$ij;
    $sads->{$i}($j);
  } else {
    my $ho;
    $ho = sub {
      my $js = shift;
      my $l  = @$js[-1];

      if(ask("B", @$js) eq "!") {
        return;
      } else {
        die if exists $sads->{$l};
        my %newsads = %$sads;
        $newsads{$l} = sub { my $m = shift; $ho->([@$js,$m]); };
        go($l+1, [@$is,$l], \%newsads);
      }
    };

    $ho->([$n]);
  }
}

sub thm {
  return if ask("B");

  go(0, [], {});
}

thm();
for my $i (0..10) {
  print "$i(@{[ alpha($i) ]}) ";
}
print "\n";
