Грейс Келли, сопливый хулиган и водные пути
Знакъ
hardsign

Вчера смотрели по телевизору фильм «Принцесса Монако», биографическую ленту о Грейс Келли. Критики её, как водится, разгромили, королевский дом Монако не признал... но поскольку я – не критик и не князь, мне картина понравилась. И сама Грейс Келли большая умница, если в сюжете есть хоть доля правды, и Николь Кидман в роли Грейс Келли тоже прекрасна.

Но я сейчас не об этом. Когда Франция как самостоятельное государство наконец исчезнет с лица земли, и на карте будет написано что-то типа «западные территории под протекторатом Германии», я первый буду аплодировать. После того, как во Второй мировой войне французов унизили и растоптали, они отказались подписать партнёрский договор с Вьетнамом, развязали войну в Алжире, да ещё и чуть было не аннексировали Монако. Очень похоже на малолетнего сопляка, который, получив леща от одноклассников и смыв кровь и слёзы в школьном туалете, побежал сшибать мелочь с первоклассников.

Но самое интересное, что все эти интриги, скандалы и чуть ли не военное противостояние – из-за куска земли площадью 2 квадратных километра. Это примерно в 2,5 раза меньше, чем площадь микрорайона Болшево и примерно равно площади наиболее развитого и густонаселённого микрорайона Костино. То есть де Голль, блокирующий морской путь в Монако, это всё равно, что Путин, перекрывающий Клязьму. Оцените, как говорится, масштаб личности.


Поиграем в слова - 4
Знакъ
hardsign

Пришла пора практического применения навыков программирования на Perl.

Буквы-затейницы

Итак, перед вами задачка из учебника для второго класса. Дана россыпь букв, из которых надо составить слова. Вряд ли кто-то ждёт от ученика, что он использует все буквы, но почему бы и нет? Пять минут вдумчивого разглядывания учебника с карандашом в руках – и вот он искомый набор: «золото, сера, пес, лупа» (по правилам кроссвордов «е» и «ё» считаем одной буквой и вместо «пёс» пишем «пес»).

Правда, сразу же возникает вопрос: если набор был найден за 5 минут, то он, скорее всего, не один. А сколько же их? И тут нам на помощь приходит Perl.

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

Запускаем... и по экрану начинают бежать строчки. Они бегут, бегут, бегут... Стоп! Не может такая простая программа на современном процессоре работать так долго.

$ cat /proc/cpuinfo | head -9
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 94
model name	: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
stepping	: 3
microcode	: 0x84
cpu MHz		: 1693.250
cache size	: 6144 KB

Для начала выбираем слова, которые в принципе можно составить из перечисленных букв. Этих слов оказалось 372 – куда там какому-то «гастроному» с жалкими 126 словами. Загружаем полученный список в текстовый редактор и удаляем те слова, которые не знакомы ученику второго класса или хотя бы его родителям. Остаётся словарь из 261 слова, с которым уже можно работать.

Запускаем скрипт с таким словарём... 50 секунд. Первая мысль – тормозит вывод на экран. Убираем вывод, но время практически не меняется.

Поскольку использование профайлера на таких скриптах – не наши методы, придумываем пару оптимизаций. Во-первых, слова храним не в виде слов, а в виде списка букв, т. е. сразу, прочитав слово, вызываем unpack() – это позволяет сэкономить секунд 10. Во-вторых, набор букв храним не в виде строки, а в виде хеша, а удаление делаем не регулярным выражением через оператор =~, а декрементом счётчика с поиском по ключу. Вторая оптимизация позволяет сэкономить ещё 25 секунд.

В общем, оказывается, что решить поставленную задачу можно за 15 секунд 4851 разным способом. А если брать в качестве исходных данных полный словарь, то время решения увеличивается до 45 секунд, а количество решений достигает 13948.

Вот несколько решений:
[Spoiler (click to open)] лоза, репа, сопло, утес
лапа, порез, соло, утес
запас, поле, село, утро
поле, соло, трапеза, ус
лаз, лето, оса, пес, упор
лес, оса, па, тепло, узор
лопата, пес, село, узор
арап, песо, тосол, узел
есаул, пес, полоз, тора
лес, пауза, село, топор
оспа, пузо, село, талер
зал, ореол, песо, ступа
ас, лес, поле, пузо, рота
азу, лепта, опрос, осел

А вот и скрипт:

#!/usr/bin/perl

