21

Re: Кодофлуд, або флудокод

koala написав:
/KIT\ написав:

>у більшості діалектів він, очевидно, буде невалідним
Чому? Це ж просто поліморфний код.

Обфускований. Поліморфний має поліморфувати, тобто змінювати себе, часто задля обфускації.
Ну і треба дивитися. Мені теж здається, що більшість байткод-компіляторів таке не прожують, хоча звичайний інтерпретатор має виконати.

Компілятори (у т.ч., байткод-) не тягнуть. Та й у чистого інтерпритатора можуть бути труднощі, коли треба знайти next, що відповідає даному for — якщо не одразу перед циклом, то при його завершенні. Усе залежать від конкретної реалізації for: чи шукається відповідний йому next одразу шляхом аналізу наступних рядків коду (помилка має вискочити при вході в цикл), чи відбувається цей пошук по завершенні (помилка має виникнути при завершенні), чи місце next запам'ятовується,  коли інтерпритатор до нього доходить (тоді виникає помилка, якщо for шукається в коді, і помилки не виникає, якщо місце for також попередньо запам'ятовується). Схоже, ChipmunkBASIC робить останнє, хоча в випадку

50 for i = 1 to 0

виникає помилка (оскільки next шукається в наступних рядках і не знаходиться).

Ще з цієї ж серії:

10 for i = 1 to 5
20 for j = 1 to 5
30 print i,j
40 goto 60
50 next
60 next
70 print "done"

ChipmunkBASIC:

>run
1       1
1       2
1       3
1       4
1       5
done

Очевидно, другий next обробляється як next внутрішнього циклу. Коли він завершується, а замість ще одного next програма доходить до кінця, помилки це не викликає.

Компіляторні BASIC'и обробляють другий next як зовнішній:

C:\Users\py\Desktop\try>yabasic forinfor.bas
1 1
2 1
3 1
4 1
5 1
done

04.06.2019 20:47:32,44
C:\Users\py\Desktop\try>fbc -lang qb forinfor.bas

04.06.2019 20:48:03,34
C:\Users\py\Desktop\try>forinfor
 1             1
 2             1
 3             1
 4             1
 5             1
done

22

Re: Кодофлуд, або флудокод

04.06.2019 20:48:08,68
C:\Users\py\Desktop\try>chipmunk basic
Chipmunk BASIC v3.6.5(b6)
10 goto 30
20 for i = 1 to 3
30 print i
40 next i
50 print "done"
>run
0
 NEXT without FOR  in line 40
>save "intofor3.bas
>bye

04.06.2019 21:06:50,56
C:\Users\py\Desktop\try>fbc -lang qb intofor3.bas

04.06.2019 21:07:08,82
C:\Users\py\Desktop\try>intofor3
 0
 1
 2
 3
done

04.06.2019 21:07:16,19
C:\Users\py\Desktop\try>yabasic intofor3.bas
0
1
2
3
done

23 Востаннє редагувалося P.Y. (09.06.2019 22:32:37)

Re: Кодофлуд, або флудокод

'драконова ламана
input n
'генерацiя послiдовностi згинiв (rl):
a$=""
for j=1 to n
    a$=a$+"l"
    for i=len(a$)-1 to 1 step -1
        if mid$(a$,i,1)="r" then a$=a$+"l" else a$=a$+"r"
    next i
next j
'?a$
'побудова ламаної в текстовому рядку з символiв псевдографiки:
'    _
' (_/ \_)

'  замiнити вiдносний поворот (rl) абсолютним напрямком (UDRL):
a$="R"+a$
directions$="RrD DrL LrU UrR RlU UlL LlD DlR"
for i=2 to len(a$)
    mid$(a$,i,1)=mid$(directions$, instr(directions$, mid$(a$,i-1,2))+2, 1)
next
'?a$
vert$="|RU |RD |LU |LD /RUR /LDL \RDR \LUL (LUR (LDR )RDL )RUL"

b$=" "+chr$(10)
h=1
w=1
row=0
col=0

for j=1 to len(a$)-1 step 2
    m$=mid$(a$, j, 3)
    v$=mid$(vert$, instr(vert$, m$)-1, 1)
    mid$(b$, row*(w+1)+col+1, 1)="_"
    on instr("RL", mid$(m$,1,1)) gosub gort, golt
    if mid$(m$,2,1)="D" then gosub godn
    mid$(b$, row*(w+1)+col+1, 1)=v$
    if mid$(m$,2,1)="U" then gosub goup
    on instr("RL", mid$(m$,3,1)) gosub gort, golt
    '?b$
    '?"***
