App-denomfind

 view release on metacpan or  search on metacpan

bin/denomfind  view on Meta::CPAN

#!/usr/bin/perl

#
# denomfind 
#    小数がいくつか与えられたら、それはどんな(共通する)分母の分数であるかを推定する
#   -- developed by 下野寿之 Toshiyuki Shimono in Tokyo, Japan, 
#   -- first developed probably on 2016-06-20
#   -- one debugging on -% and -c on 2022-10-11 
#   -- heavy implementation added on 2022-10-12, 10-13.  
#

use 5.024 ; use strict ; use warnings ;  # s/のr修飾子は v5.14を要求
use Getopt::Std ; getopts 'a:cD:fg:IL:M:QT:y:%2:5:' , \my%o ; 
use POSIX qw[ ceil floor ] ; 
use Term::ANSIColor qw[ :constants color ] ; $Term::ANSIColor::AUTORESET = 1 ;
use Math::BigInt qw[ bgcd ] ; # -Qの指定時に必要となる。
use List::Util qw [ reduce min max ] ;
use FindBin qw[ $Script ] ; 
my $mpu ; # Math::Prime::Util のモジュールがインストールされているか点検。
CHECK {$mpu = eval 'use Math::Prime::Util qw[ factor factor_exp ]; 1 ' || 0 } # 他にBEGIN INIT UNITCHECK が使える。
& test if exists $o{T} ; 
HELP_MESSAGE () unless @ARGV ;

### テストパターン
sub test () { 
  my $cmd ;
  do { 
    no warnings qw [experimental::smartmatch];
    $cmd = "$0 -D0 -M0 -y-2.. -52 -Q -% 4.76 3.94 3.50 26.37 3.58 2.72" when '1'  ; 
    $cmd = "$0 -g8 -D-6%% -a5e-5 -y, 3.14159265358979323" when  '2'  ;
    $cmd = "$0 -y0,3,4,5 -g290,20 -I -% 2.0 50.7 13.5 21.6 6.8" when  '3'  ;
    # ↓ワクチン1回目の例. 整数の分子が見つかるものが複数ある分母を出力。配付資料に253と書かれているが、その数あたりを出力。
    #   四捨五入を2回行って、最下位を1桁ずつ縮めた場合も想定している。従って、誤差も表示すると、最大のずれは0.05%でなく0.055%。
    $cmd = "$0  -y1.. -g230,50 -D-3% -Q -52 -% 48.2 26.9 23.1 21.6 20.0 12.2 6.7 5.9 2.4" when  'v1'  ;
    # ↓ワクチン2回目の例. 整数の分子が見つからないものが3個以下の分母を出力。配付資料の250という数が正しそうであると分かる。
    $cmd = "$0 -y-3.. -g50 -D0 -Q -% 65.2 45.6 35.6 30.8 29.6 26.4 14.8 7.2 5.6 4.8 4.4" when  'v2'  ;
    # ↓ワクチン3回目の例. 整数の分子が見つかるものが複数ある分母を出力。配付資料に分母97とあるが96も3個混じったとも考えられる。
    $cmd = "$0 -y2.. -D0 -Q -% 81.4 63.3 54.6 51.0 46.9 45.9 28.6 17.3 13.3 11.3 10.3" when  'v3'  ;
    # ↓ バンダイのお年玉の2018年の調査で、小学生、中学生、男子、女子の場合
    $cmd = "$0 -y, -52 -g5 -D-3% -Q -% 39.9 30.4 29.5 18.0 17.2" when  'o1'  ;
    $cmd = "$0 -y, -52 -g5 -D-3% -Q -% 33.7 31.8 23.5 22.7 22.0" when  'o2'  ;
    $cmd = "$0 -y, -52 -g5 -D-3% -Q -% 37.5 36.2 27.3 18.8 18.5" when  'o3'  ;
    $cmd = "$0 -y, -52 -g5 -D-3% -Q -% 39.4 35.7 21.5 20.7 18.4" when  'o4'  ;
    ## ↓ https://www.nexer.co.jp を表示する者が運営するサイトのページから。 
    #  ↓ https://trend-research.jp/3038/ の「どのくらいの頻度で..?」
    $cmd = "$0 -% 0.7 1.8 5.5 7.7 18.4 12.9 21.3 8.5 23.2" when 'n1' ; 
    #  ↓ https://prtimes.jp/main/html/rd/p/000000231.000087626.html 月々いくらまでなら?
    $cmd = "$0 -D-2%,----------- -y-1.. -a0.07% -% 11.2 29.3 28.2 11.6 9.7 10.1" when 'n2' ; 
    $cmd = "$0 -g259,1 -a0.194% -D-3% -% 16.9 23.9 31.0 9.9 2.8 5.6" when 'n3' ; # -a で分子をなんとか探索している。
    # ここからは自分で用意したスライドに関して。
    $cmd = "$0 -y0.. -D5 -Q -g141,20 -% 2.0 13.5 21.6 6.8" when 's18' ;
    $cmd = "$0 -y-1.. -D5 -52 -g20 -% 2.0 50.7 13.5 21.6 6.8" when 's19' ;
    $cmd = "$0 -y-1.. -I  -g20 -% 2.0 50.7 13.5 21.6 6.8" when 's20' ; 
    $cmd = "$0 -D5 -I -Q -g150,-inf -% 2.0 13.5 21.6" when 's21' ; 
    $cmd = "$0 -y1.. -g75,20 -D0,----- -Q -% 81.4 63.3 54.6 51.0 46.9 45.9 28.6 17.3 13.3 11.3 10.3" when 's24' ;
    # 機能追加に合わせてテストパターン
    $cmd = "$0 -M0 -D9 33.3% 50.0% 57.1%" when 'D9' ; # -% 以外に%を直接数値に付けることを可能とした。%から&への誤字に注意。
    $cmd = "$0 -y, -L1 -% 3.2 59.0 17.5 20.3" when 'L1' ; # -L の実装の伴うテスト
  } for $o{T} ; 
  say STDERR BOLD ITALIC YELLOW " >> " , $cmd ; 
  system $cmd ; 
  exit ; # systemで exit するはずだが、違うコードを増やすことも考え、ここに exitと書いた。
}

### テスト以外はここから開始


$o{D} =~ s/,(.*)$// if exists $o{D};
my $Demp = $1 if defined $1 ; # // '-' ; 
$o{D} //= 0 unless grep { m/[DIQ]/ } keys %o ; 
$o{g} //= 12 ; # 取得する分母の個数の最大値 なお、コンマ区切りで、取得分母の開始値(最小値)も指定可能。
$o{a} =~ s/(^.*)%$/"$1"*"0.01"/e if exists $o{a} && $o{a} =~ /%$/ ;  # -a の指定が % で終わる場合の処理
$o{y} //= '1..' ; # 何か候補があれば表示とした。

do { pipe *STDIN , my $WH ; print {$WH} join "\n" , splice @ARGV , 0 } ;
my @nums = & readNums ;  # $q は、-y のオプションのパラメータでevalする際に、裏技的に使うことを意図している。
my $q = @nums ;

# ここは、同じ引数で同じ関数を2回(以上)呼び出すという意味で、不効率で冗長とも言える。後で整理。.. 
my @ddg = map { & decDig ($_ ) } @nums ; # 与えられた割合近似値が、それぞれ、小数点以下何桁であるか? dig digit 

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.931 second using v1.00-cache-2.02-grep-82fe00e-cpan-c30982ac1bc3 )