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

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 27 Августа 2019

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

    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Что ты, регулярки слижком устарели для современных функциональных js-ников
        const str = "1,2,3,4,5,6"
          console.log(str.split(',').join(' ')) //1 2 3 4 5 6
        Ответить
        • Функциональный Js ? Это как оопшная пыха ?
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • Лоооол
            Ответить
          • показать все, что скрытоvanished
            Ответить
          • >создавая в куче строку.
            Ну расскажи как в js(и во всех остальных языках с иммутабельными строками) сделать это inplace
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Для «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
              )
              Ответить
            • показать все, что скрытоvanished
              Ответить
            • npm install string-replace-all
              import stringReplaceAll from 'string-replace-all';
               
              stringReplaceAll ( '1,2,3,4,5,6', ',' ,' ');
              Ответить
        • показать все, что скрытоvanished
          Ответить
    • // C
        const char* str = "1,2,3,4,5,6";
        puts(str); // 1,2,3,4,5,6
      Ответить
      • {
            char *i = str;
            char *end = str + strlen(str);
            for(; i != end; ++char) if (*i == ',') {
                *i = ' ';
            }
        }
        Именно поэтому я за (char[]){'C'};
        Ответить
    • (',';' ') stringreplace '1,2,3,4,5,6'
      1 2 3 4 5 6
      Ответить
      • Для подстрок длиной один символ можно так:
        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].
      Гораздо хуже, что остальные языки по умолчанию производят замену во всей строке.
      Ответить
    • Забавно, что в S" Forth" до сих пор не стандартизированы слова для замены подсторки в строке, в стандарте 2012 года введены ' REPLACES и ' SUBSTITUTE , но они работают только для замены %вот-таких-вот% %шаблонов%, например S" замена" S" имя" REPLACES определяет новый шаблон, S" строка" БУФЕР ДЛИНА-БУФЕРА SUBSTITUTE осуществляет замену и записывет результат в буфер.

      НУ ЕБАНУТЫЕ.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • По этому я за lua
      print(("1,2,3,4,5,6"):gsub(","," "))
        --1 2 3 4 5 6	 	5
      Ответить
      • А я за другой язык на 3 буквы:
        BEGIN {
            str = "0,1,2,3,4,5,6"
            gsub(",", " ", str)
            print str
        }
        Ответить
    • Именно поэтому я за «Perl».
      print("1,2,3,4,5,6" =~ s,\,, ,gr);  # 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'>()).
            Ответить
    • «Powershell»:
      PS C:\> '1,2,3,4,5,6' -replace ',', ' '
      1 2 3 4 5 6
      Ответить
    • «Batch»:
      @ECHO OFF
      SET "string=1,2,3,4,5,6"
      ECHO %string:,= % 
      REM 1 2 3 4 5 6
      Ответить
    • «Ruby»:
      puts '1,2,3,4,5,6'.gsub(',', ' ')  # 1 2 3 4 5 6
      Ответить
    • «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"


      Я не настоящий хаскеллист, а «Хаскелль» на ГК нашёл!
      Ответить
    • "sh"
      echo 1,2,3,4,5,6 | tr , ' '
      Ответить
    • 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 { s = "1,2,3,4,5,6"; gsub(",", " ", s); print s }
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • «Rust»:
      fn main() {
          println!("{}", "1,2,3,4,5,6".replace(",", " "));  // 1 2 3 4 5 6
      }
      Ответить
    • # R
        str = "1,2,3,4,5,6"
        cat(gsub(",", " ", str)) # 1 2 3 4 5 6
      Ответить
    • Perl 6:
      say S:g/\,/ / with "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 "," " "
      Ответить
    • «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
      Ответить
      • показать все, что скрытоvanished
        Ответить
      • > 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
        Ответить
        • показать все, что скрытоvanished
          Ответить
        • А почему не через lodsb?
          Ответить
        • 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 зовется при каждом выводе строки. Это зачем? Почему бы просто один раз не вызвать при старте и просто схоронить хендл?
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • > довольно дшевая вжопурация
                ВЫзов функции из длл, дешевле чем просто прочитать значение из переменной?

                > мокрос
                Сам фасм написан в хардкорном стиле, как у госта выше.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Закон Парето шоль. В ассемблерных программах немного другие законы, но сейчас я понял в чем дело этот инвок занимает 11 бат, а сохранение хендла 5 байт и доставание его из переменной тоже 5 байтй + 4 байта на пельменную, итого на14 батй больше кожа получатеся.
                    Ответить
          • Я хуйню у госта скопипастил:
            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
              Ответить
            • показать все, что скрытоvanished
              Ответить
              • Я в "виндовс" не знаю, поэтому:
                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
                Ответить
              • В Венде стабильно работать через сисколлы не получится: они чуть ли не в каждой мажорной версии меняются (https://j00ru.vexillium.org/syscalls/nt/64/). А так — просто посмотреть номер сисколла и дёрнуть NtWriteFile.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Потому что отваливаться после каждого обновления — не комильфо.
                    Ответить
                • А, я ещё совсем забыл, что в Венде хендл консоли — не обычный файл-хендл, а неведомая ебанина, которая обрабатывается в недрах kernelbase!ConsoleCallServerGeneric и зовёт NtDeviceIoControlFile.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • В прыщах можно просто write во второй дескриптор сделать, а в венде NtWriteFile() в хендл стандартного вывода не сработает (если память не изменяет, конечно). Не то чтобы это было недостатком венды, да…
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • Хм, и правда. То ли микрософты успели изменить, то ли на форуме напиздели. Правда, звать надо NtWriteFile, но сути это не меняет.

                          Сейчас проверю на асме...
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • Проверил, 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»?!
                                Ответить
                          • показать все, что скрытоvanished
                            Ответить
          • @ format PE console

            -1
            Ответить
    • Factor:
      USING: locals prettyprint regexp ;
      
      [let "1,2,3,4,5,6" :> str
          str R/ ,/ " " re-replace .
      ]
      Ответить
    • "D"
      const(char)[] s = "1,2,3,4,5,6";
      writeln(s.tr(",", " "));
      Ответить
    • ВПЕРЕД
      : 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
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • enterprise
      fetch('https://super-secure-server/string?=1,2,3,4,5,6')
      .then((response) => response.json())
      .then((jsonData) => reduxStoreAction(jsonData))
      Ответить
    • #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;
      }
      Ответить
    • OdinAss
      сообщить(стрзаменить("1,2,3,4,5,6",","," ")); //1 2 3 4 5 6
      Ответить
    • MySQL Real Replace String
      SELECT REPLACE('1,2,3,4,5,6', ',', ' ');
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • % Проложил
      
      :- 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"))
            Ответить
    • Острологи объявили неделю осСемблера.
      Ответить
    • Tcl
      set str 1,2,3,4,5,6
      puts [regsub -all , $str " "]
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • А теперь, товарищи, всё тоже самое на тех же языках, только для замены исключительно первого вхождения.
      Ответить

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