# есть набор букв, надо найти набор слов, использующих все буквы

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);
use Time::HiRes qw(gettimeofday tv_interval);

my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;


my @foundwords;

sub explore {
  my($chars, @allwords) = @_;
  ALL: while (my $curword = shift(@allwords)) {
    my %lchars = %$chars;
    for (@$curword) { if (exists($lchars{$_})) { delete($lchars{$_}) unless --$lchars{$_}; } else { next ALL; }}
    unshift(@foundwords,pack("W*",map {ord} @$curword));
    (!%lchars) ? print join(", ",@foundwords),"\n" : explore(\%lchars, @allwords);
    shift(@foundwords);
  }
}


my $start_time = [gettimeofday];
# распаковываем строку в хэш
my %chars;
for (map {chr} unpack("W*",$ARGV[0])) { $chars{$_}++; }
# составляем список подходящих слов
my @allwords; 
ALL: while (<STDIN>) {
  y/ё/е/;
  chomp;
  my %lchars = %chars;
  my @c = map {chr} unpack("W*");
  for (@c) { if (exists($lchars{$_})) { delete($lchars{$_}) unless --$lchars{$_}; } else { next ALL; } }
  unshift(@allwords,\@c);
}

explore(\%chars,@allwords);
printf ("Выполнено за %f секунд\n",tv_interval($start_time,[gettimeofday]));

Кстати, для того, чтобы получить из бумажной книги изображение такого качества, как в начале поста, больше не нужен ни дорогой сканер, ни умение работать в фотошопе. Достаточно обычного смартфона и программы CamScanner (Microsoft’овский Office Lens в подмётки не годится). Как говорится, enjoy:


Поиграем в слова - 3
Знакъ
hardsign

Ещё одно интересное языковое явление – анаграммы, т. е. слова, состоящие из одних и тех же букв. Поиск анаграмм – задача творческая, но вполне алгоритмизируемая. Запустив соответствующий скрипт, можно узнать, что

  • в русском языке 1125 анаграмм (правда, исходные данные неполны, так что на самом деле их больше);
  • самая длинная анаграмма состоит из 18 букв – «грязеводолечебница - водогрязелечебница», хотя это и напоминает рифму «пятнадцатидюймовый - семнадцатидюймовый» или «кеды - полукеды»;
  • самая длинная осмысленная анаграмма состоит из 12 букв – «просветитель - терпеливость»;
  • самая богатая анаграмма состоит из 6 слов – «автор - втора - отвар - рвота - тавро - товар», а ещё есть 3 анаграммы из 5 слов, 8 анаграмм из 4 слов и 114 анаграмм из 3 слов;
  • из всех приведённых программ код для поиска анаграмм ближе всего к настоящему perl-скрипту – пёстро, быстро, коротко, запутанно.
Код, как обычно, прилагается:

#!/usr/bin/perl

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);
use Time::HiRes qw(gettimeofday tv_interval);

my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;

my $start_time = [gettimeofday];
my %sets;
while (<STDIN>) {
  chomp;
  unshift(@{$sets{substr("00".length,-3).join("",sort map {chr} unpack("C*"))}},$_);
}
for (reverse sort keys %sets) { 
  my @a = @{$sets{$_}};
  print join(" - ",@a),"\n" if ($#a>0);
}
printf ("Выполнено за %f секунд\n",tv_interval($start_time,[gettimeofday]));

Поиграем в слова - 2
Знакъ
hardsign

Сегодня многие знают, что такое «судоку» и «сканворд», но забыли такое старое доброе развлечение как ребусы. Суть очень проста – слово зашифровывается рисунками:

Например, тут зашифровано слово «комикс» – «ком» плюс «икс». У меня в ЖЖ по тэгу «загадка» можно найти несколько ребусов, а того, кто хочет научиться составлять хорошие ребусы самостоятельно, отсылаю к книге «Мастерская головоломок», которую я уже упоминал.

Сейчас же нас интересует поиск слов, которые легко раскладываются на другие слова, для начала – на два слова без остатка. Подручные материалы те же самые, орфографический словарь русского языка и Perl. В результате – более 2000 слов. Правда, для ребусов годятся далеко не все, но всё же:

[Например]ар-балет ар-гамак бал-бес бал-лада банк-рот бар-сук бой-кот бра-ток буй-вол вино-град вол-окно горн-як дом-бра карт-ель кол-кость кол-чан

Разумеется, «коньяк» и «китель» там тоже есть. А код – вот примерно такой:

#!/usr/bin/perl -w

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);

