Выглядит просто. Когда вы обнаруживаете мотив как число внутри фигурных скобок, его следует заменить квадратом числа. Если замена не завершена, вы закончите. Если какая-то замена выполняется, вы делаете это снова (потому что то, что было просто заменено, теперь может быть внутри фигурных скобок) и так далее.
Первая часть (замена) может быть выполнена с использованием регулярного выражения, вторая часть может быть выполнена либо рекурсивно, либо итеративно.
Ниже приведен фрагмент кода, который поможет вам понять детали (не полный ответ, но не далеко). Цель упражнений состоит в том, чтобы помочь вам понять параметры preg_replace()
.
<?php
$count = 0;
echo preg_replace('/[{](\d+)[}]/e', '$1*$1', '{{{2}}}', -1, $count);
echo "\n";
echo "$count replacement done\n";
?>
Как и другие предложили полные решения, здесь его шахту:
<?php
function square($str){
$count = 0;
do {
$str = preg_replace('/[{](\d+)[}]/e', '$1*$1', $str, -1, $count);
} while ($count);
return $str;
}
echo square('{3}')."\n"; // have this return 9
echo square('{6}')."\n"; // have this return 36
echo square('{{{2}}}')."\n"; // have this return 256
echo square('{9}{12}')."\n"; // have this return 81144
echo square('{{5}}')."\n"; // have this return 125
echo square('adscdc{4}{{3}}')."\n"; // have this return adscdc1681
?>
Если ваш озабочены проблемами совместимости (потому что закаленные установка PHP может запретить использование/е) просто использовать preg_replace_callback
вместо preg_replace
как ниже (используйте анонимную функцию, доступную с PHP 5.2.3, для более старой версии php вы можете использовать create_function()
).
function square($str){
$count = 0;
do {
$str = preg_replace_callback('/[{](\d+)[}]/',
function($m) {return $m[1]*$m[1];},
$str, -1, $count);
} while ($count);
return $str;
}
Для любопытных читателей, как кто-то предложил версию питона, ниже можно Perl эквивалент:
#!/usr/bin/perl
my @tests = ('{3}','{6}','{{{2}}}','{9}{12}','{{5}}', 'adscdc{4}{{3}}');
sub square {
my $str = pop;
while ($str =~ s/[{](\d+)[}]/$1*$1/e) {};
return $str;
}
for my $str (@tests){
print "$str --> ".square($str)."\n" ;
}
Там механизмы безопасности в Perl, чтобы избежать инъекции из-за дурных данных, вводимых пользователем, отличных от слепо отвергать все оценки. Для желающих вы можете посмотреть here.
И две другие более короткие версии питона, рекурсивный:
import re
test = ['5','{3}','{6}','{{{2}}}','{9}{12}','adscdc{4}{{3}}']
def square(txt):
txt2 = re.sub('{(\d+)}',lambda m: str(int(m.group(1)) ** 2) , txt)
if txt2 == txt:
return txt
return square(txt2)
for x in test:
print("%s --> %s" % (x, square(x)))
и не рекурсивной
import re
test = ['5','{3}','{6}','{{{2}}}','{9}{12}','adscdc{4}{{3}}']
def square(txt):
oldtxt = None
while oldtxt != txt:
oldtxt = txt
txt = re.sub('{(\d+)}',lambda m: str(int(m.group(1)) ** 2) , oldtxt)
return txt
for x in test:
print("%s --> %s" % (x, square(x)))
Это похоже домашнее задание. Что у вас есть? –
Является ли это домашней проблемой? –
это домашнее задание? – kennytm