Для чого використовується обертання рядків? [зачинено]


15

У PHP це strrev(), в Rails це .reverse, але більшість мов не мають жодної функції зворотного рядка. Деякі мають функції зворотного масиву масиву, які можна використовувати для символів. Я думав, що це повинен бути серйозним наглядом, але тоді мені спало на думку, що б ти насправді використовував зворотний рядок ???

Єдиний раз, коли я можу подумати, що бачив, це на демонстраціях та уроках перетворити "Hello World!" в "! dlroW olleH".

Моє запитання: Чи є використання для обертання рядка або це абсолютно безглуздо?

.

Додаток

Я відповів, що я очікував більше відповідей, і не всі вони були повністю академічними. Я б поклав гроші, щоб ніхто не міг придумати законний приклад. Я також не думав, що дізнаюся щось нове, але пропозиція регексу Марка Канласа просто геніальна, і я з нетерпінням чекаю нагоди, щоб вона зарекомендувала себе. Дякую всім.


@ clockworkgeek - якщо ви попросите кандидата зробити реверс рядків на їх улюбленій мові, ви здивуєтеся, скільки людей не придумують базову функцію, яку ви згадали. Тоді скільки хто не може придумати цикл, щоб реалізувати це самостійно.
justkt

@justkt - це зовсім інше питання, яке чекає, але це може бути темою для TopCoder.
clockworkgeek

6
Щоб надіслати текстове повідомлення, яке можна було прочитати у дзеркалі заднього огляду під час руху, то поліцейські не помітять.
JeffO

@justkt - Якби мені довелося написати ітеративний цикл, щоб це зробити, я би почав з протилежних кінців міняти символи, поки не буде досягнута середина. Але як тоді поміняти два значення? Ось просто найкраща відповідь, яку я коли-небудь отримав:a ^= b; b ^= a; a ^= b;
clockworkgeek

1
я використовую
обертання

Відповіді:


19

Сексгери

Іноді проблеми, пов’язані з регулярними виразами, можна легше написати, якщо перетворити вхідний рядок і вирішити проблему по-іншому.

Техніка ввічливості людини, яка навчила мене Perl.

Sexeger на PerlMonks


Дякую. Дуже зручна хитрість для пошуку останнього чогось. Належним чином відзначено.
clockworkgeek

Я роблю це роками. Допомагає розбирати електронні адреси.
саль

23

Ну, це відповідь язиком у щоку.

"Ще в той день" я володів полем Unix, і він мав упорядкований файл словника англійських слів, який використовується для перевірки орфографії.

Я створив новий файл, перевернувши всі слова у словнику, сортувавши його, а потім перевернувши їх знову. Результатом став список слів, відсортованих справа наліво.

Тож якщо ви шукали це слово, поруч із цим словом були б слова з подібними закінченнями. Так було скласти маленькі вірші!

Ви можете дуже розвеселити себе, побачивши, що римується з чим.


13

Я був кодером / розробником / sysadmin протягом ~ 10 років і не можу пригадати, щоб коли-небудь знадобилось перетворення рядків у реальних життєвих ситуаціях.

Єдиний випадок негайного використання, про який я можу придумати, - це перетворення бази чисел: зроблено наївно, процедура повертає зворотній рядок. Однак, маючи трохи математики, ви можете обчислити заздалегідь необхідний простір, тому ви можете почати заповнювати буфер з кінця.


1
Можливо, біт математики коштує дорожче, ніж перевернення рядка, тому після тестування на вашій платформі (ARM, MIPS, x86) ви можете використовувати зворотний рядок. Можливо.
Зан Лінкс

Ви можете заповнити буфер з кінця і використовувати a memmoveдо початку, коли закінчите. Мабуть, дешевше, ніж обчислення log (n) / log (base) для обчислення необхідної кількості цифр.
Патрік Шлютер

12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}

1
Так - у нас фактично проходить співбесіду, де кандидати пишуть перевірку паліндром і більшість з них роблять це. Тим НЕ менше, я , як це краще , коли кандидати ітерації від 0до n/2і порівняти характер на протилежному кінці.
Ніколь

@ Renesis: Ви також можете зробити: встановити p початок рядка, q кінець рядка, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;на C та інших мовах вказівників.
Майкл К

4
Я гадаю, хоча "перевірка паліндрому" не є особливо корисною, "написання паліндроменової перевірки" принаймні має мету.
годинниковий годинник

