n個以上条件を満す要素があったらtrueを返す関数
30分プログラム、その615。n個以上条件を満す要素があったらtrueを返す関数。
@nobio0205がおもしろそうなことをつぶやいてた。
「n個の条件のうちm個を満たしたらtrue、それ以外ならfalse(満たしている条件の種類は
問わない)」っていうプログラムのスマートな書き方って何か無いかな。ifを並べて条件を
満たしてるものをカウントしてmと比較するぐらいしか思い浮かばない
http://twitter.com/nobio0205/status/2447238347
これをちょっと整理して、引数として述語fと整数nと配列xsを受け取って、xsのうちfを満すのものがn個以上あるなら真を返す関数を書くことにした。
さあ、やってみよう。
使い方
# true some { $_[0] % 2 == 0; } 4,(1..10); # false some { $_[0] % 3 == 0; } 4,(1..10);
ソースコード
#! /usr/bin/perl # -*- mode:perl; coding:utf-8 -*- # # cond.pl - # # Copyright(C) 2009 by mzp # Author: MIZUNO Hiroki / mzpppp at gmail dot com # http://howdyworld.org # # Timestamp: 2009/07/03 20:57:57 # # This program is free software; you can redistribute it and/or # modify it under MIT Lincence. # use strict; use warnings; use Data::Dumper; use constant TRUE => 1; use constant FALSE => 0; sub some(&$@) { my ($f,$n,@xs) = @_; my $i = 0; foreach my $x (@xs) { return TRUE if $f->($x) and ++$i >= $n; } return FALSE; } print Dumper(some { $_[0] % 2 == 0; } 4,(1..10)); print Dumper(some { $_[0] % 3 == 0; } 4,(1..10));