next
print b$
end
goup:
    if row>0 then row=row-1: return
    h=h+1
    b$=string$(w," ")+chr$(10)+b$
    return
godn:    
    row=row+1
    if row<h then return
    h=h+1
    b$=b$+string$(w," ")+chr$(10)
    return
gort:
    col=col+1
    if col<w then return
    lx$="": rx$=" "+chr$(10)
    goto groww
golt:
    if col>0 then col=col-1: return
    lx$=" ": rx$=chr$(10)
groww:
    res$=""
    for i=1 to len(b$)-1 step w+1
        res$=res$+lx$+mid$(b$, i, w)+rx$
    next
    b$=res$
    w=w+1
    return
приклад роботи
09.06.2019 21:23:35,27
C:\Users\py\Desktop\try>fbc -lang qb -b dragon2q.bas

09.06.2019 23:23:57,76
C:\Users\py\Desktop\try>dragon2q
? 8
                                 _       _
                               _/_)    _/_)
                              (_(_   _(_(_   _
     _   _                     _)_\_/ \_) \_/_)
    (_\_/ \_             _    (_/_\_        (_
 _   _)    _)          _/_)    _/ \_)        _)
(_\_/_                (_(_   _(_          |_/
  \_/_)                _)_\_/_\_)_
    (_   _       _    (_/_\_(_\_/_\_
 _   _)_/_)    _/_)    _/_)_)_)_/ \_)