2
У інтерв'ю, вони попросили мене змінити рядок , і вони сказали «пам'ятайте , що це не string.Rverse () Так що я просто перетворили рядок в масив символів і зробив Array.Reverse.
Джек Маркетті

Це неабияке використання ніші, і не те, що ви, як правило, варто було б включити до мови / бібліотеки!
Диплом

8

Інтерв'ю!

Повернення рядка (на місці чи ні) - дуже поширене питання інтерв'ю для базових знань з програмування. Мова, яка не має цих вбудованих функцій, була б складною для інтерв'ю. Кандидат насправді повинен був би щось знати. 1


1: Це відповідь язиком у щоку.


6

Я бачив ситуації, коли настільний додаток спілкувався із вбудованими пристроями і постійно перемикав порядок байтового порядку, а дані переміщувались як рядки. Це про це для мене, хоча.

Я б не використовував рядки для цього додатка, але саме так було .....


+1 за цю відповідь. Це, принаймні, практичний приклад, хоча я теж зробив би це іншим способом, можливо, вибравши примітивні типи, які є по-різному ендіантними.
годинниковий годинник

5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

Не найкраще рішення для оскарження електронної адреси електронної пошти, оскільки коли ви додасте її до буфера обміну, вона все одно перевертається. І, якби він став популярним, це незабаром буде виявлено за допомогою ботів, що викреслюють електронні листи.

Все-таки пропонується .


1
А найпопулярнішій примхливості у вжитку було дано лише одне речення в цілій статті ... Кодування як зображення.
годинниковий годинник

1
@ clockworkgeek, це може бути популярним, але IMHO - це найгірше з ефективних рішень - не дуже просто генерувати, не вбудовувати в HTML (швидкість, зберігання зображень, завантаження сервера), виглядає поза місцем, не може бути оформлений з CSS та тим самим поганим досвідом користувача, як і обертання рядків, про необхідність запам'ятати його та повторно вписати його. І, мабуть, більше проблем, про які я не думаю.
Ніколь

Цікаво, що, використовуючи AT та DOT, найпростіше розшифрувати комбайн, виявляється майже ідеальною ефективністю у запобіганні збирання врожаю. Іноді зберігати його просто - це не така погана ідея.
Joeri Sebrechts

5

ASCII не найкраще кодує генетичну інформацію (ви можете запакувати базові типи ACGT у вигляді 2 біт). Упакуйте їх у масив довгих і ви отримаєте 32 генетичних "літери" за слово. ДНК можна повернути, тож вам доведеться перевірити шматок ДНК проти обох вперед - це зворотні копії тестової послідовності. Отже, можливість перевернути упаковану рядок у 2 бітових кількостях може бути дуже корисною для різного роду генетичного аналізу.

Я був предметом на еталоні для шпигунських агентств, як швидко ви можете повернути біти на довгі-довгі (насправді дуже довгий масив довгих-довгих). Очевидний метод обміну 2 біт одночасно набагато повільніше, ніж менш очевидні методи. Вони пов'язані з деякими акуратними алгоритмами для переміщення на місці масиву.

Тангурена: Операція, про яку ви посилаєтеся, називається кількістю населення. Подібні бажані для біт-упакованих даних є провідним і кінцевим нульовим числом. Є багато дійсно акуратних речей, які можна зробити з розфасованими даними. Одна операція на довгий час - це паралельна передача даних на 64 маршрути, тому якщо ви знаєте, що робите, ви можете отримати неймовірні показники для певних типів обчислень.


Цікава тема, як би ви повернули трохи поле?
годинниковий годинник

"як би ви повернули трохи поле?"
Омега Кентаврі

2
Одним із підходів є пошук таблиць. Ви можете перевернути байт за допомогою таблиці. Таким чином, ви могли це зробити на байдалях. Існують також способи переміщення декількох бітів і один раз ... Трохи розумності та компромісів (розмір таблиці проти кількості операцій тощо), і ви можете спробувати налаштувати його.
Омега Кентаврі

5

Все, де працювати з перевернутим рядком простіше.

Робота з цілими числами як рядками набагато простіше, якщо рядки будуть перевернуті. Я побудував декілька функцій бібліотеки для математики з великими цілими числами і застосував обертання рядків для спрощення арифметичних функцій.

