比特币上的数独游戏合约的实现代码
作者:freedomhero 发布时间:2023-10-13 00:46:04
标签:比特币,数独游戏,合约
我们在 Bitcoin SV 上实现了一个数独游戏智能合约,利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链。因为求解数独问题的计算工作量会随着其行列数快速增长,实际上它也是一个 NP-完全 问题。不过我们可以借由比特币智能合约巧妙地寻求答案,只需要验证答案提供者所给出的解答是否满足要求即可,这样即可以将复杂的求解计算过程实现链下外包。
sCrypt 合约代码如下:
import "util.scrypt";
import "array.scrypt";
contract Sudoku {
bytes board;
static const int N = 9;
static bytes EMPTY = b'00';
constructor(bytes board) {
this.board = board;
}
function merge(bytes solution) : bytes {
bytes newBoard = this.board;
int i = 0;
loop (N) {
int j = 0;
loop (N) {
int value = this.readValue(newBoard, i, j);
int inputValue = this.readValue(solution, i, j);
if (value == 0) {
require(inputValue <= 9);
newBoard = this.setValue(newBoard, i, j, inputValue);
} else {
require(value == inputValue);
}
j++;
}
i++;
}
return newBoard;
}
public function solve(bytes solution) {
require(len(solution) == Sudoku.N * Sudoku.N);
bytes newBord = this.merge(solution);
Array rowArray = new Array();
Array colArray = new Array();
Array squareArray = new Array();
int i = 0;
loop (N) {
int j = 0;
loop (N) {
// check for duplicate
// in a row
int rowElem = this.readValue(newBord, i, j);
require(rowArray.indexOf(rowElem) == -1);
rowArray.push(rowElem);
// in a column
int colElem = this.readValue(newBord, j, i);
require(colArray.indexOf(colElem) == -1);
colArray.push(colElem);
// in a subgrid
int squareElem = this.readSquareValue(newBord, i, j);
require(squareArray.indexOf(squareElem) == -1);
squareArray.push(squareElem);
j++;
}
rowArray.clear();
colArray.clear();
squareArray.clear();
i++;
}
require(true);
}
static function readValue(bytes board, int i, int j): int {
return Util.fromLEUnsigned(Util.getElemAt(board, Sudoku.index(i, j)));
}
static function setValue(bytes board, int i, int j, int value): bytes {
return Util.setElemAt(board, this.index(i, j), Util.toLEUnsigned(value, 1));
}
static function readSquareValue(bytes board, int i, int j): int {
return Util.fromLEUnsigned(Util.getElemAt(board, Sudoku.indexSquare(i, j)));
}
static function index(int row, int col) : int {
return row * Sudoku.N + col;
}
static function indexSquare(int i, int j) : int {
int row = i / 3 * 3 + j / 3;
int col = i % 3 * 3 + j % 3;
return Sudoku.index(row, col);
}
}
来源:https://blog.csdn.net/freedomhero/article/details/112758212
0
投稿
猜你喜欢
- Prometheus是什么Prometheus是一套开源监控系统和告警为一体,由go语言(golang)开发,是监控+报警+时间序列数据库的
- 通过引用serial模块包,来操作串口。1、查看串口名称在Linux和Windows中,串口的名字规则不太一样。需要事先查看。Linux下的
- 背景介绍PyTorch 训练的模型,需要在Jetson nano 上部署,jetson 原生提供了TensorRT 的支持,所以一个比较好的
- Pydub是一个基于ffmpeg的Python音频处理模块,封装了许多ffmpeg底层接口,因此用它来做音乐歌曲文件格式转换会非常方便,如果
- 什么是pyecharts?pyecharts 是一个用于生成 Echarts 图表的类库。echarts是百度开源的一个数据可视化 JS 库
- 一、前言好不容易女神喊我去看电影,但是她又不知道看啥,那么我当然得准备准备~二、前期准备1、使用的软件python 3.8 开源 免费的 (
- 比如有一个a = {‘a': 1}希望变为a = {‘b' :1}即:在保留value不变的情况下,替换key值目前能想到的
- python+selenium编写实现爬虫过程:1.爬虫循环处理table表,2.table表分页处理,3.网页table所有内容循环处理4
- 前提:安装xhtml2pdf https://pypi.python.org/pypi/xhtml2pdf/下载字体:微软雅黑;待转换的文件
- Python则是通过缩进来识别代码块的。缩进Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如
- LoadRunner监控MySQLhttp://www.docin.com/p-92272846.htmlAdvanced MySQL Pe
- 本文实例讲述了python比较两个列表大小的方法。分享给大家供大家参考。具体如下:L1 = [1, ('a', 3)]L2
- 本文实例讲述了php实现的验证码文件类。分享给大家供大家参考。具体如下:<?php/*** @file* @version 1.0*
- 概念django自带一套信号机制来帮助我们在框架的不同位置之间传递信息。也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(sen
- 有序字典-OrderedDict简介示例有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。参见下面
- 如何将123456789转化成123,456,789这样的形式呢?很多流量大的站比如优酷都有这样的格式。也是设计程序最常用的算
- 脚本调试第一步:设置中断(鼠标左键点击)第二步:输入中断条件(可选功能,鼠标右键点击红点)第三步:触发中断(当符合条件是,中断被触发)出现中
- 对List进行排序,Python提供了两个方法方法1.用List的内建函数list.sort进行排序list.sort(func=None,
- 1.添加文本标签 plt.text()用于在绘图过程中,在图像上指定坐标的位置添加文本。需要用到的是plt.text()方法。&em
- 如你所见,功能很简单。只有基本的播放,停止,甚至只针对一首歌曲,仅供初学者参考学习用。代码from tkinter import *from