Примеры синтаксиса кода

Модераторы: Bagir, Ivan, Vit, immortal, PAV

ZyaK
Сообщения: 139
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 19 раз
Поблагодарили: 13 раз

Re: Примеры синтаксиса кода

Сообщение ZyaK » Ср авг 22, 2018 12:39 pm

получилось как то так, свойства берет по условиям отрабатывает, а как сделать, чтоб говорила по человечи, а то говорит " температура воды тридцати двух градусов, температура масла тридцати одного градуса"
пробовал Say("Включён твердотопливный котел, температура воды " .gg .$Water_actual." градуса", 2);
говорить начинает правильно, но "ГЫ ГЫ" тоже говорит :D

Код: Выделить всё

$obj=getObject($Котел);
$Status=getGlobal('Котел.Status');
if($Status == 1)
{
 $Water_actual=getGlobal('Котел.Water_actual');
 $Oil_actual=getGlobal('Котел.Oil_actual');
 $Pressure=getGlobal('Котел.Pressure');
 Say("Включён твердотопливный котел, температура воды " .$Water_actual." градуса, температура масла " .$Oil_actual. " градуса, давление в рессивере " .$Pressure. " атмосферы" ,  2 );
 
}
else
{
 Say("Твердотопливный котёл выключен",2); 
}
PI2 + MQTT + 5 ESP8266 + Atmega16
Logrus
Сообщения: 1009
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 188 раз
Поблагодарили: 133 раза

Re: Примеры синтаксиса кода

Сообщение Logrus » Ср авг 22, 2018 1:48 pm

За это сообщение автора Logrus поблагодарили (всего 2):
ZyaK (Ср авг 22, 2018 1:52 pm) • Mr.Lia (Чт авг 23, 2018 9:44 pm)
Рейтинг: 2.94%
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо - ТАМ =>
connect Raspberry Pi3, с образа от Сергея 3.31, PHP 7
ZyaK
Сообщения: 139
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 19 раз
Поблагодарили: 13 раз

Re: Примеры синтаксиса кода

Сообщение ZyaK » Чт авг 23, 2018 6:42 am

Пробую вот так, вроде более менее, воду говорит нормально тридцать градусов, а на масле говорит тридцати градусов
ну или тридцать один градус, температура масла тридцати одного градуса
:D :D :D

Код: Выделить всё

function myMorph($string, $ch1, $ch2, $ch3)
   {
      $ff=Array('0','1','2','3','4','5','6','7','8','9');
      if(substr($string,-2, 1)==1 AND strlen($string)>1) $ry=array("0 $ch3","1 $ch3","2 $ch3","3 $ch3" ,"4 $ch3","5 $ch3","6 $ch3","7 $ch3","8 $ch3","9 $ch3");
      else $ry=array("0 $ch3","1 $ch1","2 $ch2","3 $ch2","4 $ch2","5 $ch3","6 $ch3","7 $ch3","8 $ch3","9 $ch3");
      $string1=substr($string,0,-1).str_replace($ff, $ry, substr($string,-1,1));

      return $string1;
}
Say("температура ". "воды ".  myMorph($Water_actual, "градус", "градуса", "градусов"). ", температура ". "масла ". myMorph($Oil_actual, "градус", "градуса", "градусов"),2);

PI2 + MQTT + 5 ESP8266 + Atmega16
Logrus
Сообщения: 1009
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 188 раз
Поблагодарили: 133 раза

Re: Примеры синтаксиса кода

Сообщение Logrus » Пт авг 24, 2018 9:02 pm

тридцати градусов
а на входе в текст ту спич 30 градусов
это проблема речевого движка, и где как по разному с решением, можно и до придумать
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо - ТАМ =>
connect Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Аватара пользователя
xor
Сообщения: 674
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 40 раз
Поблагодарили: 164 раза

Re: Примеры синтаксиса кода

Сообщение xor » Вс авг 26, 2018 12:13 am

вариант морфа покороче

Код: Выделить всё

/**
 * Склоняем словоформу
 * @ author runcore
 * morph(1000,'градус','градуса','градусов');
 */
function morph($n, $f1, $f2, $f5) {
	$n = abs(intval($n)) % 100;
	if ($n>10 && $n<20) return $f5;
	$n = $n % 10;
	if ($n>1 && $n<5) return $f2;
	if ($n==1) return $f1;
	return $f5;
}
fandaymon
Сообщения: 517
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 23 раза
Поблагодарили: 213 раз