my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;

my %w;
while (<STDIN>) {
  chomp;
  $w{$_} =  "";
}

my $p = "-";
my (@w, @wp);
@w = @wp = sort(keys(%w));
for my $cw (@w) {
  shift @wp;
  for (@wp) {
    last if (substr($_,0,length($cw)) ne $cw);
    my $rest = substr($_,length($cw));
    print $cw, "-", $rest, "\n" if (exists($w{$rest}));
  }
}

Женщина-кошка
Знакъ
hardsign

Вопрос Армянскому радио:
– Почему женщинам так нравится, чтобы их ассоциировали с кошками?
– Потому что кошки спят по 16 часов в сутки.


Тест-драйв: Lada X-Ray
Horch
hardsign

Если бы лет десять назад кто-то сказал, что когда-нибудь мне захочется посмотреть отечественный автомобиль, я бы посмеялся. Искромётные КВН-овские шутки про «закрыть ВАЗ» вызывали неизменный одобрительный смех в зале. Но потом я стал замечать, что с интересом разглядываю «Калину». На специализированных форумах на вопрос о хорошем коммерческом автомобиле советуют «Ларгус». Неожиданно салон соседской «Приоры» оказался не хуже какого-нибудь корейца. И когда у дилеров появилась лада-рентген, мне и правда захотелось познакомиться с ней поближе.

К сожалению, я не топ-блоггер, и недельная поездка по России за счёт производителя машины мне не положена, а стандартный тест-драйв в салоне – всего около 5 километров по МКАД, где, если не повезёт, не получится даже разогнаться. Но кое-что увидеть я всё-таки успел.

Собрано всё аккуратно и приятно. Все материалы – на уровне, все ниши и выемки – на месте, всё, что должно регулироваться – регулируется (за исключением вылета руля). Единственное, что откровенно не нравится, – это приборная панель. Но во-первых, подобные косяки не чужды даже итальянцам, а во-вторых, для «жигулей» традиционно продаётся множество альтернативных панелей.

Едет машина тоже так, как должна. Разгоняется в пределах 80 км/ч очень бодро (больше разогнаться просто было негде), тормозит неплохо, рулится задорно. Другими словами, будь у меня потребность купить новую машину класса Hyundai i20/Renault Sandero/Škoda Fabia, я бы всерьёз рассматривал Ладу как один из вариантов, причём один из наиболее интересных вариантов.

Чего же не хватает машине, чтобы её захотелось по-настоящему? Во-первых, чуть более мощного двигателя. Ну, хотя бы 2.0/143 л. с. от Renault Duster, а ещё лучше – V6 2.2 л (да, уже закатываю губу обратно, не бывает таких двигателей). Во-вторых, категорически необходим полный привод. Ну, хотя бы игрушечный, как у того же самого дастера, а ещё лучше – нормальный, трёхдифференциальный, как у классической Нивы.

В общем, получился очередной игрок на весьма насыщенном рынке. Возможно, за счёт моды на патриотизм, демпинга и симпатичного дизайна кое-кого удастся подвинуть. Повторю, нужна бы мне была такая машина, я б её с удовольствием купил. Но машины-мечты не вышло, а жаль.


Необычный тест-драйв
Знакъ
hardsign

Пару недель назад пришлось мне передвигаться по столице незнакомым маршрутом. Идти пешком было далековато, на метро надо было сделать две пересадки, а перспективы дождаться троллейбуса были весьма туманны. И тут на глаза мне попалась стоянка велосипедов. А почему бы не попробовать? И я попробовал.

Про велосипед

Очевидно, владельцы сервиса решали задачу «наиболее надёжный велосипед за минимальные деньги». Если оценивать машины по этому критерию, то задача решена на «пять». Понятно, что на карбоновой раме и амортизаторах сэкономили, зато есть и крылья, и фары, и корзинка для груза, и парковочный трос, и пусть неубедительный, но звонок... в общем, всё, что необходимо городскому велосипеду.

