
正则表达式解二元方程式代码

原文:http://blog.stevenlevithan.com/archives/algebra-with-regexes
我照着原文写出的正则还真的计算出了结果。上php例子:
代码如下:
<?php
/**
* 计算 Ax+By=C
*/
function suan($A, $B, $C) {
$A--;
$B--;
$str = str_repeat('-', $C);
$search = '/^(.*)\1{' . $A . '}(.*)\2{' . $B . '}$/';
preg_match($search, $str, $r);
return array('x' => strlen($r[1]), 'y' => strlen($r[2]));
}
$A = 2;
$B = 3;
$C = 9;
$r = suan($A, $B, $C);
// 测试
echo '计算' . $A . 'x+' . $B . 'y=' . $C . '<br />';
echo 'x=' . ($r[x]) . '<br />';
echo 'y=' . ($r[y]);
// 输出
// 计算2x+3y=9
// x=3
// y=1
?>
我解释下
来一个简单的式子来说:2x+3y=9
^(.*)\1{1}(.*)\2{2}$
去匹配一个长度为9的重复字符串 “-”,匹配出两个分组的长度,就是他的x 和 y的值了
正则解释:
【(.*)】也就是0到无数个【.】点号。
\1就是引用一组。后面【{1}】就是重复1次。
后半是\2就是引用2组。后面【{2}】就是重复1次。
以下是那个英文博客的翻译:
二元方程17x + 12y = 51,其表达式【^(.*)\1{16}(.*)\2{11}$】。很好理解。【(.*)】也就是0到无数个【.】点号。(这里是接着上文说的,其实,【.】点号想表示的是字符“1”)
也就是0到无数个1,后面【\1】引用一次。后面【{16}】就是16次。作用于前面的【\1】,也就是16次引用。加上开始的【(.*)】一共正好17次。后面一个就不说了,跟这个一样。
正则引擎会依次尝试【(.*)】中0到无数个字符“1”,0个字符“1”,1个字符“1”,2个字符“1”一直增加的尝试。直到成功,否则要尝试完所有字符“1”的最大个数(这里是51个字符“1”)。
PS: 没有考虑无解的情况,当无解时 x和y都是0
相关推荐
-
正则表达式解二元方程式代码
原文:http://blog.stevenlevithan.com/archives/algebra-with-regexes我照着原文写出的正则还真的计算出了结果.上php例子: 复制代码 代码如下: <?php/** * 计算 Ax+By=C */function suan($A, $B, $C) { $A--; $B--; $str = str_repeat('-', $C); $search = '/^(.*)\1{' . $A . '}(.*)\2{' . $B . '}$/'; pr
-
基于代数方程库Algebra.js解二元一次方程功能示例
本文实例讲述了基于代数方程库Algebra.js解二元一次方程功能.分享给大家供大家参考,具体如下: 假设二元一次方程如下: x + y = 11 x - y = 5 解方程如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" cont
-
MyBatis获取数据库自生成的主键Id详解及实例代码
MyBatis获取数据库自生成的主键Id详解及实例代码 在使用MySQL数据库时我们一般使用数据库的自增主键自动产生主键.如果在插入主表时,我们需要同时插入从表的数据,这时我们通常需要知道主表插入时自动产生的主键Id值. 下面介绍使用MyBatis进行插入时,如何同时获取数据库自生成的主键: 1.XML配置文件 <insert id="insert" parameterType="Person" useGeneratedKeys="true"
-
MySQL 序列 AUTO_INCREMENT详解及实例代码
MySQL 序列 AUTO_INCREMENT详解及实例代码 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列. 使用AUTO_INCREMENT MySQL中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列. 实例 以下实例中创建了数据表insect, insect中id无需指定值可实现自动增长. mysql>
-
AngularJs bootstrap详解及示例代码
AngularJs学习笔记系列第一篇,希望我可以坚持写下去.本文内容主要来自 http://docs.angularjs.org/guide/ 文档的内容,但也加入些许自己的理解与尝试结果. 一.总括 本文用于解释Angular初始化的过程,以及如何在你有需要的时候对Angular进行手工初始化. 二.Angular <script> 标签 本例用于展示如何通过推荐的路径整合Angular,实现自动初始化. <!doctype html> <html xmlns:ng=&qu
-
JavaScript常用的正则表达式表单验证代码
常用的正则表达式如下: 复制代码 代码如下: "^-?[1-9]\\d*$", //整数 "^[1-9]\\d*$", //正整数 "^-[1-9]\\d*$", //负整数 "^([+-]?)\\d*\\.?\\d+$", //数字 "^[1-9]\\d*|0$", //正数(正整数 + 0) "^-[1-9]\\d*|0$", //负数(负整数 + 0) "^([+-]?)
-
Java 读取外部资源的方法详解及实例代码
Java 读取外部资源的方法详解 在Java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取: try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("wkdir.txt"))); String str; while ((str = in.readLine())
-
java 实现汉诺塔详解及实现代码
java 实现汉诺塔详解及实现代码 汉诺塔问题:有三根柱子A,B,C,其中A上面有n个圆盘,从上至下圆盘逐渐增大,每次只能移动一个圆盘,并且规定大的圆盘不能叠放在小的圆盘上面,现在想要把A上面的n个圆盘全部都移动到C上面,输出移动的总步数以及移动的过程 分析: //先求出移动的总步数 1,假设g(n)表示n个圆盘时的移动总的步数,当n=1时,g(1)=1; 2.现在可以把g(n)进行细分为三步: 1>先将n-1个圆盘从A通过C移动到B上面,相当于将n-1个圆盘从A移动到C,因此需要g(n-1)步
-
Java 两种延时thread和timer详解及实例代码
Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程
-
Spring组件自动扫描详解及实例代码
Spring组件自动扫描详解及实例代码 问题描述 一个系统往往有成千上万的组件,如果需要手动将所有组件都纳入spring容器中管理,是一个浩大的工程. 解决方案 Spring 提供组件扫描(component scanning)功能.它能从classpath里自动扫描.侦测和实例化具有特定注解的组件.基本的注解是@Component,它标识一个受Spring管理的组件.其他特定的注解有@Repository.@Service和@Controller,它们分别标识了持久层.服务处和表现层的组件.
随机推荐
- brook javascript框架介绍
- 使用AngularJS对表单提交内容进行验证的操作方法
- Java 读取类路径下的资源文件实现代码
- Oracle 细粒度审计(FGA)初步认识
- Python增量循环删除MySQL表数据的方法
- 浅析script标签中的defer与async属性
- DataAdapter执行批量更新的实例代码
- PHP上传图片类显示缩略图功能
- PHP使用CURL获取302跳转后的地址实例
- 在Python中使用PIL模块对图片进行高斯模糊处理的教程
- SimpleCommand实现图片下载(二)
- mysql5.x升级到mysql5.7后导入之前数据库date出错的快速解决方法
- python实现二分查找算法
- Android Listview点赞问题关于图片重复问题
- C#通过链表实现队列的方法
- python排序方法实例分析
- php 使用curl模拟ip和来源进行访问的实现方法
- RecyclerView实现仿支付宝应用管理
- jQuery实现页码跳转式动态数据分页
- Python操作Excel插入删除行的方法
其他
- docker run之后状态总是Exited
- pyQt中选中的表单QTableview返回值
- pycharm批量改代码
- layui上传多图限制6张
- javascript烟花动画
- vue数据jaon存电脑磁盘
- 右击没有mybatisx generator选项
- vue跟疫情有关的登录页面
- python 从内存地址上加载python对象数据
- python 调用执行其他python
- 通过Redis生成编码后写入数据库
- python如何提取列表中的英文
- 重定向可以携带数据吗
- jquery由远及近效果
- bootstrap 实现登录
- c# socket 定时访问
- video-player退出全屏事件
- 自定义surfaceview
- Android不显示图标
- 跳转淘宝app 商品页