Problem54 - ProjectEuler(未解決)
30分プログラム、その329。Probelm54 - Project Euler。
まだ解けていないけれど、30分たったので一応。
汚ないコードを読んで心が汚れた直後だったので、無心でコードを書きたかった。なので、冗長な部分がかなりある。
いまひとつうまく動かないので、明日デバッグしよう。
使い方
$ perl problem54.pl ....
ソースコード
#! /usr/bin/perl # -*- mode:perl; coding:utf-8 -*- # # problem54.pl - # # Copyright(C) 2008 by mzp # Author: MIZUNO Hiroki / mzpppp at gmail dot com # http://howdyworld.org # # Timestamp: 2008/07/01 22:35:35 # # This program is free software; you can redistribute it and/or # modify it under MIT Lincence. # use strict; use warnings; use Data::Dumper; package Card; use Class::Struct; struct Card =>{ suit => '$',val=>'$' }; sub make($$){ my ($self,$s,$v) = @_; my $card = Card->new(); $card->suit($s); $card->val($v); return $card; } sub parse($){ my ($self,$s) = @_; my %special = ('J'=>11,'Q'=>12,'K'=>13,'A'=>1); if($s =~ /\A(..?)(.)\Z/){ my $v = $1; my $s = $2; if(defined $special{$v}){ $v = $special{$v}; } $self->make($s,$v); } } package main; use List::Util qw(reduce max); sub card_cmp($$){ my ($a,$b) = @_; my $r = $a->val <=> $b->val; unless($r==0){ $r; }else{ $a->suit cmp $b->suit; } } sub same_value(@){ my ($x) = @_; reduce {$a && $b} map { $_ == $x} @_; } sub flash(@){ my ($x) = @_; if(reduce {$a && $b} map { $_->suit eq $x->suit} @_){ (5,max map {$_->val()} @_); } } sub straight(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if($b = $a+1 && $c == $b+1 && $d == $c+1 && $e == $d+1){ (4,$e); } } sub royal_flash(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if(flash(@_) && $a == 1 && $b == 10 && $c == 11 && $d == 12 && $e == 13){ (9,0); } } sub straight_flash(@){ my @val = map {$_->val()} @_; if(flash(@_) && straight(@_)){ (8,max @val); } } sub four(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if(same_value($a,$b,$c,$d)){ (7,$a) }elsif(same_value($b,$c,$d,$e)){ (7,$b); } } sub full_house(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if(same_value($a,$b) && same_value($c,$d,$e)){ (6,$a > $c ? $a : $c); }elsif(same_value($a,$b,$c) && same_value($d,$e)){ (6,$a > $c ? $a : $d); } } sub three(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if(same_value($a,$b,$c)){ (3,$a); }elsif(same_value($b,$c,$d)){ (3,$b); }elsif(same_value($c,$d,$e)){ (3,$c); } } sub two(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if(same_value($a,$b) && same_value($c,$d)){ (2,$a > $c ? $a : $c); }elsif(same_value($a,$b) && same_value($d,$e)){ (2,$a > $d ? $a : $d); }elsif(same_value($b,$c) && same_value($d,$e)){ (2,$b > $d ? $b : $d); } } sub one(@){ my ($a,$b,$c,$d,$e) = map {$_->val()} @_; if(same_value($a,$b)){ (1,$a); }elsif(same_value($b,$c)){ (1,$b); }elsif(same_value($c,$d)){ (1,$c); }elsif(same_value($d,$e)){ (1,$d); } } sub none(@){ (0,max @_); } sub check(@){ royal_flash(@_) || straight_flash(@_) || four(@_) || full_house(@_) || flash(@_) || straight(@_) || three(@_) || two(@_) || one(@_) || none(@_); } sub cmp_line(@){ my ($line) = @_; my @cards = split / /,$line; my @player1 = sort { card_cmp($a,$b) } map { Card->parse($_) } @cards[0..4]; my @player2 = sort { card_cmp($a,$b) } map { Card->parse($_) } @cards[5..9]; my ($x1,$y1) = check(@player1); } my @cards = sort { card_cmp($a,$b) } map { Card->parse($_) } qw(AH 2H 3H 4H 5H); print Dumper(cmp_line('8C TS KC 9H 4S 7D 2S 5D 3S AC'));