?

Log in

No account? Create an account
Предыдущий пост Поделиться Следующий пост
Крипипаста
sceptic
slobin

Если слово escape записать задом наперёд, а потом прочитать как число по основанию 36, то ответ (в десятичном виде) будет состоять из восьмёрок и девяток. Примерно так:

int("".join(reversed("escape")), base=36)

"escape".flip.parse-base(36)

"escape".dup.reverse.to!int(36)

(parse-integer (reverse "escape") :radix 36)

list_to_integer(lists:reverse("escape"), 36)

parseInt('escape'.split('').reverse().join(''), 36)

По-моему, самый человекочитаемый здесь common lisp. А python, наоборот, самый непонятный и крипи. 888999998

Update: int("escape"[::-1], base=36) от gegmopo4

... Ну как ты в приличном обществе покажешь на пальцах число 132? ...

Метки: ,

  • 1
Браво! Совсем забыл про эту фичу. Репутация Питона восстановлена (моя, правда, посрамлена, ну да это дело наживное :-).

... The hinge of armoring is important internal source ...


Вот интересно, почему люди, которые обожают из питона делать APL, используя uncomprehandble syntax of list comprehension или вот подобные extended slices, обычно возмущаются
когда из питона пытаются делать lisp, используя простые и понятные lamda, map, reduce?

Позволю себе не согласиться. map -- операция настолько фундаментальная, что заслуживает естественного синтаксиса (так же, как заслуживают его сложение и умножение), и list comprehension -- это он и есть. [x + 1 for x in something] соотносится с map(lambda x: x + 1, something) точно так же, как a + b * c соотносится с add(a, mul(b, c)). Заодно компенсируем не самый удачный выбор ключевого слова для лямбды (не помню, кто из отцов-основателей писал, что "я имел в виду одну букву, а не шесть!"). reduce в его чистом виде контринтуитивен и потому малополезен. Надо либо хаки, как в APL, либо набор готовых примитивов (sum, max, min, all, any), а остальное честно писать циклами. А вот extended slices -- как раз тоже очень наглядно, я бы ещё расширил. Собственно, в numpy это вроде даже сделали, но я подробно не смотрел, врать не буду.

... Я не волшебник, я уже научился ...


С одной стороны, extended slices — это жемчужина в Python. Очень удобно в некоторых случаях. С другой стороны — это может быть примером overengineering. В основном они используются с шагом 1 (тривиально), -1, и (намного реже) 2. На практике вне NumPy ничего больше не встречается. Причём Гвидо говорит, что сейчас он бы не стал реализовывать слайсинг с отрицательным шагом, — указание границ в этом случае выглядит ужасным, да и реализация усложняется.

// указание границ в этом случае выглядит ужасным

А это уже (не устану повторять!) неизбежное последствие счёта с нуля. На самом деле есть две школы, каждая из которых при консистентном применении в общем работает: "человеческая" (счёт с единицы, закрытые интервалы) и "программистская" (счёт с нуля, полуоткрытые интервалы, модуль вместо остатка). Надо отдать должное Гвидо, он честно реализовал все три компонента (про модуль обычно забывают), поэтому питоном в рамках второй школы пользоваться можно. Но таки да напарываешься, например, на проблемы с развёрнутыми интервалами.

Возвращаясь к перл6: Ларри со свойственной ему дьявольской гениальностью сумел примирить две школы. Ну или по крайней мере попытался. У него 1..10 -- это, как у людей, "от одного до десяти включительно", программистское "от нуля до десяти НЕ включительно" пишется как 0..^10, но при этом (та-да-да-дам!) 0.. можно опустить и писать просто ^10. В итоге самые часто нужные случаи из обеих школ пишутся наглядно и коротко. Ну и, в качестве штриха мастера, в осмысленных местах можно писать ^∞ (до бесконечности, не включая). Я убедил тебя, что Ларри дьявольски гениален? ;-)

... Полставки верховного главнокомандующего ...

Попробую опознать языки.

Ну, первый — Python, единственный, который я уверенно знаю.

Структура скобок указывает на Lisp. Но какой именно из множества диалектов не знаю.

parseInt позволяет заподозрить Java или какой-то язык, намеренно сделанный Java-подобным (Dart?).

to!int возможно Ruby. Знаю, что там восклицательный знак допускается в именах.

Насчёт остальных не имею понятия. parse-base это одно имя, или способ передачи аргумента по имени?

python, perl6, D, common lisp, erlang, javascript. А ещё говорят, что все знают javascript! По секрету: я его тоже не знаю, я в шпаргалку подглядывал. :-) Но "намеренно сделанный Java-подобным", безусловно, верно. Кстати, про Dart я не подумал.

Выбирались языки, про которые я знаю хотя бы чуть больше, чем название, и в которых есть разворот строки (пусть не очевидным образом) и целые по произвольной базе из коробки. То есть, чтобы самому алгоритмов не писать и ничего внешнего не импортировать.

Мелкие примечания: perl6 теперь официально обзавёлся вторым именем raku. В смысле, это два равноправных названия одного языка. Да, Ларри лингвист-извращенец! И да, parse-base -- это одно имя, дефисы в именах там можно. Ларри называет это kebab-case, я предлагаю читать по-русски как "шампур-кейс" (у нас кебаб не ассоциируется с шампуром, а "шашлык-кейс" произнести невозможно из-за к-к). А в лиспах (всех) это можно было типа "всегда", там это не удивляет.

Восклицательный знак в D -- это инстанциация (как это по-русски?) темплейта. Темплейт to с параметром времени компиляции int. Разумеется, потребуется ещё main и пара импортов, как в большинстве компилируемых языков, но пост не об этом. Остальное вроде тривиально.

... Простите мне неверный слог и пару странных слов ...

Спасибо. Неожиданно увидеть код на Perl без $, @, # и прочая. Таже в Perl5 вроде не принято использовать цепочный вызоі методов, да и выглядело бы это иначе.

Ну так в этом примере просто переменных не было! :-) Хотя на самом деле да, perl6 -- ДРУГОЙ язык. И если рассматривать его не как способ давать команды компьютеру, а как язык, нотацию, инструмент мышления -- то Ларри всё-таки гений. Возможно, злой, но гений. Он именно что думает о том, как людям на этом думать (а как это реализовывать -- вопрос отдельный и менее важный, потом как-нибудь кто-нибудь напишет). У него даже есть отдельная статья (ну, как статья, на один абзац), почему flip, а не reverse!

... Вот и окончился сказочный вечер ...


А что за статья, можно ссылку, пожалуйста?

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

https://perl6advent.wordpress.com/2010/12/08/different-names-of-different-things/

Про обращение: ну это да. Дело даже не в обращении, а есть ли смысл в понятии "символ". Автор одного из лиспов (не самого популярного) считает, что нет, нет смысла, и надо всегда говорить о только о подстроках, выбранных в зависимости от конкретной задачи. То есть, где-то это unicode codepoint, где-то буква со всеми навешанными диакритиками, а где-то вообще байт. И это я ещё за пределы латиницы не вышел, дальше мы вспомним про деванагари и хангыль. Хотя как раз perl6 по умолчанию работает в режиме "буква со всеми навешанными":

"hé̠llo".flip → ollé̠h

Ещё из таких языков я знаю вимскрипт и вроде бы свифт (хотя последнего ни разу не пробовал, сужу по рекламе).

... Преобразователь магазина в очередь ...

a kakoj smysl v inversii stroki jesli eto stroka BUKOV chelovecheskogo jazyka?

  • 1