Няшная / Говнокод #25229 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SQARESZ 3


void rotateclockwise(char *ptra, size_t sz)
{
    char (*a_ar)[sz] = (void *)ptra;
    char b_ar[sz][sz];
    for (size_t y = 0; y < sz; y++)
    {
        for (size_t x = 0; x < sz; x++)
        {
            b_ar[y][x] = a_ar[sz-1-x][y];
        }
    }
    memcpy(a_ar, b_ar, sz*sz);
}

void print_ar(char *ptra, size_t sz)
{
    char (*a_ar)[sz] = (void *)ptra;
    for (size_t y = 0; y < sz; y++)
    {
        for (size_t x = 0; x < sz; x++)
        {
            printf("%i ", a_ar[y][x]);
        }
        printf("\n");
    }
}

int main()
{
    char a[SQARESZ][SQARESZ] =
    {
      {1,2,3},
      {4,5,6},
      {7,8,9}
    };
    
    print_ar((char *)a, SQARESZ);
    printf("\n");
    rotateclockwise((char *)a, SQARESZ);
    
    print_ar((char *)a, SQARESZ);
    printf("\n");
    rotateclockwise((char *)a, SQARESZ);
    
    print_ar((char *)a, SQARESZ);
    printf("\n");
    rotateclockwise((char *)a, SQARESZ);
    
    print_ar((char *)a, SQARESZ);
    printf("\n");
    rotateclockwise((char *)a, SQARESZ);
    
    print_ar((char *)a, SQARESZ);
    printf("\n");

    return 0;
}

https://habr.com/post/317300/ В C++17 до сих пор нет нормальных многомерных массивов, которые были в Fortran начиная с Fortran 90

> UPD от 2016-12-10 14:03. Посмотрел на этот коммент от @selgjos, поэкспериментировал с компилятором и понял, что с помощью C99 VLA всё-таки можно добиться нужного мне эффекта.
> В общем, окей, в C есть нужные мне массивы. Как и в Fortran. А в C++ их по-прежнему нет.

Запостил: j123123 j123123, (Updated )