Если же оценивать машину именно как машину, то недостатков у неё предостаточно. Во-первых, очень тяжёлая рама. Это не доставляет неудобств, до тех пор, пока не надумаешь перебраться через дорогу по подземному переходу. Во-вторых, крайне неудачно подобраны передаточные числа коробки. Для движения в горку хотелось бы что-нибудь между второй и третьей, а уж для ровной местности или движения с горы отчаянно не хватает повышенной передачи – четвёртой и пятой. Похоже, всё сделано под современную манеру езды – быстро и расслабленно крутить ногами, поднимая колени к ушам. В-третьих, тормоза явно слабоваты – притормозить сложно, а торможение «в пол» (ну, или «в кулак») останавливает велосипед отнюдь не мгновенно.

Впрочем, есть и достоинства: очень длинная колонка седла с простым и надёжным механизмом регулировки и весьма неплохой руль. Конечно, за собственные деньги такой велосипед не купишь, но в качестве прокатного – более, чем прилично.

Про сервис

Буду краток: сервис на 5 с маленьким минусом. Во-первых, очень много станций проката, ближайшая – в 30 метрах от нашей б~госпасаемой конторы. Во-вторых, про каждую станцию известно, сколько там велосипедов и сколько свободных портов. В-третьих, техническое состояние велосипедов более чем приличное: шины накачаны, спицы натянуты, цепь смазана, люфтов нет. Один раз, правда, попался велосипед, у которого слетала цепь. В-третьих, служба поддержки действительно работает. Когда я позвонил туда в девятом часу вечера, мне ответил живой человек и решил мой вопрос. И всё это за весьма умеренные, особенно по московским меркам, деньги.

Маленький минус – за мобильное приложение. За гугл-карты, которые на территории России существенно уступают в точности и детализации Яндексу, и за отсутствие статистики – средней скорости, суммарного пробега и т. д.

Про передвижение по Москве

Москва, как известно, город на семи холмах. Не настолько, конечно, крутая, как Смоленск или Сан-Франциско, но существенно круче, чем Санкт-Петербург или Северодвинск. Из-за этого время в пути и удовольствие от поездки очень сильно зависит от того, туда ты едешь или обратно. Впрочем, даже путь «туда» получается быстрее, чем на троллейбусе, – время ожидания плюс время в пути от остановки до места равно времени поездки на велосипеде. А ведь и едет троллейбус тоже не мгновенно, и при удачном сочетании рельефа местности и направления ветра скорость велосипеда получается больше.

Поездка по центру Нерезиновой на велосипеде – вообще сплошное удовольствие. С одной стороны, можно ехать довольно быстро. С другой – не надо тратить время на пробки, можно ехать по тротуару, по встречной полосе – где угодно. Водители, кстати, вполне нормально относятся к велосипедистам, я такого не ожидал. Среди прохожих попадаются чудаки – то встанут в самом узком месте, то изменят направление движения без предупреждения... Объективно их немного, один-два на 10000, но в силу своей природы они довольно-таки заметны.

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


Подражая Пушкину
Знакъ
hardsign

Из далёкого далёка
Мчит с дружиной царь Додон,
Чтобы супостату око
Натянуть на афедрон.

Tags:

Поиграем в слова
Знакъ
hardsign

Много лет назад один хороший человек сделал мне роскошный подарок – орфографический словарь русского языка в виде текстового файла. Вот прямо вручную сидел и набивал. С получением этого подарка многие игры перешли из разряда эрудиции в разряд программирования.

Двадцать пять слов

Эта игра описана в книге Николая Васильевича Студенецкого «Мастерская головоломок» – прекрасное пособие по составлению кроссвордов, чайнвордов, ребусов и прочих загадок. Суть её состоит в том, чтобы выбрать 25 слов, в которых встречается только одна гласная. Каждый слог – очко, чем больше очков – тем лучше. Результат для буквы «А», приведённый в книге, – 92 очка. Прекрасный результат для тех, у кого нет под рукой словаря и Perl’а. А вот у меня получилось 104 очка. Сможете повторить?

[104 «А» в 25 словах] табасаранка, махабхарата, каракалпачка, абракадабра, шарлатанка, фальцаппарат, таратайка, таракашка, табасаран, сахараза, саранбада, саламата, саламандра, размахайка, прапрабабка, парафраза, параграмма, парагвайка, матамата, майкараган, магараджа, магаданка, катаракта, катамаран, каталажка

Разумеется, без словаря повторить такое невозможно. Чего стоит, например, одна только «сахараза». Но нет, это не опечатка, «сахароза» и «сахараза» – слова разные.

Другие буквы тоже дают неплохой результат, добиться которого без компьютера нереально:

