История изменений
Исправление aureliano15, (текущая версия) :
Ни одной реальной метки не использовано, только виртуальные
Так в коде ни реальных, ни виртуальных меток нема.
а уж как читаемость и лаконичность возросли!
Вот и я говорю, что если хочешь написать хитрый алгоритм, в котором чёрт ногу сломит, и никакой враг не разберётся, необязательно писать так:
/**
* Программа putrndgoto использует суперслучайный и суперхитрый алгоритм
* с метками для генерации суперслучайного пароля. Используйте её для
* генерации надёжных паролей!
*
* Compile: gcc -o putrndgoto putrndgoto.c
* Call: ./putrndgoto
*
* Author: aureliano15
* License: GPL v.3.
* Copyleft (Ɔ) 2018.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
goto l13;
l01: d6-=54; goto l04;
l02: ++d3; goto l17;
l03: putchar(n); goto l19;
l04: d7+=54; goto l12;
l05: n--; goto l09;
l06: d6-=d7-d6; goto l10;
l07: n &= 203331; goto l15;
l08: ++d2; goto l02;
l09: n >>= 2; goto l03;
l10: if(d4) goto l16; goto l12;
l11: ++d4; goto l08;
l12: if(d2) goto l11; goto l08;
l13: n |= 175684; goto l07;
l14: d1=(d1-d2)/d3-d4+d5+d6+d7; goto l06;
l15: n += 202755; goto l21;
l16: d5+=5; goto l01;
l17: n+=d1; goto l03;
l18: d5-=5; goto l20;
l19: if(d1<0) goto l18; goto l14;
l20: return (n&d5)-d5;
l21: n /= 2; goto l05;
}
А можно так:
/**
* Программа putrnd использует суперслучайный алгоритм для генерации
* суперслучайного пароля. Используйте её для генерации надёжных паролей!
*
* Compile: gcc -o putrnd putrnd.c
* Call: ./putrnd
*
* Author: aureliano15
* License: GPL v.3.
* Copyleft (Ɔ) 2018.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
n |= 175684;
n &= 203331;
n += 202755;
n /= 2;
n--;
n >>= 2;
while(putchar(n) && d1>=0)
{
d1=(d1-d2)/d3-d4+d5+d6+d7;
d6-=d7-d6;
if(d4)
{
d5+=5;
d6-=54;
d7+=54;
}
if(d2)
++d4;
++d2;
++d3;
n+=d1;
}
d5-=5;
return (n&d5)-d5;
}
Главное — правильно подобрать коэффициенты. :-)
Исходная версия aureliano15, :
Ни одной реальной метки не использовано, только виртуальные
Так в коде ни реальных, ни виртуальных меток нема.
а уж как читаемость и лаконичность возросли!
Вот и я говорю, что если хочешь написать хитрый алгоритм, в котором чёрт ногу сломит и никакой враг не разберётся, необязательно писать так:
/**
* Программа putrndgoto использует суперслучайный и суперхитрый алгоритм
* с метками для генерации суперслучайного пароля. Используйте её для
* генерации надёжных паролей!
*
* Compile: gcc -o putrndgoto putrndgoto.c
* Call: ./putrndgoto
*
* Author: aureliano15
* License: GPL v.3.
* Copyleft (Ɔ) 2018.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
goto l13;
l01: d6-=54; goto l04;
l02: ++d3; goto l17;
l03: putchar(n); goto l19;
l04: d7+=54; goto l12;
l05: n--; goto l09;
l06: d6-=d7-d6; goto l10;
l07: n &= 203331; goto l15;
l08: ++d2; goto l02;
l09: n >>= 2; goto l03;
l10: if(d4) goto l16; goto l12;
l11: ++d4; goto l08;
l12: if(d2) goto l11; goto l08;
l13: n |= 175684; goto l07;
l14: d1=(d1-d2)/d3-d4+d5+d6+d7; goto l06;
l15: n += 202755; goto l21;
l16: d5+=5; goto l01;
l17: n+=d1; goto l03;
l18: d5-=5; goto l20;
l19: if(d1<0) goto l18; goto l14;
l20: return (n&d5)-d5;
l21: n /= 2; goto l05;
}
А можно так:
/**
* Программа putrnd использует суперслучайный алгоритм для генерации
* суперслучайного пароля. Используйте её для генерации надёжных паролей!
*
* Compile: gcc -o putrnd putrnd.c
* Call: ./putrnd
*
* Author: aureliano15
* License: GPL v.3.
* Copyleft (Ɔ) 2018.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
n |= 175684;
n &= 203331;
n += 202755;
n /= 2;
n--;
n >>= 2;
while(putchar(n) && d1>=0)
{
d1=(d1-d2)/d3-d4+d5+d6+d7;
d6-=d7-d6;
if(d4)
{
d5+=5;
d6-=54;
d7+=54;
}
if(d2)
++d4;
++d2;
++d3;
n+=d1;
}
d5-=5;
return (n&d5)-d5;
}
Главное — правильно подобрать коэффициенты. :-)