Зрозуміло, я використовував це лише для того, щоб викреслити відповіді на проект Euler, але все-таки оригінальне приміщення має місце.


+1. при використанні рядкових представлень чисел перевернене подання дуже корисно. і зазвичай стандартна бібліотека представлятиме числа у звичайному порядку.
back2dos

3

Можливо, недорога багатомовна підтримка для мов, які використовують літери праворуч ліворуч (наприклад, арабська), а не ліворуч праворуч. Звичайно, ви повинні стежити за наголосом, що змінює правильний символ ...


2

Я не знаю, можливо, у когось є пекуча потреба перевірити наявність на паліндром ....

Я не вважаю його абсолютно марним, оскільки, можливо, можуть виникнути ситуації, коли потрібно мати змогу перевернути рядок.


Наступним запитанням до цього було б, коли вам коли-небудь потрібно було перевірити паліндром у реальному світі? Знову ж таки, я лише бачив, щоб хтось не піклувався на уроках з алгоритмом.
годинниковий годинник

як ця, наприклад: jimsabo.com/palindrome.html
Darknight

Я думаю, що, ймовірно, є й інші види використання, але це специфічно для домену. Наприклад, якщо пошуковий рядок був оптимізований для пошуку вперед і ви хотіли зробити кілька запитів для останнього події, ви можете спершу змінити його. Це було б оптимізацією, однак її не слід робити, якщо для цього немає доказів. Я міг би уявити алгоритм для генерації хеша значення рядка, який хотів би використовувати хвостовий кінець, можливо, перевернутий, якщо це сталося, щоб забезпечити кращі хеш-характеристики.
Скотт Вітлок

2

Під час обробки та розбору природних мов іноді простіше шукати рядок від кінця до початку. Зворотний рядок буде корисним для налагодження, або як альтернативний спосіб запису циклу (перевернути рядок, а потім цикл від індексу 0 до n-1).

Також деякі мови написані праворуч ліворуч, тому для цього можна використати реверсор рядків, якщо ви знаходитесь в середовищі, яке не розпізнавало спочатку мови LTR / RTL.

Рядок (на деяких мовах) - це масив символів, але це може також бути зарплатами або модифікаціями запасів. У циклі, що рухається через ці, ви можете зробити деякі розрахунки, які повинні бути однаковими, незалежно від того, в якому порядку ви їх обробляєте. Ідеально кромулентним одиничним тестом було б перевірити, чи застосовують вони обчислення ті ж самі, що рухаються вперед або рухаються назад. Це може бути банально очевидним для доповнення, можливо, не для інших більш непрозорих операцій.


1

Для компіляторів?

Забавно, але більшість символів у мові розпочнеться за загальною схемою. Я не говорю тут про угорські позначення, але якщо ви думаєте про простір імен / класи, то багато символів насправді мають спільний префікс .

myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar

Проблема полягає в тому, що, виконуючи двійковий пошук, загальні префікси - це найгірше, що ви можете закінчити, тому що ви будете порівнювати ці префікси знову і знову.

З іншого боку, якщо ви подивитеся на струни назад, ви побачите набагато більше ентропії! І тоді раптом бінарний пошук (над Трі) стає набагато потужнішим!

Мене завжди помиляють, що змішані імена C ++ (від gcc) не змінювались, щоб поставити простір імен ОСТАНО :)


0

Я час від часу гортаю телефонні номери та певні рядки для пошуку


0

Єдиний раз, коли я можу пригадати, як побачив, як використовується обертання рядків, - це функція, яку я побачив, як це було назад, який використовував її під час розбору імен файлів, щоб переконатися, що значення '.' це знайдено в імені файлу насправді була останньою крапкою, яка відокремила ім'я файлу від розширення. тобто, розбираючи ім'я файлу, як-от data.2010.12.08.dat, ви переймете рядок, знайдете першу крапку, віднімете цю позицію від кінця початкової рядки та займете підрядку. Я не кажу, що це оптимальний спосіб зробити це, але ось що він зробив. Можливо, це було в енергобудівнику, де такі часті використання функцій були звичайними для вирішення різних неочевидних проблем.


0

Єдине реальне додаток worls, яке я бачив за допомогою strrev, - це зберігати паролі користувачів "нечитабельні" в базі даних ...

Але я можу пригадати, що в С є схема використання strrev, можливо, я придумаю її пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.