[114 «О»]обороноспособность провозоспособность, холодостойкость, ортоводород, односторонность, морозостойкость, молокопровод, многосторонность, многооконность, короткоголов, бороводород, хлопководство, фосфороскоп, торфокомпост, соцдоговор, скотоложство, скотоводство, подковонос, подголосок, подголовок, подбородок, плодоводство, отголосок, осторожность, ословодство

[54 «У»]футурум фурункул, узуфрукт, бурундук, шушун, шуруп, чупрун, чугун, чубук, хунхуз, фундук, ушкуй, учуг, уступ, урду, улус, укус, уксус, уйгур, узус, удмурт, убрус, турсук, тунгус, тулуп

[79 «И»]сифилитик, примитивизм, пиримидин, инфинитив, щипчики, чистильщик, чилижник, цивилист,трилистник, триклиний, трикирий, стиптицин, спиритизм, спиннингист, сифилис, синцитий, сильвинит, силиций, силицид, рицинит, ризничий, приписник, примитив, прилистник, пиррихий

[9 «Э»]эст, эрг, эльф, эль, сэр, пэр, нэп, мэр, бэр

[31 «Я»]тятя, стряпня, няня, мямля, мяльня, дядя, ять, ярь, ярд, яр, ямб, ям, ял, як, язь, яд, явь, шлях, хрящ, хряск, хряк, хлябь, фляк, тяж, тля

[25 «Ё»]шёлк, чёт, чёс, чёрт, чёлн, флёр, фён, тёс, тёрн, съём, счёт, счёс, слёт, рёв, плёс, пёс, мёд, лёт, лёсс, лён, лёд, ксёндз, клёш, клёст, клён

[27 «Ю»]тютюн, бюльбюль, юфть, ют, юс, юр, юз, юг, шлюп, шлюз, хлюст, флюс, тюрк, тюль, тюк, трюм, трюк, рюш, пшют, плющ,плюш,плюс,нюх,люфт,люкс

[27 «Ы»]ссыльный, выплыв, штырь, штык, штыб, шлык, хрыч, хлыщ, хлыст, тын, тыл, сыч, сыть, сыск, сырь, сырть, сырт, сыр, сыпь, сын, стык, стыд, срыв, сныч, сныть

[94 «Е»]переселенец, перекрещенец, фельдцейхмейстер, фейерверкер, перешеек, перелесье, перекрестье, перевертень, метелемер, межвременье, земледелец, егермейстер, делькредере, веретенце, безземелье, безденежье, безвременье, штрейкбрехер, шерхебель, шельтердек, чеченец, хмельненек, фельдъегерь, фельдфебель, фейерверк

А вот и программа, которая извлекает из словаря нужные слова. Первые несколько строк – необъяснимая магия, заставляющая программу понимать кодировку utf-8, а дальше идёт изящный, элегантный и интуитивно понятный код (как, впрочем, выглядит любой код на Perl’е):

#!/usr/bin/perl

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);

my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;
 
my %vw = ("а",0, "я",0, "о",0, "ё",0, "у",0, "ю",0, "и",0, "ы",0, "э",0, "е",0); 
my @list;
ALL: while (<STDIN>) {
  my %lvw = %vw;
  for (map {chr} unpack ("C*")) { $lvw{$_}++ if (exists($lvw{$_})); }
  while (my($k,$v) = each %lvw) {
    next ALL if ($v && $k ne $ARGV[0]);
  }
  unshift(@list,$lvw{$ARGV[0]}.$_);
}
my ($c,$s) = (0,0);
for (reverse sort @list) { 
  print substr($_,1);
  $s += substr($_,0,1);
  last if (++$c==25); 
}
print "Всего ".$s."\n";

Слово в слове

Об этой игре лучше всего сказать в стихах:

Если взять большое слово,
Вынуть буквы, раз и два,
А потом собрать их снова,
Выйдут новые слова.
Поиграйте раньше с нами,
А потом играйте сами.
Вот из слова ГАСТРОНОМ
Вышел важный АСТРОНОМ.
Вышел МАГ и вышел ГНОМ,
А за ними АГРОНОМ...
МОСТ построен на реке,
ГРОМ грохочет вдалеке,
С нижней палубы МАТРОС
От причала тянет ТРОС...
Сверху лётчику видна
Вся родная СТОРОНА.