(_\_/_(_(_   _(_(_   _(_(_(_/_(_
  \_/ \_) \_/_)_)_\_/ \_) \_/_)_)_
            (_(_/_\_        (_(_/_\_
         _   _)_/ \_)    _   _)_/ \_)
        (_\_/_(_        (_\_/_(_
          \_/ \_)         \_/ \_)
Подякували: /KIT\, ostap34PHP2

24

Re: Кодофлуд, або флудокод

Перевірка подільності без виконання операції ділення/модуля

#include <stdio.h>
#define BITMASK(X) ((1 << (X)) - 1)
int sumdigit(int n, int shift)
{
    int mask = BITMASK(shift);
    while(n > mask)
        n = (n & mask) + (n >> shift);
    return n;
}

int subdigit(int n, int shift)
{
    int mask = BITMASK(shift);
    while(n > mask)
        n = -(n & mask) + (n >> shift);
    return n > 0 ? n : -n;
}

int candiv(int x, int y)
{
    if(x == 0) return 1;
    if(x < 0) x = -x;
    switch(y)
    {
        case 1: return 1;
        case 2: return (x & 1) == 0;
        case 3:
            //return(sumdigit(x, 2) == 3);
            return (subdigit(x, 1) == 0);
        case 4: return (x & 3) == 0;
        case 5:
            /*switch(sumdigit(x, 4))
            {
                case 5:
                case 10:
                case 15:
                    return 1;
            }
            return 0;*/
            return subdigit(x, 2) == 0;
        case 6: return candiv(x, 2) && candiv(x, 3);
        case 7:
            return (sumdigit(x, 3) == 7);
        case 8: return (x & 7) == 0;
        case 9:
            /*switch(sumdigit(x, 6))
            {
                case 9:
                case 18:
                case 27:
                case 36:
                case 45:
                case 54:
                case 63:
                    return 1;
            }
            return 0;*/
            return (subdigit(x, 3) == 0);
        case 10: return candiv(x, 2) && candiv(x, 5);
        case 11:
            switch(subdigit(x, 5))
            {
                case 0:
                case 11:
                case 22:
                    return 1;
            }
            return 0;
        case 12: return candiv(x, 3) && candiv(x, 4);
        case 13: 
            switch(subdigit(x, 6))
            {
                case 0:
                case 13:
                case 26:
                case 39:
                case 52:
                    return 1;
            }
            return 0;
        case 14: return candiv(x, 2) && candiv(x, 7);
        case 15: return (sumdigit(x, 4) == 15);
        case 16: return (x & 15) == 0;
        case 17: return (subdigit(x, 4) == 0);
        case 18: return candiv(x, 2) && candiv(x, 9);
        case 19:
            switch(subdigit(x, 9))
            {
                case 0:     case 19:    case 38:
                case 57:    case 76:    case 95:
                case 114:   case 133:   case 152:
                case 171:   case 190:   case 209:
                case 228:   case 247:   case 266:
                case 285:   case 304:   case 323:
                case 342:   case 361:   case 380:
                case 399:   case 418:   case 437:
                case 456:   case 475:   case 494:
                    return 1;
            }
            return 0;
        case 20: return candiv(x, 4) && candiv(x, 5);
        case 21: return candiv(x, 3) && candiv(x, 7);
        case 22: return candiv(x, 2) && candiv(x, 11);
    }
    exit(1);        
}

main()
{
    #define MIN 0
    #define MAX 0xFFFF
    #define MINDIV 2
    #define MAXDIV 22
    int i, j;
    printf("Checking candiv function on range %d to %d by %d to %d...\n", MIN, MAX, MINDIV, MAXDIV);
    for (i = MIN; i <= MAX; i++)
    {
        /*if (i%100 == 0) printf("%d...\r", i);*/
        for(j = MINDIV; j <= MAXDIV; j++)
            if((i % j == 0) != candiv(i, j))
                printf("%d %% %d = %d, but candiv returns %d\n", i, j, i % j, candiv(i, j));
            else printf("%d %% %d - OK \r", i, j);
    }
    printf ("\nComplete!\n");
}

25 Востаннє редагувалося P.Y. (16.06.2019 14:20:57)

Re: Кодофлуд, або флудокод

«Єгипетські дроби». Відомо, що стародавні єгиптяни при обчисленні дробових значень користувались лише звичайними дробами з одиницею в чисельнику, а щось складніше передавали як суму з кількох таких дробів (напр., 7/10 розкладалось як 1/2 + 1/5). Програма перетворює десятковий дріб на «єгипетський». Цього разу FORTRAN :)

                                                                         @wfl386 /q %~f0
                                                                         @del "%~dpn0.obj" 
                                                                         @"%~dpn0.exe" %*
                                                                         @goto :eof
c :mode=fortran:
C Розкласти дїйсне число R на int(R)+1/s1+1/s2+...1/s[n], де s[1..n] - цїлı.
      character*11 bfr
      real R, minR
      read *, R
      minR=0.000001
      i=int(R)
      write(bfr,'(I11)')i
      print '(A, $)', bfr(11-int(log10(i+0.1)):11)
      R=R-int(R)+minR/2
      i=1
      do 10 while (R.gt.minR)
        i=i+1
        if(R.le.(1./i)) goto 10
          write(bfr,'(I11)')i
          print '('' + 1/'', A, $)', bfr(11-int(log10(i+0.1)):11)
          R=R-1./i
 10   continue
      end

P.S. отой текст управому верхньому кутку коду потрібен, щоб програму можна було покласти в батник, який автоматично компілюватиме її (в даному випадку, з допомогою Open Watcom FORTRAN 77). Правила класичного фортрану передбачають, що увесь текст після 72-ї колонки ігнорується компілятором (історично, це було потрібно для контролю порядку подачі перфокарт чи ще чогось подібного, але, в даному випадку, це дозволяє розмістити в тексті програми інструкції, які бачитиме інтерпритатор командної оболонки і не бачитиме компілятор, що досить зручно).

26

Re: Кодофлуд, або флудокод

def hexs(n):
    # 1 <=> '0x01'; -1 <=> '1xFF'
    if type(n)==str:
        n=n.upper()
        assert n[1]=='X' and n[0] in '01'
        res=0 if n[0]=='0' else -1
        for c in n[2:]:
            res=(res<<4)|'0123456789ABCDEF'.index(c)
        return res
    res=''
    even=False
    while res=='' or n not in (0, -1) or even or res[:1]<'8' and n<0:
        res='0123456789ABCDEF'[n&0xF]+res
        n=n>>4
        even=not even
    return '%cx%s'%('01'[n==-1],res)

Шістнадцяткове представлення, що більш адекватно передає від'ємні числа. Проблема: стандартний пітонівський hex() повертає від'ємне число як відповідне йому додатнє зі знаком мінус, що нівелює всю корисність шістнадцяткового представлення, адже головне призначення представлень з основою 2, 8 та 16 — показати вміст байтів та бітів (що має значення, наприклад, при здійсненні побітових операцій над ними). Оскільки Python використовує цілі числа необмеженого розміру, просто замінити від'ємне число відповідним йому беззнаковим (як це можна зробити, наприклад, у Сі) стає неможливо.
Що робить дана функція: додатні цілі числа повертаються аналогічно звичайному hex() — у вигляді 16-кового представлення з префіком 0x, тоді як від'ємні передаються подібно до відповідних їм беззнакових, але з префіксом 1x. Іншими словами, 0x або 1x символізує собою знаковий розряд, цифри після x — вміст значимих розрядів. Приклад:

>>> for i in range(-10, 10):print(i, hexs(i))
...
-10 1xF6
-9 1xF7
-8 1xF8
-7 1xF9
-6 1xFA
-5 1xFB
-4 1xFC
-3 1xFD
-2 1xFE
-1 1xFF
0 0x00
1 0x01
2 0x02
3 0x03
4 0x04
5 0x05
6 0x06
7 0x07
8 0x08
9 0x09

27

Re: Кодофлуд, або флудокод

P.Y. написав:

від'ємні ... з префіксом 1x.

...
-3 1xFD
-2 1xFE
-1 1xFF

Я раніше не бачив такого позначення. Звідки воно взялося (1x...) ? Де ще використовується таке позначення ?

28

Re: Кодофлуд, або флудокод

Власне, сам придумав. Про використання аналогічного формату ще десь чути не доводилось. Було б, звичайно, круто, якби його заімплементили в наступних версіях того ж python'а (там десь приймають подібні пропозиції?).

29

Re: Кодофлуд, або флудокод

Це код з яким мені тре працювати

https://image.prntscr.com/image/6tqDXhjkQ8C44EzSqWXbHg.png

або

if( empty($this->$attribute) || is_array($this->$attribute) === false || count($this->$attribute) == 0 )

30

Re: Кодофлуд, або флудокод

Що може повертати is_array(), крім true або false? Якщо тільки ці булеві значення, то стандартна практика — не порівнювати з false, а зробити «логічне ні»:

!is_array($this->$attribute)
Подякували: leofun011

31

Re: Кодофлуд, або флудокод

NagarD навів приклади чужого коду, який доводиться переписувати.

32

Re: Кодофлуд, або флудокод

leofun01 написав:

NagarD навів приклади чужого коду, який доводиться переписувати.

У мене замість картинки з кодом відображається сторінка 403.
Якщо коду на малюнку багато, ще можна спробувати прогнати зображення через якусь розпізнавалку (напр., TesseractOCR).

33

Re: Кодофлуд, або флудокод

P.Y. написав:

замість картинки з кодом відображається сторінка 403.

Перезалив

NagarD написав:

https://i.ibb.co/bbzXgx5/post128097.png

Подякували: P.Y.1

34

Re: Кодофлуд, або флудокод

leofun01 написав:

NagarD навів приклади чужого коду, який доводиться переписувати.

Переписувати в сенсі рефакторингу?
Чи, може, надсилають код у вигляді таких скріншотів з IDE зі згорнутими блоками коду і просять зробити, щоб усе працювало?  *JOKINGLY*

35 Востаннє редагувалося P.Y. (17.08.2019 00:07:38)

Re: Кодофлуд, або флудокод

Альтернативний годинник-календар для 360-денного року.
Кожен рік (тривалість якого постійна й дорівнює тропічному року) умовно розділено на 360 календарних діб (кожна з яких дорівнює середньому періоду зміщення Сонця на 1° по екліптиці й триває дещо довше, ніж стандартні 24 години, тому початок календарної доби зсувається відносно світлового дня та ночі).
Дні групуються в місяці, кожен по 30 таких діб.

Годинник зроблено в 3 варіантах:
1) довга доба поділяється на 24 довгі години по 60 довгих хвилин по 60 довгих секунд.
2) використано звичайні години, хвилини й секунди — календарна доба триває 24 години й майже 21 хвилину.
3) довгі години й хвилини, як у 1 варіанті, але звичайні секунди (яких у довгій хвилині трохи більше 60).

<span id=clock>15.08.2019 12:34:56</span><br>
<span id=clocknormhour>15.08.2019 12:34:56</span><br>
<span id=clocknormsec>15.08.2019 12:34:56</span><br>
<script>
function nn(x)
    {
    return x<10? '0'+x: ''+x;
    }
function time360(ms)
    {
    ms360=ms*360/365.24220;
    s360=Math.floor(ms360/1000);
    m360=Math.floor(s360/60);   s360%=60;
    h360=Math.floor(m360/60);   m360%=60;
    D360=Math.floor(h360/24);   h360%=24;
    M360=Math.floor(D360/30);   D360=D360%30 + 1;
    Y360=Math.floor(M360/12);   M360=M360%12 + 1;
    Y360+=1970;
    return D360+'.'+M360+'.'+Y360+' '+nn(h360)+":"+nn(m360)+":"+nn(s360);
    }
function time360normhour(ms)
    {
    D360length=24*3600000*365.24220/360;
    D360=Math.floor(ms/D360length);   
    M360=Math.floor(D360/30);   D360=D360%30 + 1;
    Y360=Math.floor(M360/12);   M360=M360%12 + 1;
    Y360+=1970;
    
    ms%=D360length;
    s=Math.floor(ms/1000);
    m=Math.floor(s/60);   s%=60;
    h=Math.floor(m/60);   m%=60;
    h%=24;
    return D360+'.'+M360+'.'+Y360+' '+nn(h)+":"+nn(m)+":"+nn(s);
    }
function time360normsec(ms)
    {
    m360length=60000*365.24220/360;
    s=Math.floor(ms%m360length/1000);
    m360=Math.floor(ms/m360length); 
    h360=Math.floor(m360/60);   m360%=60;
    D360=Math.floor(h360/24);   h360%=24;
    M360=Math.floor(D360/30);   D360=D360%30 + 1;
    Y360=Math.floor(M360/12);   M360=M360%12 + 1;
    Y360+=1970;
    return D360+'.'+M360+'.'+Y360+' '+nn(h360)+":"+nn(m360)+":"+nn(s);
    }
clock=document.getElementById('clock');
setInterval(function()
    {
    clock.innerText=time360(new Date().getTime());
    }, 365242.20/360);
    
clocknormhour=document.getElementById('clocknormhour');
setInterval(function()
    {
    clocknormhour.innerText=time360normhour(new Date().getTime());
    }, 1000);
    
clocknormsec=document.getElementById('clocknormsec');
setInterval(function()
    {
    clocknormsec.innerText=time360normsec(new Date().getTime());
    }, 1000);
</script>

36 Востаннє редагувалося leofun01 (17.08.2019 08:16:23)

Re: Кодофлуд, або флудокод

P.Y. написав:
<script>
function nn(x)
    {
    return x<10? '0'+x: ''+x;
    }
// ...
</script>

В JavaScript'і функції прийнято писати в іншому стилі

<script>
    function nn(x) {
        return x<10 ? '0'+x : ''+x;
    }
    // ...
</script>

37

Re: Кодофлуд, або флудокод

Права дужка ліворуч, ліва дужка праворуч? Найгірша конвенція з усіх можливих, єдина об'єктивна причина для просування якої — авторитет автора мови Сі, що використав її раніше за інші. В самому сішному/сіплюсплюсному середовищі її відтіснили більш прогресивні варіанти розміщення дужок, а от джавісти й джаваскриптники чогось за неї ухопились...

У будь-якому разі, використання вайтсмітсівських дужок замість рітчівських на роботу програми не впливає (крім, можливо, якихось дуже екзотичних випадків, пов'язаних з неявною «;» в JS, які мені досі не траплялися).

38

Re: Кодофлуд, або флудокод

Љубју таке збочење:

<script>
  function nn(x)
  {
    return x < 10
      ? '0' + x
      : '' + x
      ;
  }
  // ...
</script>
Подякували: P.Y.1

39

Re: Кодофлуд, або флудокод

dot написав:

Љубју таке збочење:

<script>
  function nn(x)
  {
    return x < 10
      ? '0' + x
      : '' + x
      ;
  }
  // ...
</script>

А тепер вставте цей код в документ і викличте цю функцію. Результат буде не таким як ви очікуєте, бо JavaScript'овий інтерпретатор сам доставить ; (крапку з комою).

40 Востаннє редагувалося dot (17.08.2019 16:55:41)

Re: Кодофлуд, або флудокод

Не знају, спробував і отримав очікуване.

Подякували: leofun011