[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 523066680 于 2017-7-20 17:42 编辑

由二分扩展为N段划分的 Perl 代码示例。
整体思路:均匀采样,统一交给线程去跑,等结果都返回了,缩小 min 和 max 的范围继续跑

线程的代码去掉了,有蜜汁Bug
  1. =info
  2.     Author: 523066680
  3.     Date: 2017-07
  4. =cut
  5. use IO::Handle;
  6. use Time::HiRes qw/sleep/;
  7. STDOUT->autoflush(1);
  8. our $n = int(rand(10000));
  9. my ($min, $max) = (0, 10000);
  10. my $div = 10;
  11. my @ele;
  12. my @cmp;
  13. while (1)
  14. {
  15.     @ele = map { int( ($max-$min+1) / $div * $_) + $min } ( 1 .. $div-1 );
  16.     @cmp = map { check($_) } @ele;
  17.     printf "min:%5d max:%5d n=%5d  ", $min, $max, $n;
  18.     grep { printf "%d %s N ", $ele[$_], $cmp[$_] } ( 0 .. $#ele );
  19.     print "\n";
  20.     grep { $min = $ele[$_] if ($cmp[$_] eq '<') } ( 0 .. $#cmp );
  21.     grep { $max = $ele[$_] if ($cmp[$_] eq '>') } ( reverse 0 .. $#cmp );
  22.     grep { last if ($_ eq '=') } ( @cmp );
  23.     sleep 0.3;
  24. }
  25. sub check
  26. {
  27.     our $n;
  28.     my $guess = shift;
  29.     return ($guess < $n) ? "<" : ($guess > $n) ? ">" : "=" ;
  30. }
复制代码
测试时加了sleep怕死循环
  1. min:    0 max:10000 n= 2760  1000 < N 2000 < N 3000 > N 4000 > N 5000 > N 6000 > N 7000 > N 8000 > N 9000 > N
  2. min: 2000 max: 3000 n= 2760  2100 < N 2200 < N 2300 < N 2400 < N 2500 < N 2600 < N 2700 < N 2800 > N 2900 > N
  3. min: 2700 max: 2800 n= 2760  2710 < N 2720 < N 2730 < N 2740 < N 2750 < N 2760 = N 2770 > N 2780 > N 2790 > N
  4. .[Finished in 0.8s]
复制代码
看到 bbaa 也在发力了
  1. codegay    27556 + 3
  2. 老刘       4684 + 100
  3. vic2       1945 + 125
  4. bbaa       74 + 37
  5. racket     28 + 0
复制代码
1

评分人数

TOP

回复 109# bbaa

    采样的数据量不大,又是线性的,放内存、文件也行啊。

新的赛跑进度显示:
  1. codegay    28121 + 5     0.3/min
  2. vic2       13098 + 192   12.9/min
  3. 老刘        4927 + 0     0.0/min
  4. bbaa         227 + 0     0.0/min
  5. vic3         127 + 0     0.0/min
复制代码
代码
  1. =info
  2.     Auth: 523066680
  3.     Date: 2017-07
  4. =cut
  5. use JSON;
  6. use Encode;
  7. use Try::Tiny;
  8. use Time::HiRes qw/time sleep/;
  9. use IO::Handle;
  10. STDOUT->autoflush(1);
  11. use LWP::Simple;
  12. use LWP::UserAgent;
  13. our $user    = "vic3";
  14. our $website = 'http://bbaass.tk/math/';
  15. our ($user, $website, $headers);
  16. our $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0', timeout => 5 );
  17. my %ever;
  18. my %current;
  19. getData( \%ever );
  20. my $count = 0;
  21. my $delta;
  22. my $speed;
  23. my $time_a = time();
  24. while (1)
  25. {
  26.     getData(\%current);
  27.     $count = 0;
  28.     for my $k (reverse sort { $ever{$a} <=> $ever{$b} } keys %ever)
  29.     {
  30.         $delta = $current{$k} - $ever{$k};
  31.         $speed = $delta / (time() - $time_a) * 60.0;
  32.         printf "%-10s %5d + %-5d %.1f/min\n",
  33.             encode('gbk',  $k),
  34.             $ever{$k},
  35.             $delta,
  36.             $speed
  37.             ;
  38.         last if ($count++ > 3);
  39.     }
  40.     print "\n";
  41.     sleep 10.0;
  42. }
  43. sub getData
  44. {
  45.     my $href = shift;
  46.     my $res;
  47.     my $data;
  48.     while (1)
  49.     {
  50.         $res = $ua->post( $website, [ username => $user, send => 'reg' ] );
  51.         $res = $ua->post( $website, [ username => $user, send => 'user' ] );
  52.         try { $data = decode_json( $res->content ); last; }
  53.         catch { sleep 2.0; printf "repeat\n" }
  54.     }
  55.     for my $e ( @{$data->{'user'}} )
  56.     {
  57.         ( $times, $name, $state ) = @$e;
  58.         $href->{$name} = $times;
  59.     }
  60. }
复制代码

TOP

本帖最后由 523066680 于 2017-7-21 12:09 编辑

回复 111# bbaa


    最好还是有图表,24小时 或 60分钟 的折线图,不同 ID 不同颜色

现在bbaa速度飙升,10秒3个

TOP

本帖最后由 523066680 于 2017-7-21 12:25 编辑

回复 114# bbaa


    咦 重置了?
repeat
codegay    28209 + -28209 -871.6/min
vic2       14805 + -14802 -457.3/min
老刘        4983 + -4983 -154.0/min
bbaa         458 + -458  -14.2/min
vic3         127 + -127  -3.9/min

一大波负数,哈哈。

PHP JS HTML 不太懂,本地动态折线图我可以用 Perl+OpenGL 做。

TOP

回复 116# bbaa


    你的是用多线程以外的方案吗?好快。

TOP

我的方案已经改善,初接触多线程,各种问题还不知道怎么处理,边学边改
  1. bbaa        1442 + 5     1.9/min
  2. vic2        1360 + 21    8.2/min
  3. codegay      429 + 5     1.9/min
  4. vic3           0 + 0     0.0/min
复制代码
1

评分人数

TOP

回复 128# bbaa
对齐一下更好
  1. vic3        9254 + 100   8.9/min
  2. codegay     4446 + 11    1.0/min
  3. vic2        2451 + 0     0.0/min
  4. bbaa        1789 + -60   -5.3/min
复制代码

TOP

本帖最后由 523066680 于 2017-7-22 17:22 编辑

回复 130# bbaa


    相当不错。相信你也借此项目锻炼了不少技能。

折线的颜色你可以建立一个色彩分明的颜色列表,不然有些颜色相近。

TOP

本帖最后由 523066680 于 2017-7-23 12:52 编辑

从零创建起来的图表,还未完善,费力+真心难看。
  1. =info
  2.     Auth: 523066680
  3.     Date: 2017-07
  4. =cut
  5. use JSON;
  6. use Encode;
  7. use Try::Tiny;
  8. use Data::Dumper;
  9. use Time::HiRes qw/time sleep/;
  10. use IO::Handle;
  11. STDOUT->autoflush(1);
  12. use threads;
  13. use threads::shared;
  14. use OpenGL qw/ :all /;
  15. use OpenGL::Config;
  16. #use Font::Freetype;
  17. use LWP::UserAgent;
  18. our $user    = "vic3";
  19. our $website = 'http://bbaass.tk/math/';
  20. our ($user, $website, $headers);
  21. our $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0', timeout => 3 );
  22. our %ucolor :shared;
  23. our $users :shared;
  24. #使共享变量支持复合数据结构
  25. print "Loading data...";
  26. make_user_struct();
  27. print "Done\n";
  28. our $SIZE_X = 800;
  29. our $SIZE_Y = 800;
  30. our $WinID;
  31. threads->create( \&getData, 1);
  32. &Main();
  33. my $count = 0;
  34. my $delta;
  35. my $speed;
  36. my $time_a = time();
  37. INFORMATION:
  38. {
  39.     sub getData
  40.     {
  41.         our ($ua, $website, $user);
  42.         my $res;
  43.         my $data;
  44.         my $info;
  45.         my $json = JSON->new->allow_nonref;
  46.         $SIG{'BREAK'} = sub { threads->exit() };
  47.         $res = $ua->post( $website, [ username => $user, send => 'reg' ] );
  48.         while (1)
  49.         {
  50.         SUBW: while (1)
  51.         {            
  52.             $res = $ua->post( $website, [ username => $user, send => 'user' ] );
  53.             try { $data = $json->decode( $res->content ); last SUBW; }
  54.             catch { sleep 2.0; printf "repeat\n" }
  55.         }
  56.         for my $e ( @{$data->{'user'}} )
  57.         {
  58.          ( $times, $name, $state ) = @$e;
  59.             push @{$users->{$name}}, $times;
  60.         }
  61.         
  62.         sleep 2.0;
  63.     }
  64.     }
  65.     sub make_user_struct
  66.     {
  67.     our ($ua, $website, $user);
  68.     my $data;
  69.     my $json = JSON->new->allow_nonref;
  70.         while (1)
  71.         {
  72.             $res = $ua->post( $website, [ username => $user, send => 'reg' ] );
  73.             $res = $ua->post( $website, [ username => $user, send => 'user' ] );
  74.             try { $data = $json->decode( $res->content ); last; }
  75.             catch { sleep 2.0; printf "retry\n" }
  76.         }
  77.         my @colors = (
  78.          [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.5, 1.0],
  79.          [1.0, 1.0, 0.0], [0.0, 1.0, 1.0], [1.0, 0.0, 1.0],
  80.          [1.0, 1.0, 1.0],
  81.          );
  82.         my $hash;
  83.         for my $e ( @{$data->{'user'}} )
  84.         {
  85.          ( $times, $name, $state ) = @$e;
  86.             $hash->{$name} = [ $times ];
  87.         }
  88.         #建立颜色信息
  89.         my $n = 0;
  90.         for my $name ( sort keys %$hash )
  91.         {
  92.          $ucolor{$name} = shared_clone( $colors[$n++] );
  93.     }
  94.         $users = shared_clone( $hash );
  95.     }
  96. }
  97. OPENGL:
  98. {
  99.     sub display
  100.     {
  101.         glClear(GL_COLOR_BUFFER_BIT);
  102.         glColor3f(1.0, 1.0, 1.0);
  103.         glBegin(GL_LINES);
  104.             glVertex3f(-200.0, 0.0, 0.0);
  105.             glVertex3f(200.0, 0.0, 0.0);
  106.             glVertex3f(0.0, -200.0, 0.0);
  107.             glVertex3f(0.0, 200.0, 0.0);
  108.         glEnd();
  109.         my $ty = 0;
  110. for my $name ( sort keys %ucolor )
  111. {
  112. glColor3f( @{$ucolor{$name}} );
  113. glRasterPos2i(-10, $ty);
  114. printstr( $name );
  115. $ty+=2;
  116. }
  117.         my $obj;
  118.         for my $name ( keys %$users )
  119.         {
  120.          $obj = $users->{$name};
  121.          glColor3f( @{$ucolor{$name}} );
  122.         glBegin(GL_LINE_STRIP);
  123.         for my $v ( 1 .. $#{$obj} )
  124.         {
  125.             glVertex3f( $v, $obj->[$v] - $obj->[0], 0.0 );
  126.         }
  127.         glEnd();
  128.     }
  129.         glutSwapBuffers();
  130.     }
  131.     sub init
  132.     {
  133.         glClearColor(0.0, 0.0, 0.0, 1.0);
  134.     }
  135.     sub idle
  136.     {
  137.         sleep 0.1;
  138.         glutPostRedisplay();
  139.     }
  140.     sub Reshape
  141.     {
  142.         my $half = 100.0;
  143.         glViewport(0.0,0.0, $SIZE_X, $SIZE_Y);
  144.         glMatrixMode(GL_PROJECTION);
  145.         glLoadIdentity();
  146.         glOrtho(-20.0, $half, -20.0, $half,-20.0,200.0);
  147.         glMatrixMode(GL_MODELVIEW);
  148.         glLoadIdentity();
  149.         gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0, 0.0,1.0,100.0);
  150.     }
  151.     sub hitkey
  152.     {
  153.         my $key = shift;
  154.         if (lc(chr($key)) eq 'q')
  155.         {
  156.             glutDestroyWindow($WinID);
  157.         }
  158.         elsif ($key == 27)
  159.         {
  160.             glutDestroyWindow($WinID);
  161.         }
  162.     }
  163.     sub Main
  164.     {
  165.         glutInit();
  166.         glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE |GLUT_MULTISAMPLE );
  167.         glutInitWindowSize($SIZE_X, $SIZE_Y);
  168.         glutInitWindowPosition(1,1);
  169.         our $WinID = glutCreateWindow("Show");
  170.         &init();
  171.         glutDisplayFunc(\&display);
  172.         glutReshapeFunc(\&Reshape);
  173.         glutKeyboardFunc(\&hitkey);
  174.         glutIdleFunc(\&idle);
  175.         glutMainLoop();
  176.     }
  177.     sub printstr
  178.     {
  179.         for my $i ( split("", $_[0]) )
  180.         {
  181.             #glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord($i));
  182.             glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, ord($i));
  183.         }
  184.     }
  185. }
复制代码

TOP

我在这个帖子下看到各种语言写的程序,被夸到飞起来,那个6啊。
坐等新的突破

TOP

本帖最后由 523066680 于 2017-7-29 08:28 编辑



截图中 adad 的速度是S发布的代码在另一台电脑上运行的结果(当时vic3的程序暂停了)


情况就是这么个情况。

          评分君好像很激动……
                       |
1

评分人数

    • codegay: 继续晒数据啊。技术 + 1

TOP

本帖最后由 523066680 于 2018-12-25 21:05 编辑

回复 141# codegay

    那个时候最大的问题是我们这一边的代码几乎都没有加 keep_alive,导致提交速度慢了好多倍。
对方提供的java程序跑起来速度翻倍怎么想都有点夸张,特别是看到源码后发现他们的算法也还有优化空间(bulls and cows那个游戏),
当时不懂网络就错误地怀疑是程序性能啦(java的网络库也确实快)。

到了数独游戏,C语言+DLX算法是真的快。

TOP

返回列表