TGViewer
Channel Public Channel
Гепардово гнездо

Гепардово гнездо

@gepardchan

El nido del guepardo.

@gepardius тащит в гнездо всякое интересное из мира программирования (и не только).

Etaoin shrdlu cmfwyp!

Еще один мой канал: @sofcheck.
Subscribers
617
Photos
41
Videos
0
Links
81

Showing posts older than #54 · Back to latest

Older Posts 20 shown
Post #53 311
Форк-бомба Фибоначчи

Эта форк-бомба работает так, что количество процессов на i-й секунде работы равно i-му числу Фибоначчи.

Код:
#include <unistd.h>

int main() {
sleep(1);
do {
sleep(1);
if (!fork()) sleep(1);
} while (1);
}
  • 👍 7
Post #52 326
Как получить красивое имя типа в виде строки в C++

Есть два варианта.

Первый: через std::type_info::name(). Увы, в этом случае вернется замангленное имя, и его придется как-то приводить в человекочитаемый вид. Для этого нужно возиться с функциями вроде abi::__cxa_demangle() и подобными. Увы, такие вещи компиляторо-специфичны. Пример деманглинга (работает с GCC и скорее всего с Clang) можно посмотреть здесь.

Второй: использовать элегантный хак. Этот способ тоже компиляторо-специфичен: он точно работает для GCC, насчет других компиляторов не знаю. Дело в том, что в GCC есть __PRETTY_FUNCTION__, вместо которого компилятор подставляет имя текущей функции вместе со всеми ее шаблонными параметрами. Отсюда мы как раз можем выковырять имя типа. Вот пример реализации.
  • 👍 5
Post #51 1.24K
Post #50 361
Забавный Юникод: объяснение

На самом деле, все предельно просто.

Как известно, в Python строки хранятся в UTF-32, то есть по одному code point'у на один элемент строки. Таким образом, переворот строки происходит на уровне code point'ов.

Но отображение текста работает хитрее — каждый видимый на экране символ необязательно состоит из одного code point'а, может из нескольких. Такая совокупность code point'ов, образующая один видимый символ, называется extended grapheme cluster. Вычисление границ extended grapheme cluster происходит по определенному сложному алгоритму (который еще и дополняется при выходе новых версий Юникода!).

Теперь вернемся к нашим баранам флагам. На самом деле, в числе code point'ов Юникода нет никаких флагов, зато есть 26 специальных «букв» от A до Z. Две такие «буквы» интерпретируются как один extended grapheme cluster, а образовавшийся от них код страны как раз и задает флаг.

Например, строка '🇧🇬🇦🇲' состоит из четырех таких «букв»: BGAM (или 🇧 🇬 🇦 🇲, если у вас «буквы» умеют отображаться по отдельности). При реверсе мы получаем MAGB, где MA составляет 🇲🇦 (Марокко), а GB — 🇬🇧 (Британию)

Таким образом, загадка разгадана :)
  • 🔥 12
Post #49 333
Забавный Юникод

Угадайте, почему так происходит:
>>> ''.join(reversed('🇧🇬🇦🇲'))
'🇲🇦🇬🇧'

(запускалось в консоли Python)

В чем же дело? Догадки можно писать в комменты, завтра будет ответ.
  • 😁 6
Post #48 347
Шахматная задача на сегодня

(см. картинку выше)

Белые начинают и ставят мат.

FEN: 8/8/8/2p5/1pp5/brpp4/qpprpK1P/1nkbn3 w - - 0 1
Post #47 365
Как экстренно оборвать сеанс SSH, не закрывая консоль

Короткий ответ: <Enter>~. (Enter, тильда, точка)

Длинный ответ: ~ включает Escape-последовательности в SSH. До этого надо предварительно нажать Enter. После этого можно вводить команды:
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - request rekey
~V/v - decrease/increase verbosity (LogLevel)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Чтобы выйти из вложенной SSH-сессии, не выходя из текущей, надо набрать <Enter>~~. (Enter, тильда, тильда, точка). Дело в том, что внешняя SSH-сессия преобразует ~~ в ~ и передаст во внутреннюю, а та уже, в свою очередь, спокойно завершится.
  • 👍 2
