ЙажаСценарий / Говнокод #25778 Ссылка на оригинал

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
// Python
  str = "1,2,3,4,5,6"
  print(str.replace(",", " ")) #1 2 3 4 5 6
// C# 
  String str = "1,2,3,4,5,6";
  Console.WriteLine(str.Replace(',', ' ')); //1 2 3 4 5 6
// Java
  String str = "1,2,3,4,5,6";
  System.out.println(str.replace(',',' ')); //1 2 3 4 5 6
// Javascript
  const str = "1,2,3,4,5,6"
  console.log(str.replace(',', ' ')) //1 2,3,4,5,6

Почему? А хуй его знает

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

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

  • // PHP
      $str = "1,2,3,4,5,6";
      print(str_replace(",", " ", $str)); // 1 2 3 4 5 6
    Ответить
  • Потому что рагулярка
    const str = "1,2,3,4,5,6"
    console.log(str.replace(/,/g, ' ')) //1 2 3 4 5 6
    Ответить
    • Что ты, регулярки слижком устарели для современных функциональных js-ников
      const str = "1,2,3,4,5,6"
        console.log(str.split(',').join(' ')) //1 2 3 4 5 6
      Ответить
        • Канешн, любая js-макака любит рассказывать, какой язык функциональный. На вопрос схуяли всегда квакают что-то в стиле "ну там же есть мап редюс"
          Ответить
          • И ты такой: "ну-ка, крошка, мапни-ка мне итератор не загружая его весь в память"
            И всё
            Тут-то и пизда настала
            Ответить
      • >split
        >join

        1991-й год. В комнате двое программистов.

        Первый программист: ты знаешь как в 2019 году будут заменять запятые на пробелы?
        Второй программист: сначала сплитить, создавая в куче массив, затем джойнить, создавая в куче строку.
        Первый программист (падает замертво на пол).

        --Занавес--
        Ответить
        • Ну а как ещё в жс заменить все вхождения произвольной подстроки?
          Ответить
        • >создавая в куче строку.
          Ну расскажи как в js(и во всех остальных языках с иммутабельными строками) сделать это inplace
          Ответить
            • Для «PHP» можно написа́ть на «Си» нативное расширение, которое будет извращать контекст, как захочет.
              Ответить
          • Дело не в том, чтобы сделать замену на месте. split создает целый массив подстрок, (а в JS это вроде даже целый хэш-таблица, она мапяти больше займет) это считай там будут собственно строки, хэш-таблица с ссылками на них плюс сами объекты тоже хэши. В "V8" наверное не будет кучи подстрок, они будут в виде графов, но в остальном оверхед тот же. Плюс еще хуй знает когда это все удалится.
            Ответить
            • >она мапяти больше займет
              Скажи спасибо что я не оформил этот пост в виде приложения на electronjs
              Ответить
          • Кстати, например 'J' распознает шаблон вида
            array =: replacements (indexes)} array NB. ну и прочие подобные выражения с закорючками-примитивами
            и использует в таких случаях замену на месте.

            Но в этом случае я против 'J', потому что функция замены подстроки реализована там довольно страшненько и вряд ли интерпретатор сможет как-то ее оптимизировать
            stringreplace=: 4 : 0
            
            txt=. ,y
            t=. _2 [\ ,x
            old=. {."1 t
            new=. {:"1 t
            oldlen=. # &> old
            newlen=. # &> new
            
            if. *./ 1 = oldlen do.
            
              hit=. (;old) i. txt
              ndx=. I. hit < #old
            
              if. 0 e. $ndx do. txt return. end.
            
              cnt=. 1
              exp=. hit { newlen,1
              hnx=. ndx { hit
              bgn=. ndx + +/\ 0, (}: hnx) { newlen - 1
            
            else.
            
              hit=. old I. @ E. each <txt
              cnt=. # &> hit
            
              if. 0 = +/ cnt do. txt return. end.
            
              bgn=. set=. ''
            
              pick=. > @ {
              diff=. }. - }:
            
              for_i. I. 0 < cnt do.
                ln=. i pick oldlen
                cx=. (i pick hit) -. set, ,bgn -/ i.ln
                while. 0 e. b=. 1, <:/\ ln <: diff cx do. cx=. b#cx end.
                hit=. (<cx) i} hit
                bgn=. bgn, cx
                set=. set, ,cx +/ i.ln
              end.
            
              cnt=. # &> hit
              msk=. 0 < cnt
              exp=. (#txt) $ 1
              del=. newlen - oldlen
            
              if. #add=. I. msk *. del > 0 do.
                exp=. (>: (add{cnt) # add{del) (;add{hit) } exp
              end.
            
              if. #sub=. I. msk *. del < 0 do.
                sbx=. ; (;sub{hit) + each (sub{cnt) # i. each sub{del
                exp=. 0 sbx } exp
              end.
            
              hit=. ; hit
              ind=. /: (#hit) $ 1 2 3
              hnx=. (/: ind { hit) { ind
              bgn=. (hnx { hit) + +/\ 0, }: hnx { cnt # del
            
            end.
            
            ind=. ; bgn + each hnx { cnt # i.each newlen
            rep=. ; hnx { cnt # new
            rep ind} exp # txt
            )
            Ответить
            • Это что, гзипнутый файл распидарасило?
              Ответить
              • Либо кодировку распидорасило
                Ответить
            • Похоже на испорченный матричный принтер.
              Ответить
            • Ебать, у инхи подсветка частитно вскрывает спойлер.
              Ответить
          • В любом нормальном языке replace сделает это создав один объект в куче и переложив туда чары
            Ответить
          • npm install string-replace-all
            import stringReplaceAll from 'string-replace-all';
             
            stringReplaceAll ( '1,2,3,4,5,6', ',' ,' ');
            Ответить
                  • Потому что расширять прототип нативных объектов - это плохо, пнятненько?
                    Ответить
                    • Совершенно не понятненко, кстати. В Ruby и Kotlin например очень даже используют такие extension методы.
                      Ответить
      • Ты серешь, replace(',', ' ') это replace(RegExp(','), ' ')
        Ответить
    • {
          char *i = str;
          char *end = str + strlen(str);
          for(; i != end; ++char) if (*i == ',') {
              *i = ' ';
          }
      }
      Именно поэтому я за (char[]){'C'};
      Ответить
    • Для подстрок длиной один символ можно так:
      str =: '1,2,3,4,5,6'
         echo ' ' ((I.@:=&','@])}) str
      1 2 3 4 5 6
      } - это вставка в массив
      I. возвращает индексы ненулевых елементов, т.е. I.@:=&',' вернёт индексы зопитых.

      Можно сделать короче, используя тот факт, что ',' - означает котенацию массивов, а елементы массива числел обычно разделяются проьелами, просто евалим строку:
      echo ".str
      1 2 3 4 5 6
      'J' подебил!
      Ответить
  • Въебал минус. Очевидно же, что идет замена только первого вхождения. Там флаг нужен, вроде [rfReplaceAll].
    Гораздо хуже, что остальные языки по умолчанию производят замену во всей строке.
    Ответить
    • хуемену

      почитайте уже как регулярки работают
      без флага g они не обязаны быть глобальными
      Ответить
      • У спермора в "Delhi" не ягулярка, а какойто the losiped.
        Ответить
        • просто стертор это бессмысленное ведро спущёнки
          вот и всё
          Ответить
          • А ты - просто гость. Но это не отменяет правил этикета.
            Положи вилку, она тебе не понадобятся. Возьми ложку в правую руку.
            Ответить
      • Начнем с того, что это не регулярка, ибо там нет шаблона.

        @без флага g они не обязаны быть глобальными
        А теперь прочитай мой пост выше.
        Ответить
  • Забавно, что в S" Forth" до сих пор не стандартизированы слова для замены подсторки в строке, в стандарте 2012 года введены ' REPLACES и ' SUBSTITUTE , но они работают только для замены %вот-таких-вот% %шаблонов%, например S" замена" S" имя" REPLACES определяет новый шаблон, S" строка" БУФЕР ДЛИНА-БУФЕРА SUBSTITUTE осуществляет замену и записывет результат в буфер.

    НУ ЕБАНУТЫЕ.
    Ответить
  • Аггау.ргототуре.map.call("1,2,3,4,5,6", el => el == ',' ? ' ' : el)
    Ответить
    • А я за другой язык на 3 буквы:
      BEGIN {
          str = "0,1,2,3,4,5,6"
          gsub(",", " ", str)
          print str
      }
      Ответить
      • Или например за кобенацию языков на 4 и на 3 буквы:
        echo "1,2,3,4,5,6"|sed "s/,/ /g"
        Ответить
            • Я сначала хотел поставить такую табличку:
              http://ozaru.net/dogs/chewa.jpg

              Потом вспомнил, что здесь никто, кроме Нидлеса, языков банту не знает. Именно поэтому я за «Vigyazat! A kutya harap!»

              Кстати, я раньше удивлялся тому, что в некоторых диалектах щенка зовут кутёнком. Мне слово «кутёнок» казалось странным. Теперь я понял, откуда оно. А ещё эрзяне собаку зовут словом «киска», проверь:
              https://ru.wiktionary.org/wiki/киска#Эрзянский
              Ответить
              • Я не знает никаких "банту", моя только статью в вике и первые пару глав учебника по суахили осили. Мне просто порнавилось когда ты про именные классы гавк говорил.
                Ответить
  • Именно поэтому я за «Perl».
    print("1,2,3,4,5,6" =~ s,\,, ,gr);  # 1 2 3 4 5 6
    Ответить
    • А можно вот так:
      "1,2,3,4,5,6" =~ s"([^,]+)"print \"$1 \""ger;  # 1 2 3 4 5 6


      А на старых версиях можно вот так:
      ($_ = "1,2,3,4,5,6") =~ s,\,, ,g; print;  # 1 2 3 4 5 6


      И именно поэтому.
      Ответить
  • В «C++» нет никаких «replace», именно поэтому я против «C++».
    #include <string>
    #include <algorithm>
    #include <iostream>
    
    int main()
    {
        std::string str = "1,2,3,4,5,6";
        std::transform(std::begin(str), std::end(str), std::begin(str), [](auto && c) { return (c == ',' ? ' ' : c); });
        std::cout << str;  // 1 2 3 4 5 6
    
        return 0;
    }
    Ответить
        • Или на макароносах:
          #include <stdio.h>
          
          #define QUOTE_(...) # __VA_ARGS__
          #define QUOTE(...) QUOTE_(__VA_ARGS__)
          #define SPLIT(a,b,c,d,e,f) a b c d e f
          
          int main(void)
          {
              puts(QUOTE(SPLIT(1,2,3,4,5,6)));
          }
          Ответить
        • Простенький набросок:
          #include <iostream>
          #include <array>
          
          template<char C>
          char repl()
          {
              if constexpr (C == ',') {
                  return ' ';
              } else {
                  return C;
              }
          }
          
          template<char... Str>
          auto replacer()
          {
              std::array<char, sizeof...(Str)> filtered = { repl<Str>()... };
              return filtered;
          }
          
          int main()
          {
              auto arr = replacer<'1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6'>();
          
              std::string str{ std::begin(arr), std::end(arr) };
              std::cout << str;  // 1 2 3 4 5 6
          
              return 0;
          }


          Застопорился на моменте преобразования строки в параметры вариадического шаблона (func("hui") -> replacer<'h', 'u', 'i'>()).
          Ответить
            • Задумчивый sizeof. Размер parameter pack'а. Те, кто придумывал крестовые вариадические шаблоны — ёбнутые на всю голову шизофреники.
              Ответить
  • «Batch»:
    @ECHO OFF
    SET "string=1,2,3,4,5,6"
    ECHO %string:,= % 
    REM 1 2 3 4 5 6
    Ответить
    • Ну тут "g" означает глобал, наверное
      Ответить
  • «Haskell»:
    replacer from to c
      | c == from = to
      | otherwise = c
    
    main = do
      print $ map (replacer ',' ' ') "1,2,3,4,5,6"  -- "1 2 3 4 5 6"


    Я не настоящий хаскеллист, а «Хаскелль» на ГК нашёл!
    Ответить
  • SNOBOL:
    BEGIN
        STR = '1,2,3,4,5,6'
    L   STR ',' = ' ' :S(L)
        OUTPUT = STR
    END
    Несколько раз на нем писал, но до сих пор не знаю как в нем сделать комментарий )))
    https://tio.run/##K87LT8rPMfn/38nV3dOPSwEIgkOCFGwV1A11jHSMdUx0THXM1Ll8oOLqOuogOSC0Ctbw0QSr9w8NCQgNAQoDFXC5@rn8/w8A


    В первой колонке начинаются имена меток, две строки записанные рядом дают паттерн матчинг, через = можно сразу присвоить совпадению другую строку, если совпадение было возвращаяется "успех" (SUCCESS) иначе FAILURE, за ":" начинается секция переходов, "S(L)" переход на метку L если успех (так образуется цикл, пока все совпадения в строке не заменятся), иначе исполнение продолжится далее, также есть переход если "не успех" "F(метка)", и безусловный переход ":(метка)".

    Если вдруг кому интрересно:
    http://www.snobol4.org/docs/burks/tutorial/contents.htm
    Ответить
    • Причем если два выражения будут записаны рядом с правой стороны от присваивания, то это уже кокотенация.
      Ответить
      • awk чаще всего используется для замены конкретной строки однострочником
        BEGIN вообще обычно для шапки)

        так что логично, что она инплес
        Ответить
        • Конкретно здесь BEGIN что бы AWK завершалась сразу, а не ждала чего-то на вход. В "PHP" такое делать не надо. Именно поэтому я за "PHP".
          Ответить
          • Ничего не понял, BEGIN на это никак не влияет, awk закакнчивает работу только по exit или по концу потока.
            Ответить
            • Я сам охуел, но по крайней мере в моём "GNU Awk 4.1.1, API: 1.1" именно так.
              Ответить
              • ты лгёш
                guest@peka:~$ awk --version
                GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)
                Copyright (C) 1989, 1991-2016 Free Software Foundation.
                
                This program is free software; you can redistribute it and/or modify
                it under the terms of the GNU General Public License as published by
                the Free Software Foundation; either version 3 of the License, or
                (at your option) any later version.
                
                This program is distributed in the hope that it will be useful,
                but WITHOUT ANY WARRANTY; without even the implied warranty of
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                GNU General Public License for more details.
                
                You should have received a copy of the GNU General Public License
                along with this program. If not, see http://www.gnu.org/licenses/.
                guest@peka:~$ awk '' /etc/passwd
                guest@peka:~$
                Ответить
  • пионеры, идите в жопу
    lua:

    a = string.gsub("1,2,3,4,5", ",", " ")
    print(a)
    Ответить
  • «Rust»:
    fn main() {
        println!("{}", "1,2,3,4,5,6".replace(",", " "));  // 1 2 3 4 5 6
    }
    Ответить
    • Или так:
      my $str = "1,2,3,4,5,6";
      $str ~~ s:g/\,/ /;
      say $str;
      Теперь s/\,/ / в 6 "in-place" (только с переменной) и вместо =~ там ~~
      Ответить
      • Можно с присваиванием почти как в "SNOBOL":
        my $str = "1,2,3,4,5,6";
        $str ~~ s:g{\,} = ' ';
        say $str;
        Ответить
  • Я за язык, в котором если не указать его название в перовой строчке, программа не скомпилится:
    Red []
    
    str: "1,2,3,4,5,6"
    print replace/all str "," " "
    Ответить
    • Чтобы перевести на "REBOL" достаточно заменить "Red" в заголовке на "REBOL". Именно поэтому я за "Red" и "REBOL".
      Ответить
  • «FASM» под «Win32» (то ли дело «int 0x80»!), оптимизировать лень:
    format PE console
    entry start
    
    section '.text' code readable executable
      start:
        mov ecx, _string.len
        mov al, [_to]
      loopa:
        mov bl, [_string + ecx]
        cmp bl, [_from]
        jne skip
        mov [_string + ecx], al
      skip:
        loop loopa
    
        push -11
        call [GetStdHandle]
    
        push 0
        push _temp
        push _string.len
        push _string
        push eax
        call [WriteConsoleA]  ; 1 2 3 4 5 6
        
        push    0
        call    [ExitProcess]
    
    section '.data' data readable writeable
      _temp dd 0
      _string db '1,2,3,4,5,6',0
      _string.len = $ - _string - 1
      _from db ','
      _to db ' '
      
    section '.idata' import data readable writeable
    
      dd 0,0,0,RVA kernel_name,RVA kernel_table
      dd 0,0,0,0,0
    
      kernel_table:
        ExitProcess dd RVA _ExitProcess
        GetStdHandle dd RVA _GetStdHandle
        WriteConsoleA dd RVA _WriteConsoleA
        dd 0
    
      kernel_name db 'KERNEL32.DLL',0
    
      _GetStdHandle dw 0
        db 'GetStdHandle',0
      _WriteConsoleA dw 0
        db 'WriteConsoleA',0
      _ExitProcess dw 0
        db 'ExitProcess',0
    
    section '.reloc' fixups data readable discardable
    Ответить
    • > dd 0,0,0,RVA kernel_name,RVA kernel_table
      Как там... include "win32ax.inc" и буде тебе щасье.
      Ответить
    • Блядь, позор мне, нулевой элемент не реплейснится. Исправил.
      format PE console
      entry start
      
      section '.text' code readable executable
        start:
          mov ecx, _string.len + 1
          mov al, [_to]
        loopa:
          mov bl, [_string + ecx - 1]
          cmp bl, [_from]
          jne skip
          mov [_string + ecx - 1], al
        skip:
          loop loopa
      
          push -11
          call [GetStdHandle]
      
          push 0
          push _temp
          push _string.len
          push _string
          push eax
          call [WriteConsoleA]  ; 1 2 3 4 5 6
          
          push    0
          call    [ExitProcess]
      
      section '.data' data readable writeable
        _temp dd 0
        _string db '1,2,3,4,5,6',0
        _string.len = $ - _string - 1
        _from db ','
        _to db ' '
        
      section '.idata' import data readable writeable
      
        dd 0,0,0,RVA kernel_name,RVA kernel_table
        dd 0,0,0,0,0
      
        kernel_table:
          ExitProcess dd RVA _ExitProcess
          GetStdHandle dd RVA _GetStdHandle
          WriteConsoleA dd RVA _WriteConsoleA
          dd 0
      
        kernel_name db 'KERNEL32.DLL',0
      
        _GetStdHandle dw 0
          db 'GetStdHandle',0
        _WriteConsoleA dw 0
          db 'WriteConsoleA',0
        _ExitProcess dw 0
          db 'ExitProcess',0
      
      section '.reloc' fixups data readable discardable
      Ответить
      • format PE console
        entry start
        
        include 'win32ax.inc'
        
        start:
            mov ecx, _string.len + 1
            mov esi, _string
            mov bl, [_to]
            mov bh, [_from]
        loopa:
            lodsb
            cmp al, bh
            jne skip
            mov [esi - 1], bl
        skip:
            loop loopa
        
            invoke GetStdHandle, STD_OUTPUT_HANDLE
            invoke WriteConsoleA, eax, _string, _string.len, _temp, 0 ; 1 2 3 4 5 6
            invoke ExitProcess, 0
        
        _temp dd 0
        _string db '1,2,3,4,5,6',0
        _string.len = $ - _string - 1
        _from db ','
        _to db ' '
        
        data import
         library kernel32,'KERNEL32.DLL'
         import kernel32,\
                GetStdHandle, 'GetStdHandle',\
                WriteConsoleA, 'WriteConsoleA',\
                ExitProcess,'ExitProcess'
        end data
        Ответить
        • Кстати, в исходниках фасма GetStdHandle зовется при каждом выводе строки. Это зачем? Почему бы просто один раз не вызвать при старте и просто схоронить хендл?
          Ответить
          • Это довольно дшевая вжопурация, можливо и вовсе мокрос
            Ответить
            • > довольно дшевая вжопурация
              ВЫзов функции из длл, дешевле чем просто прочитать значение из переменной?

              > мокрос
              Сам фасм написан в хардкорном стиле, как у госта выше.
              Ответить
              • не дешевле, но ты же знаешь про 80/20?
                Ответить
                • Закон Парето шоль. В ассемблерных программах немного другие законы, но сейчас я понял в чем дело этот инвок занимает 11 бат, а сохранение хендла 5 байт и доставание его из переменной тоже 5 байтй + 4 байта на пельменную, итого на14 батй больше кожа получатеся.
                  Ответить
                  • хендыл под капотом кстати это DWORD
                    но это как-бы секрет
                    Ответить
                    • > это DWORD
                      Я знаю:
                      >> 4 байта на пельменную

                      >> сохранение хендла 5 байт
                      Я имел ввиду инструкцию mov [output_handle], eax
                      Ответить
        • Я хуйню у госта скопипастил:
          format PE console
          entry start
          
          include 'win32ax.inc'
          
          start:
              mov ecx, _string.len
              mov esi, _string
              mov bl, [_to]
              mov bh, [_from]
          loopa:
              lodsb
              cmp al, bh
              jne skip
              mov [esi - 1], bl
          skip:
              loop loopa
          
              invoke GetStdHandle, STD_OUTPUT_HANDLE
              invoke WriteConsoleA, eax, _string, _string.len, _temp, 0 ; 1 2 3 4 5 6
              invoke ExitProcess, 0
          
          _temp dd 0
          _string db '1,2,3,4,5,6'
          _string.len = $ - _string
          _from db ','
          _to db ' '
          
          data import
           library kernel32,'KERNEL32.DLL'
           import kernel32,\
                  GetStdHandle, 'GetStdHandle',\
                  WriteConsoleA, 'WriteConsoleA',\
                  ExitProcess,'ExitProcess'
          end data
          Ответить
          • format PE console
            entry start
            
            include 'win32ax.inc'
            
            start:
                mov ecx, _string.len
                mov edx, ecx
                mov edi, _string
                mov eax, 0x202c
            loopa:
                scasb
                jne skip
                mov [edi - 1], ah
            skip:
                loop loopa
            
                invoke GetStdHandle, STD_OUTPUT_HANDLE
                invoke WriteConsoleA, eax, _string, edx, start, ecx ; 1 2 3 4 5 6
                invoke ExitProcess, 0
            
            _string db '1,2,3,4,5,6'
            _string.len = $ - _string
            
            data import
             library kernel32,'KERNEL32.DLL'
             import kernel32,\
                    GetStdHandle, 'GetStdHandle',\
                    WriteConsoleA, 'WriteConsoleA',\
                    ExitProcess, 'ExitProcess'
            end data
            Ответить
          • Вообще конечно работа через API это попса голимая

            Настоящий асемблист должен как минимум дергать сиськолы
            А как максимум написить свой драйвер который замапил бы видепамять и писить туда
            Ответить
            • Я в "виндовс" не знаю, поэтому:
              format ELF executable
              
              _start:
                  mov ecx, _string.len
                  mov edx, ecx
                  mov edi, _string
                  mov eax, 0x202c
              loopa:
                  scasb
                  jne skip
                  mov [edi - 1], ah
              skip:
                  loop loopa
              
                  mov eax, 4
                  mov ebx, 1
                  mov ecx, _string
                  int 0x80
                  mov eax, 1
                  xor ebx, ebx
                  int 0x80
              
              _string db '1,2,3,4,5,6'
              _string.len = $ - _string
              Или:
              org 0x100
              start:
                  mov cx, _string.len
                  mov di, _string
                  mov dx, di
                  mov ax, 0x202c
              loopa:
                  scasb
                  jne skip
                  mov [di - 1], ah
              skip:
                  loop loopa
              
                  mov ah, 9
                  int 0x21
                  ret
              
              _string db '1,2,3,4,5,6$'
              _string.len = $ - _string
              Ответить
              • > int 0x21
                соснеш же в длином режиме
                Ответить
              • >> format ELF executable

                >> format PE console

                Прямо Turbo Quick OPTASM какой-то.
                Ответить
                  • Очередной комбайн копулятора с линкером же. Вроде ничего срашного, но приводит к проприетарным форматам объектов.
                    Ответить
                    • В фасме нет линкера, просто он умеет сразу высерать исполняемые файлы. Если модули копулировать отдельно понадобится какой-нибудь сторонний линкер.
                      Ответить
                      • >> высерать исполняемые файлы
                        >>
                        Это и есть работа линкера. Именно ему ты пишешь какой формат желаешь получить и с каким флагами.
                        Ответить
                        • Линькер должен уметь межмодульные связи редактировать, fasm этим не занимается.
                          Ответить
            • В Венде стабильно работать через сисколлы не получится: они чуть ли не в каждой мажорной версии меняются (https://j00ru.vexillium.org/syscalls/nt/64/). А так — просто посмотреть номер сисколла и дёрнуть NtWriteFile.
              Ответить
                • Потому что отваливаться после каждого обновления — не комильфо.
                  Ответить
              • А, я ещё совсем забыл, что в Венде хендл консоли — не обычный файл-хендл, а неведомая ебанина, которая обрабатывается в недрах kernelbase!ConsoleCallServerGeneric и зовёт NtDeviceIoControlFile.
                Ответить
                • так-то в прыщах терминал это тоже нифига не дескриптор
                  так что всё ок
                  Ответить
                  • В прыщах можно просто write во второй дескриптор сделать, а в венде NtWriteFile() в хендл стандартного вывода не сработает (если память не изменяет, конечно). Не то чтобы это было недостатком венды, да…
                    Ответить
                    • Товарищ, Вы мне баки формозолите!
                      HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
                      DWORD a;
                      WriteFile(h, "123", 3, &a, NULL);

                      выведет
                      123

                      проверь
                      Ответить
                      • Хм, и правда. То ли микрософты успели изменить, то ли на форуме напиздели. Правда, звать надо NtWriteFile, но сути это не меняет.

                        Сейчас проверю на асме...
                        Ответить
                        • Я могу представить, что там стоит говнокастыль и WriteFile заворачивает в писиние в консоль через ioctl або другой какой сискол
                          Ответить
                          • Проверил, WriteFile безусловно зовёт NtWriteFile.

                            В итоге на x64 десяточке можно вот так:
                            format PE64 console
                            use64;
                            
                            section '.text' code readable executable
                            start:
                                mov rax, 0x8                             ; NtWriteFile
                                mov rcx, [gs:0x60]
                                mov rcx, [ds:rcx + 0x20]
                                mov rcx, [ds:rcx + 0x28]                 ; FileHandle
                                mov r10, rcx
                                mov rdx, 0                               ; Event
                                mov r8, 0                                ; ApcRoutine
                                mov r9, 0                                ; ApcContext
                                mov qword [rsp + 0x28], _statusBlock     ; IoStatusBlock
                                mov qword [rsp + 0x30], _string          ; Buffer
                                mov qword [rsp + 0x38], _string.len      ; Length
                                mov qword [rsp + 0x40], 0                ; ByteOffset
                                mov qword [rsp + 0x48], 0                ; Key
                                syscall
                            
                                mov rax, 0x2c                            ; NtTerminateProcess
                                mov rcx, -1
                                mov r10, rcx                             ; ProcessHandle
                                mov rdx, 0                               ; ExitStatus
                                syscall
                            
                            section '.data' data readable writeable
                                _string db "Hello World"
                                _string.len = $ - _string
                                _statusBlock db 16 dup(0)
                            Ответить
                            • А вот чего я понять не могу — так это почему «.text»? Почему не «.code»?!
                              Ответить
                        • Вот поэтому надо
                          DdCreateSurface(DDSCAPS_PRIMARYSURFACE | DDSCAPS_LOCALVIDMEM, ...
                          и туда уже выводить, а то ишь, к сахарку пристрастились!
                          Ответить
  • Factor:
    USING: locals prettyprint regexp ;
    
    [let "1,2,3,4,5,6" :> str
        str R/ ,/ " " re-replace .
    ]
    Ответить
  • ВПЕРЕД
    : EACH-CHAR  ( c-addr u xt -- )
        >R
        BEGIN
            ?DUP
        WHILE
            SWAP DUP C@ R@ EXECUTE
            OVER C!
            SWAP 1 /STRING
        REPEAT
        DROP R> DROP ;
    
    : COMMA>SPACE  ( c1 -- c2 )
        DUP [CHAR] , = IF DROP BL THEN ;
    
    : COMMAS>SPACES  ( c-addr u -- )
        ['] COMMA>SPACE EACH-CHAR ;
    
    2VARIABLE STR
    S" 1,2,3,4,5,6" STR 2!
    STR 2@ COMMAS>SPACES
    STR 2@ TYPE
    
    BYE
    Ответить
    • Можно еще сделать чтобы вместо вызова цикла с коллбеком компилировался простой цикл:
      : WITH-EACH-CHAR  ( xt -- )
          S" BEGIN ?DUP WHILE SWAP DUP C@" EVALUATE
          ' COMPILE,
          S" OVER C! SWAP 1 /STRING REPEAT DROP" EVALUATE ; IMMEDIATE COMPILE-ONLY
      
      : COMMA>SPACE  ( c1 -- c2 )
          DUP [CHAR] , = IF DROP BL THEN ;
      
      : COMMAS>SPACES  ( c-addr u -- )
          WITH-EACH-CHAR COMMA>SPACE ;
      
      2VARIABLE STR
      S" 1,2,3,4,5,6" STR 2!
      STR 2@ COMMAS>SPACES
      STR 2@ TYPE
      
      CR SEE COMMAS>SPACES
      
      BYE
      SEE - это декомпилятор

      http://ideone.com/Dy0Tyo
      Ответить
      • Я наложал, буфер для S" вне определений временный, и в SP-Forth уже не ра, и алгоритм хуевый, слишком много телодвижений со стеком, еще SP-Forth почему-то не инлайнит ?DUP.

        Для SP-Forth так:
        LIB/INCLUDE/ANSI.F
        LIB/EXT/DISASM.F
        
        : WITH-EACH-CHAR  ( xt -- )
            S" BEGIN DUP WHILE OVER DUP C@" EVALUATE
            ' COMPILE,
            S" SWAP C! 1 /STRING REPEAT 2DROP" EVALUATE ; IMMEDIATE
        
        : COMMA>SPACE  ( c1 -- c2 )
            DUP [CHAR] , = IF DROP BL THEN ;
        
        : COMMAS>SPACES  ( c-addr u -- )
            WITH-EACH-CHAR COMMA>SPACE ;
        
        2VARIABLE STR
        S" 1,2,3,4,5,6" HERE -ROT TUCK S, STR 2!
        STR 2@ COMMAS>SPACES
        STR 2@ TYPE
        
        BYE
        Дизасм:
        SEE COMMAS>SPACES
        
        573C53 90               XCHG     EAX, EAX
        573C54 0BC0             OR      EAX , EAX
        573C56 0F8438000000     JE      573C94  ( COMMAS>SPACES+41  )
        573C5C 8945FC           MOV     FC [EBP] , EAX
        573C5F 8B4500           MOV     EAX , 0 [EBP]
        573C62 8945F8           MOV     F8 [EBP] , EAX
        573C65 0FB600           MOVZX   EAX , BYTE PTR [EAX]
        573C68 8D6DF8           LEA     EBP , F8 [EBP]
        573C6B E8BBFFFFFF       CALL    573C2B  ( COMMA>SPACE )
        573C70 8BD0             MOV     EDX , EAX
        573C72 8B4500           MOV     EAX , 0 [EBP]
        573C75 8810             MOV     [EAX] , DL
        573C77 B801000000       MOV     EAX , # 1
        573C7C B9FFFFFFFF       MOV     ECX , # FFFFFFFF
        573C81 034D04           ADD     ECX , 4 [EBP]
        573C84 8B5508           MOV     EDX , 8 [EBP]
        573C87 8D0402           LEA     EAX , [EDX] [EAX]
        573C8A 894508           MOV     8 [EBP] , EAX
        573C8D 8BC1             MOV     EAX , ECX
        573C8F 8D6D08           LEA     EBP , 8 [EBP]
        573C92 EBC0             JMP     573C54
        573C94 8B4504           MOV     EAX , 4 [EBP]
        573C97 8D6D08           LEA     EBP , 8 [EBP]
        573C9A C3               RET     NEAR
        END-CODE   Ok
        Ответить
    • Enterprise 2003
      String line = "1,2,3";
      Repository repository = Repository.getInstance();
      ReplaceStrategyFabric rsb = repository.getOrCreate(Replacer.class);
      if (rsb == null) {
        throw new InvalidConfigurationExeption("Can't obtain strategy");
      }
      try {
       Replacer replacer = rsb.createReplacer(true, false, ReplacerTypes.DEFAULT);
       return replacer.replace(line, ",", " ", ReplacerFlags.ALL); 
      } catch (NotSuchReplacerException e) {
         LoggerFactory.getInsatnce().createLogger("replacer").warn("Failed to create replacer", e);
      }
      return null;
      Ответить
        • <?php
          $line = '1,2,3';
          $repository = Repository::getInstance();
          $rsb = $repository->getOrCreate('Replacer');
          if ($rsb == null) {
            throw new InvalidConfigurationExeption("Can't obtain strategy");
          }
          try {
           $replacer = $rsb->createReplacer(true, false, ReplacerTypes::DEFAULT);
           return $replacer->replace($line, ',', ' ', ReplacerFlags::ALL); 
          } catch ($e) {
             LoggerFactory::getInsatnce()->createLogger('replacer')->warn('Failed to create replacer', $e);
          }
          return null;
          Ответить
          • > ($rsb == null)
            "PHP" не прощает таких ошибок. Именно поэтому я за "РНР".
            Ответить
  • #include <stdio.h>
    
    int main(void)
    {
        char str[] = "1,2,3,4,5,6";
        char res[] = "           ";
        sscanf(str, "%c,%c,%c,%c,%c,%c", res, res + 2, res + 4, res + 6, res + 8,
            res + 10);
        puts(res);
        return 0;
    }
    Ответить
  • PostgreSQL
    select replace('1,2,3,4', ',', ' ');
    Ответить
  • % Проложил
    
    :- set_prolog_flag(verbose,silent).
    :- prompt(_, '').
    :- use_module(library(readutil)).
    :- set_prolog_flag(double_quotes, chars).
    :- use_module(library(double_quotes)).
    
    sub(String, From, To, Result) :-
        append([Start, From, End], String),
        append([Start, To, End], Result).
    
    gsub(String, From, To, Result) :-
        (    append([Front, From, Back], String)
        ->   append([Front, To, Back], _),
             gsub(Back, From, To, Re),
             append([Front, To, Re], Result)
        ;    Result = String
        ).
    
    main :- 
        Str = "1,2,3,4,5,6",
        sub(Str, ",", " ", Rez),
        gsub(Str, ",", " ", Rez2),
        print(Rez), % 1 2,3,4,5,6
        print(Rez2), % 1 2 3 4 5 6
        halt.
    
    :- main.
    Ответить
  • ; LISP
    (defun gsub (str cfrom cto)
       (prog ((res "") (c ""))
         (loop for i from 0 to (- (length str) 1) do 
          (setq c (subseq str i (+ i 1)))
          (setq res (concatenate 'string res (if (string= c cfrom) cto c)))
       )
       (return-from gsub res)
    ))
    (write-line (gsub "1,2,3,4,5,6" "," " ")) ; 1 2 3 4 5 6
    Ответить
    • Какая императивщина )))

      (defun gsub (str cfrom cto)
         (map 'string (lambda (x) (if (char= x cfrom) cto x)) str))
      
      (write-line (gsub "1,2,3,4,5,6" #\, #\Space)) ; 1 2 3 4 5 6
      Ответить
        • (defun gsub (str cfrom cto)
             (prog ((c "") (len (length cfrom)))
               (loop for i from len to (length str) do 
                (setq c (subseq str (- i len) i))
                (if (string= c cfrom) (return-from gsub (concatenate 'string
                   (subseq str 0 (- i len))
                   cto
                   (gsub (subseq str i) cfrom cto)
                )))
             )
             (return-from gsub str)
          ))
          (write-line (gsub "kokoi bagor )))" "ko" "koko"))
          Ответить
  • Кстати, чтобы не профайлить, что будет быстрее:
    1) Заполнить структуру нулями, потом установить нужные поля
    2) Установить поля, остальные поля обнулить
    Вангую, что уже много лет как выигрыш от байтоебства будет околонулевой
    Ответить
    • Могу предположить, что обнуление всей структуры будет векторизовано, так что разницы практически не будет.
      Ответить
        • Это я туплю, не обращай внимания. Но разницы, конечно, видно не будет.
          Ответить
          • В 'PHP' ничего из этого нет. Главное, кавычки использовать одинарные, а не двойные. Именно поэтому я за 'PHP'.
            Ответить
            • еще важно вместо ereg использовать preg
              Ответить
                • Еще говорят, надо вконце таг не закрывать чтобы мусор случайно не попал

                  <?
                  echo "хуй";


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

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

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

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


    8