Комментарии (144) RSS

  • >Впрочем, нормальный метод работы с многомерными массивами всё-таки есть в C++. В Boost.MultiArray. Но это Boost, это не стандартная библиотека, а потому не засчитывается.
    Ответить
    • А еще можно самому наговнякать через арифметику указателей. И что?
      Ответить
      • Я конечно веб-макака, так что поправь меня, если я не прав - но разница между Boost, который кусками уходит в стандарт и "самому наговнякать через арифметику указателей" очевидна.
        Ответить
        • Boost это кусок блядского крестодерьма с говношаблонами и препроцессором, который еще и меняется от версии к версии, часто ломая при этом обратную совместимость. А если я сам что-то наговнякаю, я буду этот код прекрасно понимать и поддерживать
          Ответить
          • Автор статьи с названием "В C++17 до сих пор нет нормальных многомерных массивов.." позже признает, что "нормальный метод работы с многомерными массивами всё-таки есть в C++...".
            Ты или крестик сними или трусы надень. Не хочется писать костыли - есть Boost. Не хочется Boost и писать костыли - не знаю, на fortran пиши. Кто вообще сказал что многомерные массивы оттуда должны быть в стандарте.
            Ответить
            • Что значит "есть в C++"? Фраза "есть в какой-то там библиотеке" это не значит "есть в C++". Никто ведь не говорил, что в C++ это принципиально невозможно сделать каким-либо способом. Просто этого НЕТ В СТАНДАРТЕ
              Ответить
              • Чёрт, как же меня бесит эта питушня в программировании.
                Люди не создавали время и не знают, что такое время. Это нормально.
                Люди создали кучу языков программирования, но не знают, что такое язык программирования.
                "Сделать что-то в языке", "сделать стандартными средствами", "сделать кратко и надёжно" и "сделать просто" - разные, порою не пересекающиеся вещи. И даже если вводить термины вроде "стандартная библиотека", "стандартный способ", окажется, что всё равно их никто не будет использовать потому, что они бесполезны.
                Ответить
                • > сетевого взаимодействия в тоже "Нет в С++"?

                  Нет, что вы, мы только факториалы в компайл-тайме считаем.
                  Ответить
                  • А как же вы до constexpr-то жили? Использовали блядское крестодерьмо Boost.Phoenix? Или через enum на коленке говнякали?
                    Ответить
                    • Енум, разумеется. Если подключаешь Phoenix, компилятору памяти на машине не хватает.
                      Ответить
                      • Надо просто было GC в компилтайм встроить для шаблонных метапрограммистов. Жаль, что до этого не додумались
                        Ответить
                      • А нельзя поднять memcached и сделать распределенную компиляцию?
                        Ответить
                        • > А нельзя поднять memcached и сделать распределенную компиляцию?

                          Нет, ведь для этого нужно обращаться к сети, а в C++ этого нет.
                          Ответить
                        • Распределенную компиляцию обычно делают через distcc и icecream. Есть еще всякие проприетаные решения, IncrediBuild например
                          Ответить
                          • но она не умеет спредить копуляцию одного модуля!
                            а мне надо одного
                            причем не компиляциюm, а прпрцессироване
                            Ответить
                                • Как причем? Можешь делать на нем SWAP. Или по-твоему у тебя по сети будет быстрее шариться память, чем будет SWAP?

                                  Или ты еще хочешь чтоб у тебя несколько процессорных ядер на разных компах одним процессом компилятора захавывались и компилировали один единственный сраный файл говноплюсов? А вот хер тебе! Этого не умеют никакие из известных мне компиляторов. Да и нахер это не нужно, в общем-то.
                                  Ответить
                                  • >>хер
                                    конечно я этого хочу.

                                    SWAP я могу и на SAN сделать с Fibre Channel, да только почему бы мне тогда локально не поставить 4 терабайта SSD на nvme?

                                    Или думаешь не хватит?
                                    Ответить
                                    • > SSD
                                      > SWAP

                                      Сдохнет быстро. Лучше под такое дело сделать жесткий диск из оперативы. Была такая хрень, GIGABYTE i-RAM и HyperOs HyperDrive.
                                      Ответить
                                      • SLC может и не быстро.. Вариант с диском из SDRAM хрош но будет мал

                                        лучше уж тада правда по сети
                                        Ответить
                • > Спасибо, что объяснил. Я так понимаю, сетевого взаимодействия в тоже "Нет в С++"?

                  Естественно нет. Вот например если ты захочешь на "C++" написать под какую-нибудь нестандартную ОС, под которую сеть будет реализована через какую-то свою, особую, несовместимую ни с чем жопу, то тебе придется через эту жопу делать сетевое взаимодействие.
                  Ответить
          • Boost - не Windows, сам без спросу не обновится.
            А написать свой хороший контейнер - уже достаточно нетривиальная задача, чтобы не пользоваться полустандартной библиотекой.
            Ответить
        • Не нужна там никакая арифметика указателей. Простенький 2-д массив пишется строк в 10 (оборачиваешь std::vector с n*m элементами, переопределяешь операцию индексирования), произвольной размерности, известной во время компиляции — ну может строк в 20-30.
          Ответить
          • Ну да, только для этого мне надо что-то в что-то оборачивать, определять методы с этими перегрузками. В языке Си мне этого ничего делать не требуется.
            Ответить
            • > надо что-то в что-то оборачивать

              В языке C++ ты можешь легко написать функции, которые будут работать с произвольными типами данных, а не только с char. ну и про malloc() и free() тоже можно будет забыть, за временем жизни будет следить вектор.
              Ответить
              • Что самое интересное - вектор не умеет в realloc(). Там если через strace глянуть - будет выделен новый кусок, а старый освобожден
                Ответить
              • > В языке C++ ты можешь легко написать функции, которые будут работать с произвольными типами данных, а не только с char.

                https://dev.by/news/intervyu-s-krisom-kasperski-aka-mysch-h


                — Как я понял, твой успех был отчасти в том, что все пытались найти общее универсальное решение и впоследствии увязали в нарастающей сложности. Ты же решил узкоспециализированную задачу, зато смог это сделать эффективно и быстро. Немного отвлекаясь от основной темы, здесь мы снова возвращаемся к любимому тобой спору вокруг назначения языков C и C++.

                — Каждый конкретный язык определяет мышление, хотим мы того или нет. Так вот, постоянно сталкиваюсь, что «плюсовики» тяготеют к решениям в общем виде, в то время как «сишники» решают задачу в частном виде, что в разы быстрее.

                Одну текущую задачу сначала показали «плюсовику», спросив, сколько займёт её решение. Он сказал: «Здесь нужно писать могучий движок. Короче говоря, это проект на полгода». Его коллега-«сишник» поинтересовался: «А зачем?» Ведь поставленная задача укладывается в сотню строк кода! Ответ был ошеломляющим: «Ну и что, мы так и будем по сотне строк кода писать для решения частных задач, каждый раз, как они возникают? Нетушки, задачи надо решать раз и навсегда!».

                По моему глубокому личному убеждению, проблемы нужно решать по мере их возникновения. Писать программы на вырост с избыточным универсализмом нужно лишь очень хорошо предварительно подумав, ибо это из серии «Почему сегодня не делают корабли, летающие к звёздам?» Ответ прост: потому что корабль, построенный завтра, прибудет быстрее, а корабль, построенный послезавтра, еще быстрее. И их обоих обгонит корабль, построенный лет через пятьдесят, но когда он вернётся обратно, то обнаружит, что у человечества совсем другие проблемы».
                Ответить
                • Так вот, ебаться с классами-хуяссами-шаблонами-хуяблонами для произвольных типов данных есть смысл только тогда, когда это реально надо по т.з. А если это нахер не надо, хватит и такого решения. Но и для сложных случаев я все ж пожалуй предпочту написать кодогенератор на сишке через принтф-ы, чем задрачивать вашу крестометушню со всякими std::enable_if, boost.hana и прочей подобной припизданутой пидоросней
                  Ответить
                • Цвет кожи (особенно детская) имеет достаточно специфичный оттенок, который предсказуемо «корёжится» при пережатии в разные цветовые пространства. Сочетание цветов половых органов так же специфично. Но это мы пока говорим про то, что есть на порно. А вот то, чего на нём гарантированно нет, позволяет однозначно отсеять кучу другого контента. Обычно в качестве критерия для поиска с переменным успехом искали лишь первую часть условия. У меня же эффективность значительно увеличивается использованием второй «исключающей» составляющей. Но даже в первой составляющей у меня есть определённые ноу-хау.

                  Чего такого гарантированно нет в порно?
                  Ответить
                • >> Каждый конкретный язык определяет мышление, хотим мы того или нет.

                  Совершенно верно. Например в среде "PHP" принято писать код с SQL инхекциями, тогда как в других языках это считается табу
                  Ответить
                  • >>Ну и что, мы так и будем по сотне строк кода писать для решения частных задач, каждый раз, как они возникают?

                    именно так и будем. Вставил очередную ветку в if в 78 местах кода, и нафиг мне эжти ваши движки?
                    Ответить
                  • У меня никококококих SQL-инъекций не бывает, потому что я все данные сохраняю в txt-файл вместо использования СУБД.
                    Ответить
                      • В "PHP" есть функция file, которая возвращает массив строк: каждый элемент массива –— это одна строка текстового файла.

                        Например, нужно получить имя пользователя № 25580. Я пишу так:
                        $users = file('users.txt');
                        $user_id = $_GET['user_id'];
                        $username = $users[$user_id];

                        Если вдруг в $_GET['user_id'] придёт не число, то просто выскочит предупреждение, что такокококой-то ключ массива отсутствует. А если бы хранил в СУБД, то была бы инъекция.
                        Ответить
                        • ого, это юниксвей
                          ту нам sort, wc, join , вот жэто всё
                          Ответить
                          • И редактировать такую базу можно обычным текстовым редактором.

                            И найти юзера по шаблону имени можно программой grep!
                            Ответить
                          • А ведь сколько софта станет не нужно, если ввести удобную файловую систему!

                            Через FUSE отображаем базу данных на текстовые файлы и ищем в них грепом, что нужно.
                            Ответить
                            • MS ка-кто придумывал SQL-based filesystem
                              не придумал


                              Мне нравится твой вариант. Жаль, он не работает если на комптютере более одного пользователя или более одной программы.

                              но я считаю что в наше время каждый пользователь может позволить себе отдельный комптютер, тк что жэто не проблема
                              Ответить
                        • Поэтому я за "PHP".

                          P.S.: Ты забыло раскококошить слово "выскочит".
                          Ответить
                        • А что если в файле миллион миллион миллион длинных строк?
                          Ответить
                          • Ну тогда придётся докукукупить оперативки для сервера.
                            Ответить
                            • И на каждый запрос ты будешь загружать этот файл целиком? Да ты петух проткнутый!
                              Ответить
                              • питушок, держи помощь зала:

                                можно взять mmap и за ммапить в ппамять хоть 77 гигабайт дданных
                                Ответить
                                • Спасибо! В "PHP" никакого "mmap" нет, поэтому о таком варианте не подумал. Я вообще не думаю, именно поэтому я за "PHP".
                                  Ответить
                                • mmap в данной задаче поможет, если у нас двоичный файл, представляющий собой массив записей фиксированного размера. Тогда сразу делаем seek на требуемое смещение.

                                  А с текстовым файлом будет жопа. По-любому придётся сканировать весь файл в поисках переводов строк.
                                  Ответить
                              • Есть другой вариант. Функция fgets читает файл по строчке. Тогда можно будет циклом пропустить нужное количество строк.
                                Ответить
                                • use strict;
                                  use warnings;
                                  
                                  open(F, "1.txt") || die "No file";
                                  while (my $l = <F>) { 
                                  	chomp($l);
                                  	my @record = split /\s+/, $l;
                                  	printf "%s : %s\n", $record[0], $record[1];
                                  }
                                  
                                  close(F);

                                  я за пёрл
                                  Ответить
                                  • Фи:
                                    for i in map(str.split, map(str.strip, open("1.txt", "r"))):
                                        print("%s : %s" % (i[0], i[1]))
                                    Ответить
                                    • Наверное, даже так:
                                      print("\n".join(map(lambda s: "%s : %s" % s.split().strip()[:2], open("1.txt", "r"))))
                                      Ответить
                                  • > пёрл

                                    Какое-то вербозное говно
                                    awk '{ print $1, ":", $2 }' 1.txt
                                    Именно поэтому я за "AWK".
                                    Ответить
                                    • Кто как будит отмечать НГ?

                                      Полкило колбасы, москальский салат, пара бутылок шмурдяка?
                                      Ответить
                                        • >После него пук очень вонючий

                                          У тебя панкреатит?
                                          Ответить
                                            • Опять страйко раздухарился? За что забанили батхёрт?
                                              Ответить
                                              • Почему здесь стало так тихо? Куд-куд-куда все подевались? Неужели всех забанили?
                                                Ответить
                                                • Не обращай внимания. Все заняты подготовкой к какому-то там празднику, на который еще ёлку наряжать надо.
                                                  Ответить
                                                  • Кукареку! В Новосибирске без двадцати минут шесть часов утра. Тебе скокококоро вставать!
                                                    Ответить
                                                  • Теперь точно шесть утра в Новосибирске наступило. Кукарекууууу!
                                                    Ответить
                                              • Ходят упорные слухи, что стертор получил доступ к админке. Достоверно известно, что он взламывал учётки и спамил с них.
                                                Ответить
                                                • Подозреваю, что стертор и админ - один и тот же хуй
                                                  Ответить
                                                  • эту мысль я высказал лет 5 назад.
                                                    Ответить
                                            • А ну-ка
                                              давай-ка
                                              уябывай отсюда
                                              Ответить
                                              • Если бы профессор как Вы говорите получил доступ к админке, зная его характер, он стал бы вредительствовать и первым делом бы разнёс в пух и прах борманда, которого он ненавидит. Однако, всё обошлось лишь несколькими забаненными учетками. Борманд тоже пока жив, глюков с сайтом не наблюдается.
                                                Ответить
                                                • Профессор? Он ехал в самом конце колонны, на старом, дряхлом, хромом верблюде и сейчас стоит в голове очереди желающих поебаться.
                                                  Ответить
                                    • это андастрочник для прыщеадминов
                                      програмисты должны не уметь awk
                                      если кто умеет авк -- тот, ясное дело,прыщеадмин для замены картриджей
                                      Ответить
                                    • perl -ane 'printf "%s: %s\n", @F' 1.txt


                                      Как раз в угоду любителей awk, ключ -a включает разбиение на поля в массив @F. Но и без него цикл можно уплотнить:

                                      printf "%s: %s\n", split while <>;
                                      Ответить
                                      • тэкс, давайте вдуплять

                                        BODY while(condition) выполняет BODY пока condition true.
                                        Обращение к <> в скококолярном контексте приводит к чтению одной строчки и покладанию ее в $_. А при наступлении EOF оно вернет undef и цикл закончится.

                                        split сплитит $_(так как не указано иное) по паттерну " " (так как не указано иное) и овзвращает лист (если явно не заказать скалярный котекст)

                                        printf получает массив в какачестве аргумента и выводит.

                                        prl охенн
                                        Ответить
                                        • Ага. Кстати, для упрощения переваривания мутной перловки, у конпелятора можно попросить её разжевать и выплюнуть в квадратно-гнездовую форму - опцией Deparse модуля O (perldoc O):
                                          perl -MO=Deparse -e 'printf "%s: %s\n", split while <>'
                                          ->
                                          printf "%s: %s\n", split(' ', $_, 0) while defined($_ = <ARGV>);
                                          Ответить
                                          • Во класс! А для питона такое есть? Я только дизассемблер знаю.
                                            Ответить
                                            • Не встречал. Надо ещё аналог для C++, чтобы переводил на PHP на каком-нибудь человеческом языке объяснял, что там происходит.
                                              Ответить
                                          • P. S. Тут выплывают дополнительные спец. случаи:
                                            - строковый литерал ' ' в качестве шаблона split эмулирует awk'овое разбиение (отличается от /\s+/);
                                            - цикл while <> таки не завершается, если из файла прочитана строка "0" (в булевом контексте она ложь); например, строка "0" может быть последней перед EOF без "\n"; также ромбик <> может возвращать по одному символу, когда задан размер записи $/ = \1.

                                            Именно поэтому я не за Perl. 🙁
                                            Ответить
                                            • У меня возникла идея сайта. Суть такова: там будут разделы «Почему я не за Perl», «Почему я не за ВК/Mail.ru/FB/Твитур», «Почему я не за Amazon/Ebay/Aliexpress», «Почему я не за iOS/Android/Windows Phone», «Почему я не за Uber/Яндекс-такси/Бла-бла-кар», «Почему я не за Discord/Slack/Skype/Telegram/Whatsapp/Viber».

                                              Погодите...
                                              Ответить
          • ... а чем не угодили "очевидные" варианты? например:

            * std::vector<std::vector<int>> (топорный вариант, проверено временем - работает ок-ish)

            * std::map< int, std::vector<int> > ( если часто надо переаллоцировать первый уровень )

            я в прошлом начал с первого, но закончил std::list<std::vector<int>>, потому что по первому индексу надо было только итерировать (прямое индексировние был не нужен), и надо было добавлять новые строки часто.

            на glibc под прыщами, аллокатор как-то хитрожопо соптимизирован, что существенной разницы по расходуемой памяти было почти невозможно померять. может только если размерности в тысячах/миллионах. но мне это было не надо.
            Ответить
            • > что существенной разницы по расходуемой памяти было почти невозможно померять

              Mежду чем и чем разницы? Между одним вектором и N векторами? Так она отличается только на примерно на ~3*N интов.

              Существенное отличие не в потреблении памяти, а в кол-ве обращений к аллокатору. Если ты создаёшь один вектор, у тебя будет ровно одна аллокация на всю матрицу. Если ты делаешь вектор/список/мапу векторов, у тебя будет N+1/2*N аллокаций (а в случае списка/мапы ещё и куча мелких объектов). Для числодробилок это может быть важно.

              Память лучше выделять редко и большими блоками.

              Если тебя устраивает list<vector>, то пирфоманс тебе явно не особо важен.
              Ответить
              • > а в кол-ве обращений к аллокатору.

                в курсе. про это не написал - но точно также на линухе никакой существенной разницы не видел.

                если конечно в tight loop впихнуть там будет сильно заметно.

                но в приложении которое еще что-то делает - это капля в море.

                честно говоря самого удивило. колличество аллокаций я поэтому и не мерял - потому что я видел что glibc/stdc++ какую-то магию творит уже на расходе памяти.

                на старых системах/старых STL версиях я делал оптимизации std::map/list -> std::vector и видел 2-5х меньше расход памяти и 2х прирост производительности. тест аналогичного кода на линухе - разница была в пределах ошибки измерения.
                Ответить
            • > ... а чем не угодили "очевидные" варианты? например:

              Как минимум тем, что у тебя эта хрень будет хуже кешироваться процессором из-за того, что аллокатор как попало может это дело разбросать. Да и операция взятия конкретного элемента из такого "двумерного массива" будет больше тактов проца жрать
              Ответить
              • Цитирую:

                > В C++17 до сих пор нет нормальных многомерных массивов, которые были в Fortran начиная с Fortran 90

                У автора статьи - и похоже у тебя тоже - какое-то очень предвзятое понимание как массивы в Фортране работают. (Сам Фортрана не знаю - но было в прошлом несколько коллег которые десятилетия на нем пахали. Народ этот язык сильно переоценивает. Кучи фортранщиков на кресты перешли, к слову, и куча софта на кресты уже спортирована.)

                Все недостатки - и достоинтства - той или иной реализации массивов, как ты не крути, в независимости языка, будут присутствовать.

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

                С/С++ тебе позволяет через библиотеку делать как тебе нравится.

                На Фортране (и Пасцале, и Лиспе) уже в язык захардкожено.

                Wähle Dein Gift.
                Ответить
                • Что, гастер, в белую страну впустили?
                  Ответить
                  • Он там работает, платит налоги, и из его налогов тебе платят пособие по безработице чтобы ты с голоду не умер.
                    Ответить
                    • Он - дешевый гастер, который отнимает работу у местных.
                      Ответить
                • > и Лиспе

                  Можно подумать, там сложно либу написать поверх массивов. В крайнем случае FFI.
                  Ответить
                • > На Фортране (и Пасцале, и Лиспе) уже в язык захардкожено.

                  В Фотртане и Паскале у тебя есть указатели, можешь поверх них свои массивы делать через написание библиотеки (даже без FFI).
                  Ответить
    • VLA там только для каста использовать можно, если что.
      Ответить
      • Да, посмотрел статью.

        А для чего код в топике? Там же во время компиляции все размеры известны, автор статьи другого хочет.
        Ответить
        • В этом примере да, но вообще та функция может тебе любой квадратик поворачивать по часовой. Это просто пример.
          Ответить
          • > char b_ar[sz][sz];
            вай вай

            К слову, на 90 градусов очень легко развернуть in-place: транспозиция + отражение дают поворот.

            Т.е. к примеру если транспонировать и отразить каждую строку, получишь поворот по часовой стрелке. Если отразить каждый столбец — против часовой стрелки.

            А теперь напиши функцию, которая будет вращать матрицу на произвольное кол-во элементов относительно центра.
            Ответить
            • >> char b_ar[sz][sz];
              > вай вай

              Пффф...
              char (*b_ar)[sz]  = malloc(sz*sz);
              if ((void *)b_ar == NULL)
              {
                fprintf(stderr, "ERROR: your two-dimentional array is too big\n");
                exit(EXIT_FAILURE);
              }
              Ответить
            • > А теперь напиши функцию, которая будет вращать матрицу на произвольное кол-во элементов относительно центра.

              Как вращать, квадратными кольцами такими?
              ┌────┐
              │┌──┐│
              ││┌┐││
              ││└┘││
              │└──┘│
              └────┘

              Написать-то я напишу, только что мне за это будет? Лень мне.
              Ответить
  • В S" Forth" нет никаких массивов => в S" Forth" нет проблем с массивами.

    Именно поэтому я за S" Forth"
    Ответить
    • В Брейнфаке вообще ничего нет. Именно поэтому я за Брейнфак.
      Ответить
      • Придумал на днях эзотерический язык, назвал его "". В нём всего один оператор —– "", он принимает один операнд. В результате применения этого оператора к самому себе мы можем получить "", применив оператор ещё раз получится "" и т.д. Вся программа на "" состоит из композиций оператора "" с оператором "". Вот пример программы:
        А вот интерпретатор этого языка написанный на нём же:
        Это единственный интерпретатор размером в 0 байт. И, как вы могли догадаться, все программы на этом языке занимают 0 байт. Соответственно, пися на этом языке мы существенно экономим память, да и вообще все ресурсы конпуктеров, а так же время и моск разработчика.
        Ответить
        • У меня есть идея куд-куд-куд-куда более эзотерического языка. Программы на нём имеют отрицательный размер. Способ хранения: берём текстовый файл с предсказуемым содержимым (например, с классической художественной литературой), отрезаем от конца N байт. Эти N байт, нигде не хранящиеся, и будут программой. «Сохранив» такую программу, мы уменьшили текстовый файл на N байт, значит, на диске программа весит -N байт.

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

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

          Правда, я пока ещё не придумал, как будет интерпретироваться такая программа.
          Ответить
          • береш сжимаеш 2 / 1 +1 = 12 а тогда 12 + 1 будет 1 и получается зожатие 13.33% на разные вареции
            Ответить
          • Можно взять количество недостающих бат, преобразовать его в 2-чную систему, дополнить нулями до длины кратной 4-м, разбить на тетрады, каждая тетрада обозначает одну из операций брейнфака.
            Ответить
  • * g o a t s e x * g o a t s e x * g o a t s e x *  
     g                                               g  
     o /     \             \            /    \       o  
     a|       |             \          |      |      a  
     t|       `.             |         |       :     t  
     s`        |             |        \|       |     s  
     e \       | /       /  \\\   --__ \\       :    e  
     x  \      \/   _--~~          ~--__| \     |    x  
     *   \      \_-~                    ~-_\    |    *  
     g    \_     \        _.--------.______\|   |    g  
     o      \     \______// _ ___ _ (_(__>  \   |    o  
     a       \   .  C ___)  ______ (_(____>  |  /    a  
     t       /\ |   C ____)/      \ (_____>  |_/     t  
     s      / /\|   C_____)       |  (___>   /  \    s  
     e     |   (   _C_____)\______/  // _/ /     \   e  
     x     |    \  |__   \\_________// (__/       |  x  
     *    | \    \____)   `----   --'             |  *  
     g    |  \_          ___\       /_          _/ | g  
     o   |              /    |     |  \            | o  
     a   |             |    /       \  \           | a  
     t   |          / /    |         |  \           |t  
     s   |         / /      \__/\___/    |          |s  
     e  |         / /        |    |       |         |e  
     x  |          |         |    |       |         |x  
     * g o a t s e x * g o a t s e x * g o a t s e x *
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8