Post #46 341
Post #45 1.46K
Может ли человек генерировать случайные числа независимо и равновероятно?

Попробуйте Aaronson Oracle. Его суть проста: надо нажимать случайно на клавиатуре буквы f и d. А далее простая модель (про ее работу можно почитать здесь) будет пытаться предсказывать вашу следующую букву.

Если вы набираете буквы равновероятно и независимо, то модель будет угадывать примерно в 50% случаев. Если нет — то ваш паттерн набора, скорее всего, все еще будет случайным, но явно не будет похож на последовательность независимых случайных событий.

Можете считать этот сайт наглядной демонстрацией того, что люди не понимают интуитивно, как должна выглядеть последовательность испытаний Бернулли (т.е. бросков монетки, после которых фиксируется, упала ли монета орлом или решкой)
  • 👍 3
Post #44 408
Честно украдено с просторов интернетов (увы, не помню, откуда точно)
  • 👍 13
Post #43 320
Про явную специализацию шаблонной функции в С++, часть 2

Что выдаст код — 1 или 2?

Зависит от настроек линковки!
$ g++ a.cpp b.cpp -o a -fuse-ld=lld && ./a
2
$ g++ -Wl,--start-lib a.cpp b.cpp -Wl,--end-lib -o a -fuse-ld=lld && ./a
1

Почему так получается? Все просто: символы, полученные при явной специализации, являются сильными, а при отсутствии явной специализации — слабыми. В первом случае получается так, что слабый символ перекрывается сильным, и мы получаем 2. Во втором случае (с --start-lib) сильный символ не используется, поскольку линкер видит, что у нас уже есть слабый символ, и игнорирует содержимое a.o, который был получен из a.cpp. Но тогда мы получаем 1.

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

А вообще, судя по StackOverflow, программа попросту некорректна. Цитируя Стандарт C++,
> If a template, a member template or a member of a class template is explicitly specialized then that specialization shall be declared before the first use of that specialization that would cause an implicit instantiation to take place, in every translation unit in which such a use occurs; no diagnostic is required.
  • 👍 2
  • 😱 2
Post #42 287
  • 🐳 5
Post #41 282
Про явную специализацию шаблонной функции в С++

Рассмотрим такой код из нескольких файлов.

Файл a.h:
#include <iostream>

template<int N> void doit() { std::cout << 1 << std::endl; }

Файл a.cpp:
#include "a.h"

template<> void doit<1>() { std::cout << 2 << std::endl; }

Файл b.cpp:
#include "a.h"

int main() { doit<1>(); }

Что выдаст код — 1 или 2?

(Правильный ответ с объяснением ждите завтра!)
Post #40 287
И еще в тему пауков 🕷🕷🕷
  • 👍 3
Post #39 275
Я обычный человек и печатаю своими человеческими руками

Оригинал (или вот ссылка на перевод)
  • 😁 4
  • 👍 1
  • 🤯 1
Post #38 259
Еще в тему автодополнения и Telegram: если вы пользуетесь Telegram Desktop, попробуйте набрать :shrug:. Получится ¯\_(ツ)_/¯
  • 👍 3
Post #37 259
Обидно, что реакции в Telegram можно лишь искать в списке, а не набирать, как обычные эмодзи. А то иногда я провожу много времени, чтобы найти подходящую реакцию.

А еще нет раздела, в котором можно смотреть только стандартные реакции. А то они видны только среди недавних и замешаны вместе со всеми остальными :(

Для тех, кто не в курсе набора эмодзи с клавиатуры: попробуйте начать набирать :think или :думаю и посмотрите, что предлагает автодополнение :) И так работает со всеми эмодзи.
  • 👍 4
  • 🕊 2
  • 🐳 1
Post #35 276
Самый распространенный и часто встречающийся стык двух согласных —
это сочетание согласных ст. Оно встречается примерно в полтора раза чаще, чем следующее по частоте сочетание согласных пр (1.25% против 0.77%). Сочетание ст встречается чаще, чем согласные й, ж, х, ш, щ, ц и ф. Только отдельную букву для уменьшения длины текста сочетанию ст не придумали :\
  • 👍 4
Post #34 289
Post #33 357
Рекомендую запомнить и не путать :)
  • 👍 8
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →