1. JavaScript / Говнокод #25364

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    //We want to create a range of N elements (from 0 to N-1 for simplicity)
    
    const N = 10;
    
    const res1 = Array.apply(null, {length: N}).map(Number.call, Number);
    
    const res2 = [...Array(N).keys()];
    
    const res3 = Array.from({length: N}, (val, i) => i); 
    
    const res4 = Array(N).fill().map((e,i)=>i);

    Давайте создавать числовые последовательности.
    Бонусные баллы если в Вашем языке возможно также задать начальное значение и шаг.

    Запостил: bootcamp_dropout, 08 Февраля 2019

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

    • показать все, что скрытоvanished
      Ответить
      • А "Ruby" посасывает у "J":
        4{.42+16*i.100400
        Ответить
      • И у "Python":
        range(42, 91, 16)
        Ответить
        • Давайте сравнивать честно

          питон
          range(42, 100400, 16)[:4]


          руби
          (42..100400).step(16).first(4)


          питон короче, но руби читаемей
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • It's English. Being the language of international community, English could be used while leaving your comments on the Internet.
                Ответить
            • А у "PHP" есть «range», которым не рекомендуют пользоваться, потому что он создаёт не генератор, а настоящий массив. Начиная с версии 5.5 можно написа́ть свою альтернативу «range» через елду:
              http://php.net/manual/ru/language.generators.overview.php
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • В «PHP» есть array_filter:
                  array_filter(range(0,200,5), function($x){return $x % 3 == 0;})


                  В «ES6» вроде много чего добавили, но я им не владею (нужно позвать 1024--).
                  Ответить
                  • Давайте немного сжульничаем:
                    const _ = require('lodash');
                    
                    const res = _(_.range(0,200,5))
                      .filter(x => !(x % 3))
                      .take(4)
                      .shuffle()
                      .value()

                    На ES6 декларативно выразить "сделай мне массив значений от х до у" невозможно, будем костылить:
                    const pituh = (a,b, di) => 
                    Array(Math.floor(Math.abs((b-a)/di)))
                    .fill()
                    .map((_, i) => a+ i*di)
                    
                    const res = pituh(0,200,5)
                    .filter(x => !(x % 3))
                    .slice(0,4)
                    //хуевый shuffle для веб-макак
                    .sort(() => 0.5 - Math.random())
                    Ответить
                    • То-есть создатели самого популярного языка тужились-тужились, но так и не смогли сделать то, что в других языках реализовано уже 25 лет назад?
                      Ответить
                      • Как сказал создатель JS: "I'll do better in the next life."
                        https://habr.com/ru/post/106274/
                        Ответить
                        • Это были его последние слова?

                          Думаю что в аду для него есть специальная сковородочка, рядом со сковородочкой для Расмуса
                          Ответить
                          • Я все-таки думаю, что главная проблема js - люди, которые на нем пишут.
                            Ответить
                            • Люди собираются вокруг инструмента:)
                              По какой-то причине на OCaml, C++ и JavaScript пишут разные люди.

                              Я ничего не имею против JS как против языка для несложных скриптов.

                              Но кажется что на нем уже начали писать IDE, и это как-то пугает
                              Ответить
                              • >Люди собираются вокруг инструмента:)
                                Я довольно часто слышу такое мнение и полностью с ним согласен.

                                >Но кажется что на нем уже начали писать IDE, и это как-то пугает
                                https://www.reddit.com/r/emacs/comments/ahjfpk/wouldnt_it_be_nice_if_emacs_rewrote_in_o op/

                                JS удивителен в этом плане: язык прошел огромный путь, развился и разросся за такое малое время. Если так на это смотреть, то стандартная библиотека js без range, но с wannabe-метапрограммированием с помощью Object и Function методов полностью такой порядок дел вокруг отображает.
                                Ответить
                                • JS довольно древний язык. Тот же C# прошел за меньшее время куда больше изменений и даже плюсы прошли;)


                                  Просто пинок JS получил в конце нулевых, когда война за rich client application закончилась его победой.

                                  И поскольку им занимается не одна компания, то у нас классический design by committee:)

                                  А в целом пора бы уже начать хоронить скриптовые языки.
                                  Это в 1995 году статическая типизация мешала, а теперь помогает. Я правда не понимаю чем JS лучше того же Kotlin
                                  Ответить
                        • >> Считайте, что JavaScript (пожалуйста, только не «JScript») спас вас от VBScript.

                          А интересно, как бы выглядели сайты в альтернативной вселенной, где основным языком является VBScript.
                          Ответить
                          • MS не Sun, они соплей не жуют.
                            Скорее всего они взяли бы всё в свои руки, заставили бы производителей браузеров платить им fee, в итоге VBS ни в каких попен сурс системах бы не работал, и W3C с ноля разработал бы что-то более внятное.

                            зы: почему вообще надо выбирать между двух стульев?
                            Ответить
                      • А в C++ числа Пи нет. 40 лет тужились, но так и не выдавили.

                        Главное - есть все возможности для реализации в библиотеках.
                        Начиная с ??? работает r = range(1, 10); while((x = r.next()) !== null) ...
                        Начиная с ES5 работает range(1, 10).forEach(...).
                        Начиная с ES2016 работает for(const x of range(1, 10)), причём range - ленивый питух.
                        Начиная с ES2018 работает for await (const x of range(1, 10)), причём range - ленивый асинхронный питух.

                        JS - хороший низкоуровневый язык, на основе которого можно легко создавать свои выразительные диалекты.
                        Ответить
                        • > пи
                          Причём они даже завезли variable templates, через которые можно описать это пи... Но пи как не было так и нет. Зато есть функции бесселя.
                          Ответить
                        • Это все конечно змечательно, но в 2019 если я хочу
                          дождаться выполнения операции над массивом, выполнить другую операцию и сохранить результат, я пишу что-то вроде
                          const res = await Promise.all(
                            range()
                              .map(async (x) => /**/))
                          .then(arr => /**/)

                          Как вышло что в ES5 нам дают array методы, а в ES2016-2018 мы снова откатываемся к for?
                          Ответить
                          • map ведь никто не убирал, можно пользоваться. Ну и асинхронный вариант добавить. Хотя, тут придётся либо несколько вариантов, либо подумать. Иногда нам нужно будет подождаь асинхронные элементы массива, обработать асинхронными функциями и вернуть массив промисов явно, иногда - подождать асинхронные элементы, обработать асинхронными функциями и посчитать результирующий массив и т.д., и эти действия должны быть разделены. Динамическая питуизация будет только мешать, когда результат станет непредсказуемым.
                            Ответить
                            • На самом деле, нам нужен только
                              Uniform Function Call Syntax:
                              const res = range()
                                .map(async x => /**/)
                              //handle each promise
                                .map(async promise => /**/)
                              //now unify and await them
                                .(await Promise.all)
                              //now do other shit and return promise
                                .map(async (resolved) => /**/)
                                .(Promise.all)
                              //...and maybe other spaghetti
                                .then(arr => 'kukareku')

                              Но комитету такие смелые дизайнерские решения не нужны, поэтому лучше они накидают блочной императивной хуйни чтобы индусам, которые получают карри за кол-во строк кода, было на что жить.
                              Ответить
                        • показать все, что скрытоvanished
                          Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Просто не нужно использовать "PHP" для разработки софта, и не будет никаких проблем
                    Ответить
          • Запомнить 3 аргумента не сложно, и мне кажется, что питно здесь читаемей.
            Ответить
    • показать все, что скрытоvanished
      Ответить
      • Тебе-то конечно виднее.
        Опустим Wolfram language или тот же R, которые ты, очевидно, посчитаешь хуйней для задротов, приведу тебе пример из моей практики веб-макаки:
        В reactjs если надо создать много (относительно) одинаковых элементов, нужно каждому присвоить уникальный key, и если элементы чисто визуальные(например, затычки), то присвоить каждому компоненту элемент натурального ряда чисел - первое, что приходит в голову.
        К слову, костыльный вариант ES6 отлично с этим справляется, так как позволяет отрендерить элементы "не отходя от кассы":
        render(){
        return (<>
          {Array.from({length:N}, (_,i) =>
            (<p key={i+1}>govno</p>))}
        </>)
        }
        Ответить
      • А для чего создавались языки?
        Ответить
    • Кстати, перл. ДРЕВНИЙ перл. Даже в нём это легко
      my @range = map { 10 * $_ } 1..20;
      print join ", ", @range;
      Ответить
    • for (int i = 0; printf("%i, ", i), i < 100; i++);
      Ответить
      • #include <stdio.h>
        
        int main()
        {
            for (int i = 3; i < 100; i += 16) {
                printf("%d, ", i);
            }
            puts("\b\b  ");
        
            return 0;
        }


        А «Ideone» не поддерживает «\b». Ну и говно!
        Ответить
        • '\b' вне терминалов и сочнолей вообще работает?
          Ответить
          • На принтерах.
            Ответить
            • На матричном принтере "A\bA" выведет жирную букву «A», потому что второй проход не совсем точно совпадает с первым. А "I\bХУЙ" выведет «ЖУЙ». Можно вообще новые буквы составлять таким приёмом.
              Ответить
              • "\\\b/y|/\b`|"
                Ответить
                • А ведь таким приёмом можно русифицировать принтер, не загружая в него новые шрифты и не переходя в графический режим. А ещё так можно печатать на АЦПУ, у которых не иголочки, как у матричных принтеров, а молоточки с готовыми буквами (ромашки, барабаны), как у пишущих машинок.

                  Кроссплатформенность!
                  Ответить
      • <# 0 50 do bl hold [char] , hold i s>d #s -5 +loop #> 2 chars - type
        В S" Forth" можно использовать циклы внутри форматирования. Именно поэтому я за S" Forth".
        Ответить
        • Ну это всё-таки не "внутри форматирования". Это ближе к крестовому std::stringstream.
          Ответить
          • Только задом наперёд, и ещё нужно помнить что никаких распределений памяти внутри <# #> а то распидорасит строку.
            Ответить
            • В форте всё задом-наперёд. Так что консистентненько.
              Ответить
    • Именно поэтому я за «C++17».
      #include <iostream>
      
      template<typename T>
      struct range {
      public:
          struct iterator {
          public:
              ~iterator() = default;
      
              T operator*()
              {
                  return cur;
              }
      
              bool operator==(const iterator & other)
              {
                  return cur == other.cur;
              }
      
              bool operator!=(const iterator & other)
              {
                  return !operator==(other);
              }
      
              iterator & operator++()
              {
                  cur += step;
                  if (cur > stop) {
                      cur = stop;
                  }
                  return *this;
              }
      
              iterator & operator++(int)
              {
                  return operator++();
              }
      
              friend struct range;
          private:
              iterator(T cur, T stop, T step) :
                  cur(cur),
                  stop(stop),
                  step(step)
              {}
              
              T cur = T{};
              T stop = T{};
              T step = T{};
          };
      
          range(T start, T stop, T step) :
              start(start),
              stop(stop),
              step(step)
          {}
          ~range() = default;
      
          iterator begin()
          {
              return iterator(start, stop, step);
          }
      
          iterator end()
          {
              return iterator(stop, stop, step);
          }
      
          T start = T{};
          T stop = T{};
          T step = T{};
      };
      
      int main()
      {
          for (int x : range(3, 100, 16)) {
              std::cout << (x == 3 ? "" : ", ") << x;
          }
          std::cout << std::endl;
      
          return 0;
      }

      https://wandbox.org/permlink/5jKwmvNFmQxCs0De
      Ответить
    • Зато в "J" можно так:
      i. 2 3 4
       0  1  2  3
       4  5  6  7
       8  9 10 11
      
      12 13 14 15
      16 17 18 19
      20 21 22 23
      Ответить
      • Хм, в "APL" йота работает по-другому:
        ⍳ 2 3 4
        
        ┌─────┬─────┬─────┬─────┐
        │1 1 1│1 1 2│1 1 3│1 1 4│
        ├─────┼─────┼─────┼─────┤
        │1 2 1│1 2 2│1 2 3│1 2 4│
        ├─────┼─────┼─────┼─────┤
        │1 3 1│1 3 2│1 3 3│1 3 4│
        └─────┴─────┴─────┴─────┘
        ┌─────┬─────┬─────┬─────┐
        │2 1 1│2 1 2│2 1 3│2 1 4│
        ├─────┼─────┼─────┼─────┤
        │2 2 1│2 2 2│2 2 3│2 2 4│
        ├─────┼─────┼─────┼─────┤
        │2 3 1│2 3 2│2 3 3│2 3 4│
        └─────┴─────┴─────┴─────┘
        Надо так:
        2 3 4 ⍴ ⍳ 2 × 3 × 4
        
         1  2  3  4
         5  6  7  8
         9 10 11 12
                   
        13 14 15 16
        17 18 19 20
        21 22 23 24
        Ответить
    • main = putStr (show [x | x <- [111, 222 .. 999]])
      Ответить
      • Что за питушарский заумный язык?

        То ли дело Haskell:
        main = print [111, 222 .. 999]
        Ответить
        • Лол, ладно принт, я не знал про него, но почему я так записал список? )))
          Ответить
    • все это бред. Давайте лучше так. Напишем кусок кода на любимом вами языке который нельзя написать на другом языке программирования. И тогда вы все поймете - что это все "тлен"
      Ответить
      • Кусок кода на "верилоге" подойдет?

        З.Ы. Ну хотя ты его на "vhdl" перепишешь. Так что и правда тлен.
        Ответить
        • любой язык (аболютно) упрощается до уровня if/then ... Даже гребаный prolog и lisp это все реализуется на if/then
          Ответить
          • jz
            Ответить
            • > jz
              if + goto же.

              А вот какой-нибудь mov cr3, page_table уже хер перепишешь.
              Ответить
              • Почему хер?
                Ты просто пишешь в регистр указатель на таблицу странц в памяти, какая разница на каком язвке?
                Ответить
                • Вероятно, проблема в том, что во многих языках без асмовставки или без инъекции кода не обойтись, ибо нет средств для доступа к отладочным регистрам.
                  Ответить
                  • Это не особенность языка, но его библиотеки и среды выполнения
                    Ответить
                    • То есть если я для конкретного языка напишу библиотеку в нативных кодах, которая может в произвольный регистр записывать произвольное значение, то задача будет решена?
                      Ответить
                      • Вероятно да

                        В борланд си например был API доступа к регнистрам
                        cr3 там конечно не было, но всякие AX были
                        Ответить
          • always @(posedge clk) begin
                a <= b;
                c <= d;
            end
            Это операторы параллельного присваивания. Они выполняются одновременно по фронту сигнала clk. Удачной реализации на обычном языке ;)

            З.Ы. Само собой, для верилога и вхдл есть симуляторы которые работают на последовательной машине через эти ваши if/then. Но они пригодны только для отладки и юнит-тестов.
            Ответить
            • Встроенные средства для поролонизации даже в "Algol-68" есть. Или я чего-то недопоняу?
              Ответить
              • Твой последовательный проц всё равно не выполнит эти 2 оператора одновременно. Как не крути.
                Ответить
                • Именно поэтому я за «Эльбрус».
                  Ответить
                • Да же если у меня ядер или процов >= 2?
                  Ответить
                  • Ну вот написал я процессор на верилоге. У него там тысячи этих параллельных присваиваний каждый такт крутятся.

                    Ты можешь симулировать всё это даже на одном ядре. Но такты растянутся во времени и, скорее всего, нормально взаимодействовать с внешним миром эта симуляция уже не сможет. Резиновая женщина, в общем.
                    Ответить
                    • Понятно.

                      Давай, чтобы не оскорблять ничьи религиозные чувства, будем считать "Verilog" не языком программирования, а языком для описания схем.
                      Ответить
                      • З.Ы. Ну, с другой стороны, если ты успел поправить все выходы и уложиться в тайминги до следующего переключения clk, то никто ничего не заметит. В синхронной схеме в общем-то всем похуй на параллельность. Т.е. таки можно описать поведение схемы на обычном языке. И это даже будет работать если твой проц намного быстрее симулируемой схемы.

                        И раз уж у нас есть машина тьюринга с бесконечной памятью, то пусть она будет ещё и очень быстрой.
                        Ответить
            • В обработчик прерывания пишем инструкции VLIW («Итаниум» позволял выполнить параллельно три совершенно разные инструкции).
              Ответить
              • Джва i/o порта одновременно эти ваши vliw прочитают за один такт? Что-то я сомневаюсь.

                З.Ы. Прочитают джва - один хер не прочитают 200.
                Ответить
                • Кстати, как на x86 работают инструкции IN/OUT, когда аргументом является не байт, а слово (два, четыре, восемь байтов)?

                  P.S. Я понял, чем плохи мультибайтовые инструкции IN/OUT. Можно отправлять данные только в смежные порты, а не в произвольные.
                  Ответить
                  • Это не смежные порты... Это один большой. И кусками его обычно писать нельзя. Да и джва смежных байтовых порта скорее всего охуеют от записи слова сразу в оба.
                    Ответить
          • Можно упрощать не только до императивных if/then, есть ещё такая хрень как правила переписывания, ещё можно упрощать до операций над множествами, до кобенаторной логики, до клеточных автоматов и хз ещё чего можно придумать. Короч, до чего угодно "тюринг-полного". Просто if/then в железе проще реализуется.

            ЗЫ. Мне всегда CA нравились. Интересно, есть ли какие-нибудь каптуперы на их основе?
            Ответить
            • > на их основе
              Машина тьюринга на life? Вроде есть...
              Ответить
              • Я про реализацию CA в железе.
                Ответить
                • А они в железе легко реализуются. Тот же life на циклоняшке всего 4 ячейки на клетку занимал.
                  Ответить
                  • Я так думаю, это говно обладает высокой степенью поролонизации и ограничений по количеству клеток нет, потому что нет адресов. Только вот кажется что 2 состояния это слишком примитивно, слишком много пердолинга с таким программированием, надо бы иметь несколько состояний, может даже раздельно иметь состояние и данные.
                    Ответить
      • Напиши на любом другом языке:
        http://govnokod.ru/24819#comment431158
        Ответить
      • Квайны - кандидаты в такие программы.
        Хотя, даже если писать на HQ9+, придёт человек со знанием HQ9++ и напишет такой же квайн на другом языке.
        Хотя, тут как с самым большим числом: всегда можно придумать свой язык, который делает то же самое.
        Ответить
    • Pawn:
      // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
      new a[10] = [0, 1, ...]
      // 3, 8, 13, 18, 23, 28, 33, 38, 43, 48
      new b[10] = [3, 8, ...]
      Ответить
    • я сделяль
      Enumerable.Range(1, 10).Select(i * 4).ToArray();
      Ответить
      • Это шарп? Тогда селект не тот. Надо i => i *4 в аргумент
        Ответить
    • и еще на расте:
      let arr = (0..10).map(4);
      let arr = (0..40).step_by(4);
      Ответить
    • показать все, что скрытоvanished
      Ответить

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