Re: Примеры синтаксиса кода

Сообщение fandaymon » Вс авг 26, 2018 12:54 am

Самое смешное, что давно уже есть встроенная функция для склонения чисел - GetNumberWord().

GetNumberWord($x,array('день','дня','дней'))
GetNumberWord($x,array('градус','градуса','градусов'))
Аватара пользователя
xor
Сообщения: 674
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 40 раз
Поблагодарили: 164 раза

Re: Примеры синтаксиса кода

Сообщение xor » Вс авг 26, 2018 12:57 am

ZyaK писал(а):
Чт авг 23, 2018 6:42 am
Пробую вот так, вроде более менее, воду говорит нормально тридцать градусов, а на масле говорит тридцати градусов
ну или тридцать один градус, температура масла тридцати одного градуса
:D :D :D
Обманем движок
Вот функция, переделанная из перевода суммы в рублях в строку (использует morph) -- для целых

Код: Выделить всё

/**
 * Возвращает текст числа с параметром
 * @uses morph(...)
 * $sex - 0 male 1 female
 * use mynum2str(30,'градус','градуса','градусов',0)
 */
function mynum2str($num,$f1, $f2, $f5,$sex) {
	$nul='ноль';
	$ten=array(
		array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
		array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
	);
	$a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
	$tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
	$hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
	$unit=array( // Units
		array('' ,'' ,'',$sex),
		array($f1,$f2,$f5,$sex),
		array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
		array('миллион' ,'миллиона','миллионов' ,0),
		array('миллиард','милиарда','миллиардов',0),
	);
	////////////////////////////////
	if($num<0){ 
          $minus='минус ';
        }else{
          $minus = '';
        }
        $num = abs($num); 
        ////////////////////////////////
	list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
	$out = array();
	if (intval($rub)>0) {
		foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
			if (!intval($v)) continue;
			$uk = sizeof($unit)-$uk-1; // unit key
			$gender = $unit[$uk][3];
			list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
			// mega-logic
			$out[] = $hundred[$i1]; # 1xx-9xx
			if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
			else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
			// units without rub & kop
			if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
		} //foreach
	}
	else $out[] = $nul;
	$out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
	//$out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
	return $minus.trim(preg_replace('/ {2,}/', ' ', join(' ',$out))); ///////////////////////////////
}
mynum2str(23,'градус','градуса','градусов',0) -> строка двадцать три градуса
////////////////////
обновил для работы с отрицательными числами
Последний раз редактировалось xor Вс авг 26, 2018 1:40 am, всего редактировалось 2 раза.
Аватара пользователя
xor
Сообщения: 674
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 40 раз
Поблагодарили: 164 раза

Re: Примеры синтаксиса кода

Сообщение xor » Вс авг 26, 2018 1:01 am

fandaymon писал(а):
Вс авг 26, 2018 12:54 am
Самое смешное, что давно уже есть встроенная функция для склонения чисел - GetNumberWord().

GetNumberWord($x,array('день','дня','дней'))
GetNumberWord($x,array('градус','градуса','градусов'))
Самое смешное, что появление новых функций не анонсируется и отсутствует в доках((

GetNumberWord(25.8,array('градус','градуса','градусов'))--> ?
Последний раз редактировалось xor Вс авг 26, 2018 1:11 am, всего редактировалось 1 раз.
fandaymon
Сообщения: 517
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 23 раза
Поблагодарили: 213 раз

Re: Примеры синтаксиса кода

Сообщение fandaymon » Вс авг 26, 2018 1:05 am

xor писал(а):
Вс авг 26, 2018 1:01 am
fandaymon писал(а):
Вс авг 26, 2018 12:54 am
Самое смешное, что давно уже есть встроенная функция для склонения чисел - GetNumberWord().

GetNumberWord($x,array('день','дня','дней'))
GetNumberWord($x,array('градус','градуса','градусов'))
Самое смешное, что появление новых функций не анонсируется и отсутствует в доках((
Ну это да, тут не поспоришь... Только время от времени посматривать по файлам в директории lib - что появилось, как реализовано
Аватара пользователя
xor
Сообщения: 674
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 40 раз
Поблагодарили: 164 раза

Re: Примеры синтаксиса кода

Сообщение xor » Вс авг 26, 2018 1:19 am

Попробуйте
GetNumberWord(-25,array('градус','градуса','градусов'))
GetNumberWord(25.8,array('градус','градуса','градусов'))
Ответить