#!/usr/bin/env php ali < UNIX in DOS avtomatsko pošljeta EOF. primer uporabe: cat ukazi.txt | ./intercal.php 0.1 0.9 */ /* * vnos je array("PLEASE DO ,1...", "DO ,1...", ...) * vrne -1 če se vnosa ne da popraviti * vrne popravljen vnos če smo uspeli popraviti * vrne 1 če je vse v redu */ function popravi_vnos($vnosi, $minvlj, $maxvlj) { // za minvlj/a in maxvlj/b glej navodila, to so floati $vljudnih = 0; // definiramo $nevljudnih = 0; foreach($vnosi as $vnos) { // za vsak vnos if(substr($vnos, 0, 1) == "P") { // če je prvi znak P, je ukaz vljuden $vljudnih++; // ali dodamo eno k vljudnim } else { $nevljudnih++; // ali pa eno k nevljudnim } } $razmerje = $vljudnih / ($vljudnih+$nevljudnih); // izračunamo razmerje if($razmerje < $minvlj) { // premalo vljuden for($i = 0; $i < $vljudnih+$nevljudnih; $i++) { // gremo čez vsak ukaz. ne delamo sizeof(), ker to porabi več proc. časa. itak imamo že število if(substr($vnosi[$i], 0, 1) == "D") { // če je prvi znak D, je ukaz nevljuden $vnosi[$i] = "PLEASE ".$vnosi[$i]; // dodamo PLEASE . itak je DO že spredaj. $vljudnih++; // poprabimo vrednosti, saj smo spremenili stanje $nevljudnih = $nevljudnih-1; $razmerje = $vljudnih / ($vljudnih+$nevljudnih); // izračunamo razmerje if($razmerje > $minvlj) { // popravili smo return $vnosi; } } } return -1; // nismo uspeli popraviti } if($razmerje > $maxvlj) { // prevec vljuden for($i = 0; $i < $vljudnih+$nevljudnih; $i++) { // gremo čez vsak ukaz. ne delamo sizeof(), ker to porabi več proc. časa. itak imamo že število if(substr($vnosi[$i], 0, 1) == "P") { // če je prvi znak P, je ukaz vljuden if(substr($vnosi[$i], 0, 8) == "PLEASE D") { // preverimo, ali se ukaz začne z PLEASE DO ali samo z PLEASE $vnosi[$i] = substr($vnosi[$i], 7); // zbrišemo PLEASE, itak je za njim že DO } else { $vnosi[$i] = "DO".substr($vnosi[$i], 6); // prepišemo vnos, zbrišemo PLEASE in ga zamenjamo z DO } $vljudnih = $vljudnih-1; // popravimo vrednosti, saj smo spremenili stanje $nevljudnih++; $razmerje = $vljudnih / ($vljudnih+$nevljudnih); // izračunamo razmerje if($razmerje < $maxvlj) { // popravili smo return $vnosi; // vrnemo popravljene vnose } } } return -1; // nismo uspeli popraviti } return 1; // vnos je pravilen že sam po sebi. noben if stavek se ni triggeral. če bi se, bi funkcija vrnila že prej torej do sem sploh ne bi prišli } $ukazi = array(); // definiramo array za stdin podatke while($f = fgets(STDIN)) { // funkcija je definirana, zategadelci gremo na branje iz standardnega vhoda $ukazi[] = $f; } // foreach($ukazi as $vnos) { // echo substr($vnos, 0, 1); // } // exit(); $odgovor_funkcije = popravi_vnos($ukazi, floatval($argv[1]), floatval($argv[2])); // input imamo, kličemo funkcijo if($odgovor_funkcije == 1) { // preverjanje. swtch bi sicer bil mozen, vendar nima pomena kar se tiče optimizacije, ker se ukvarjamo z različmini tipi podatkov (string* in int) echo "program je pravilen\n"; } else if($odgovor_funkcije == -1) { echo "program je nepravilen in se ga ne da popraviti\n"; } else { echo implode("", $odgovor_funkcije); // združi ukaze iz popravi_vnos in jih natisne v standardni izhod v istem formatu kot vnos, le da popravljene- } exit(); ?>