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));