В детстве мы играли так: выбирается слово, а потом в течение 10 минут каждый записывает на бумажке слова, сложенные из выданных букв. За каждое слово игрок получает по очку, а если окажется, что такого слова ни у кого больше нет, то два или даже пять.

За слово «гастроном» игрок, вооружённый мощной вычислительной техникой и правильными исходными данными, мог получить минимум 127 очков. А сколько получите вы?

[Spoiler (click to open)]агроном, ар, арго, аргон, артос, ас, астроном, атом, га, гам, гарсон, гарт, гастроном, гном, гнома, гомон, гон, гонор, гонт, гора, гормон, горн, горст, гост, гран, гром, грот, маг, магн, маго, магот, манго, мано, манор, манс, манто, мао, мар, марго, марс, март, масон, мат, матрос, мга, могар, монстр, мор, морг, морс, мост, мот, мотор, нарост, наст, натр, нога, нора, норма, нос, нота, ом, омар, он, она, онагр, оно, орган, орс, орт, оса, осман, осмотр, осот, ост, острог, острога, отгон, относ, отрог, рамс, ранг, рант, рог, ром, роман, романс, роса, рост, рот, рота, ротанг, ротон, саго, самогон, сан, сгон, смог, смотр, сом, сома, сон, сонм, сор, сорго, сорт, срам, стан, стог, стогна, стон, сторно, сторона, строма, танго, тога, том, тон, тора, торг, торос, торс, транс, трас, трог, трон, трос

Ну, и разумеется, перловки мешок – куда ж без этого:

#!/usr/bin/perl

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);

my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;
 
ALL: while (<STDIN>) {
  y/ё/е/;
  my $w = $ARGV[0]."\n";
  foreach (map {chr} unpack("C*")) { next ALL unless ($w =~ s/$_//); }
  print;
}

Шаг за шагом

Это, пожалуй, самая интересная игра. Правила такие: из одного слова надо сделать другое, меняя за ход по одной букве. Суть в том, что на промежуточных шагах тоже должны получаться осмысленные слова. Например:

роща → роза → поза → пора → пара → парк

В детстве мне легко удавалось превратить реку в море, ежа – в яка, тесто – в булку. Но есть и такие превращения, которые без пол-литра компьютера не осилишь:

[из бабы – леди]баба → раба → рана → рань → рать → мать → муть → суть → сыть → сыпь → выпь → высь → весь → весы → веды → веди → леди

[из мухи – слон]муха → мура → мара → кара → каре → кафе → кафр → каюр → каюк → каик → клик → клык → шлык → штык → шток → сток → стон → слон

[из воды – вино]вода → кода → копа → кипа → кила → кило → кино → вино

[из тела – душа]тело → село → сель → сеть → суть → сушь → суша → душа

Взыскующим кода – сюда:

#!/usr/bin/perl

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);
use Time::HiRes qw(gettimeofday tv_interval);

my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;
die "Слова должны быть одинаковой длины" if ((my $LEN = length($ARGV[0])) != length($ARGV[1]));

my $start_time = [gettimeofday];
my @words;
while (<STDIN>) {
  if (length==$LEN+1) { chomp; unshift(@words,$_); }
}

my @list;
push(@list,$ARGV[0]);
LIST: for my $l (@list) {
  WORD: for my $w (@words) { 
    my $d = 0;
    for (0..$LEN-1) { $d++ if (substr($w,$_,1) ne substr($l,$_,1)); next WORD if($d>1); }
    for (@list) { next WORD if (substr($_,0,$LEN) eq $w); }
    push(@list,$w.",".$l);
    last LIST if ($w eq $ARGV[1]);
  }
}

foreach (reverse(split /,/,pop(@list))) { print $_,"\n"; }
printf ("Выполнено за %f секунд\n",tv_interval($start_time,[gettimeofday]));

В заключение выражаю искреннюю благодарность А. Н. за титанический труд по набору текста, Ларри Уоллу за прекрасный язык Perl, святым равноапостольным Кириллу и Мефодию за любезно предоставленные буквы и Александру Кожевникову за сервис подсветки кода.


Корпоративная политика
Знакъ
hardsign

В модных стартапах с коворкингами и смузи прижилась практика использования для работы собственных устройств – ноутбуков, планшетов, смартфонов. Называется это «bring your own device», сокращённо – BYOD.

В нашей б~госпасаемой конторе политика рабочих мест формулируется коротко:

Пользуйся корпоративным ноутбуком – и не BYOD.

?

Log in

No account? Create an account