C 0000012 2021 01 10 kommentaariumikommentaarilisa 01

From commentsarchive
Jump to: navigation, search

C 1..100



#!/usr/bin/env ruby
#==========================================================================
# Kiirhäkk, mis on Martin.Vahi@softf1.com poolt
# kirjutatud kommentaariumi-kommentaariks 2021_01_10 artikli
# https://www.err.ee/1234267/sotsiaalasutuste-juhid-nouavad-lannolt-avalikku-vabandust
# juurde. Kood on rahvapärand.
#
# SPDX-License-Identifier: 0BSD
#==========================================================================

def i_faktoriaal(i_x)
   # Tegelt oleks vaja siia tüübikontrolle ka, aga kiirhäkiks käib ka ilma.
   raise Exception.new("b05d5743-a626-4696-b267-421311a015e7") if i_x < 0
   i_0=1
   i_x.times do |i|
      i_0=i_0*(i+1)
   end
   return i_0
end # i_faktoriaal

def i_kombinatsioon(i_n_of_elements_in_set,i_k)
   # Tegelt oleks vaja siia tüübikontrolle ka, aga kiirhäkiks käib ka ilma.
   raise Exception.new("1198f12e-80bd-4407-9567-421311a015e7") if (i_n_of_elements_in_set < i_k)
   raise Exception.new("c2930a4e-efbf-45c4-8267-421311a015e7") if i_k < 0
   raise Exception.new("10363d49-8875-48ac-b457-421311a015e7") if i_n_of_elements_in_set < 0
   i_n=i_n_of_elements_in_set
   i_0=i_faktoriaal(i_n)
   i_1=i_faktoriaal(i_k)*i_faktoriaal(i_n-i_k)
   fd_out=i_0.to_r/i_1
   i_out=fd_out.to_i
   raise Exception.new("99457cf1-9278-4121-a557-421311a015e7") if (fd_out-i_out)!=0
   return i_out
end # i_kombinatsioon

# C(N,k)=i_kombinatsioon(N,k)
# i_covidosakondade_arv(N)==C(N,N)+C(N,(N-1))+C(N,(N-2))+C(N,(N-3))+...+C(N,(N-N))-1
# C(N,(N-N)) tähistab sisuliselt "N tüvest nulli kaupa" ehk tervete inimeste osakonda,
# mida saab olla vaid 1, millest siis ka lõpus see "-1".
def i_covidosakondade_arv(i_covid_tüvede_arv)
   # Tegelt oleks vaja siia tüübikontrolle ka, aga kiirhäkiks käib ka ilma.
   raise Exception.new("32f82b12-470c-486d-9157-421311a015e7") if i_covid_tüvede_arv < 1
   i_t=i_covid_tüvede_arv
   i_sum=0
   i_t.times do |i| # algab 0-ist ja lõppeb(kaasa arvatud) i_t-1 juures
      i_sum=i_sum+i_kombinatsioon(i_t,i)
   end
   # puts "punktis 1 i_sum=="+i_sum.to_s
   i_sum=i_sum+i_kombinatsioon(i_t,i_t)-1 # sisuliselt "+1-1"
   # puts "punktis 2 i_sum=="+i_sum.to_s
   #----hilisema--täienduse--algus-----
   # Tegelt seda ülesannet oleks saanud kohe alguses
   # lahendada targemini, lihtsamalt, saades sama tulemuse.
   # Oleks piisanud lihtsalt arvutada, mitu alamhulka, tühi hulk ja
   # esialgne hulk ise kaasa arvatud, oleks hulgal, millel on
   # i_covid_tüvede_arv elementi. Alamhulkade koguse arvutamise
   # valemi idee on, et iga elemendi korral vaadeldakse, kas
   # originaalhulga element kuulub ka alamhulka või ei kuulu,
   # iga elemendi korral on 2 võimalust: kuulub või ei kuulu.
   # Sealt ka alamhulkade_kogus=2astmel(originaalhulga_elementide_arv) ehk
   # i_alamhulkade_kogus=2^(originaalhulga_elementide_arv).
   # Ruby's on astendustehte operaatoriks "**", jutumärkideta.
   i_sum_teisiti_arvutatult=(2**i_covid_tüvede_arv)-1
   if i_sum_teisiti_arvutatult != i_sum
      raise(Exception.new("Kuskil on arvutusviga.\n"+
      "b8ae2258-64fe-47f4-8557-421311a015e7"))
   end # if
   #----hilisema--täienduse--lõpp------
   return i_sum
end # i_covidosakondade_arv


def i_lugeda_konsoolilt_kui_seal_midagi_võtta_on_vastupidisel_juhul_kasutada(i_in)
   i_0=i_in
   x=ARGV[0]
   if x!=nil
      i_0=x.to_s.to_i if x.to_s.match(/^[\d]+$/) != nil
   end
   return i_0
end # i_lugeda_konsoolilt_kui_seal_midagi_võtta_on_vastupidisel_juhul_kasutada


i_covid_tüvede_arv=i_lugeda_konsoolilt_kui_seal_midagi_võtta_on_vastupidisel_juhul_kasutada(3)
# i_covid_tüvede_arv=3 # lihtsamal juhul võib ka nii
i_osakonnad=i_covidosakondade_arv(i_covid_tüvede_arv)

# Sõna "puts" siin ei ole "türa" sarnase tähendusega, vaid
# tuleneb inglise keelsest väljendist "put string" ja
# on Ruby standard-teegi osaks oleva funktsiooni nimetus.
puts("\n"+i_covid_tüvede_arv.to_s+" COVID-tüve korral läheb tarvis maksimaalselt "+
i_osakonnad.to_s+" COVID-osakonda.\n")


#==========================================================================