strrev своими руками

hell0w0rd

Продвинутый новичок
В общем в тестовом задании такая формулировка
Инвертируйте строчку, не используя дополнительного текстового буфера.
Я отправил так:
PHP:
<?php

function mb_strrev($str, $encoding) {
    $out = '';
    for ($i = mb_strlen($str, $encoding) - 1; $i >= 0; --$i) {
        $out .= mb_substr($str, -1, 1, $encoding);
        $str = mb_substr($str, 0, $i, $encoding);
    }

    return $out;
}
Но чувствую что от меня хотели такого:
PHP:
$a[$i] = $a[$l-$i]^$a[$i];
$a[$l-$i] = $a[$l-$i]^$a[$i];
$a[$i] = $a[$l-$i]^$a[$i];
Этот вариант конечно крут донельзя, но не работает с многобайтными кодировками
А что бы написали вы?)
 

Вурдалак

Продвинутый новичок
Я бы уточнил. Или отправил 2 варианта, если нет обратной связи.
 

fixxxer

К.О.
Партнер клуба
Жди следующего вопроса а-ля про круглые люки. Если зададут, смело шли их нафиг, иначе выйдет себе дороже.

А вот кстати модицифировать вариант с xor для корректной работы с utf-8 - это неплохая задачка. ;)
 

MiksIr

miksir@home:~$
PHP:
$len = strlen($line);
foreach ($i=$len-1; $i >= 0; $i--) {
  $line .= $line[$i];
}
$line = substr($line, $len);
Формально без буфера, хотя тут, конечно, сама строка играет роль буфера.
 

fixxxer

К.О.
Партнер клуба
Ну уж раз такая пьянка:

PHP:
$c = [];
for ($i = 0, $len = strlen($line); $i < $len; ++$i) {
    $c[] = ord($line[$i]);
}
for ($i = count($c) - 1; $i >= 0; --$i) {
    $line[$i] = chr($c[$i]);
}
_текстового_ буфера формально нет!:D
 

Gas

может по одной?
Ну если для однобайтовых кодировок, то и так сойдёт

PHP:
$str = '1234567';
for ($i=0, $len = strlen($str); $i < intval($len/2); $i++) {
    list($str[$i], $str[$len-$i-1]) = [$str[$len-$i-1], $str[$i]];
}
а для многобайтовых хакнуть так, формально, нового буфера не появляется :)

PHP:
$str = 'абвгд';
$str = preg_split('~~u', $str, -1, PREG_SPLIT_NO_EMPTY);
for ($i=0, $len = count($str); $i < intval($len/2); $i++) {
    list($str[$i], $str[$len-$i-1]) = [$str[$len-$i-1], $str[$i]];
}
echo $str = implode('', $str);
 
Последнее редактирование:
Сверху