这个问题相当长.这可能需要很长时间,所以如果你没有我理解的时间.
首先让我解释一下我想要实现的目标:我和一些朋友玩这个数学游戏,我们从一组可能的数字中得到6个随机数:1到10,25,50,75和100. 6个数字被选中其中不允许重复.然后将在[100,999]的范围内选择目标号码.使用上述6个数字,我们只能使用基本操作(加法,减法,乘法和除法)来达到目标.只允许整数,并且不需要所有6个整数来达到解决方案.
一个例子:我们从数字4,8,6,9,25,100开始,需要找到328.可能的解决方案是:((4 x 100) - (9 x 8))= 400 - 72 = 328.这个,我只使用了6个初始数字中的4个而没有使用过两次.这是一个有效的解决方案.
我们并不总能找到自己的解决方案,这就是为什么我认为一个程序会很有用.我编写了一个程序(用Java编写),它已经过几次测试,并且已经有效了.它并不总是提供所有可能的解决方案,但它在自己的限制范围内工作.现在我已经尝试扩展它,所以所有的解决方案都会显示出来.
关于主要问题:我尝试执行的程序运行时间非常长.就像在,我会让它运行15分钟,它看起来不像是在任何接近完成.所以我想到了它,选项确实是无穷无尽的.我从6个数字开始,我将第一个与其他5个进行比较,然后将第二个与其他5个进行比较,依此类推,直到我完成了6次(每次比较我与每个运算符进行比较,再次进行4次).在最初的6个数字的单个状态中,我现在有5次6次4 = 120个状态(每个5个数字).所有这些都必须经历相同的仪式,所以难怪它花了这么长时间.
该程序实际上太大了,无法在此列出,因此我会将其上传给感兴趣的人:http: //www.speedyshare.com/ksT43/MathGame3.jar (点击下载旁边的MathGame3.jar标题)
以下是发生的事情的一般概述:
-6 integers + goal number are initialized
-I use the class StateNumbers that are acting as game states
-> in this class the remaining numbers (initially the 6 starting numbers)
are kept as well as the evaluated expressions, for printing purposes
Run Code Online (Sandbox Code Playgroud)
此方法是主要操作发生的位置:
StateNumbers stateInProcess = getStates().remove(0);
ArrayList<Integer> remainingNumbers = stateInProcess.getRemainingNumbers();
for(int j = 0; j …Run Code Online (Sandbox Code Playgroud) 我必须以包含9个向量(每个长度为9)的向量的格式解决数独谜题.看到矢量是Prolog中的链接列表,我认为如果我首先以2D数组格式转换谜题,搜索会更快.
示例拼图:
puzzle(P) :- P =
[[_,_,8,7,_,_,_,_,6],
[4,_,_,_,_,9,_,_,_],
[_,_,_,5,4,6,9,_,_],
[_,_,_,_,_,3,_,5,_],
[_,_,3,_,_,7,6,_,_],
[_,_,_,_,_,_,_,8,9],
[_,7,_,4,_,2,_,_,5],
[8,_,_,9,_,5,_,2,3],
[2,_,9,3,_,8,7,6,_]].
Run Code Online (Sandbox Code Playgroud)
我正在使用ECLiPSe CLP来实现解算器.到目前为止,我提出的最好的方法是写一个这样的域:
domain(P):-
dim(P,[9,9]),
P[1..9,1..9] :: 1..9.
Run Code Online (Sandbox Code Playgroud)
和拼图的转换器(参数P是给定的拼图,Sudoku是具有2D阵列的新定义的网格).但是我无法将给定初始拼图中的值链接到我的2D数组.
convertVectorsToArray(Sudoku,P):-
( for(I,1,9),
param(Sudoku,P)
do
( for(J,1,9),
param(Sudoku,P,I)
do
Sudoku[I,J] is P[I,J]
)
).
Run Code Online (Sandbox Code Playgroud)
在此之前,我尝试使用array_list(http://eclipseclp.org/doc/bips/kernel/termmanip/array_list-2.html),但我一直遇到类型错误.我以前怎么做过:
convertVectorsToArray(Sudoku,P):-
( for(I,1,9),
param(Sudoku,P)
do
( for(J,1,9),
param(Sudoku,P,I)
do
A is Sudoku[I],
array_list(A,P[I])
)
).
Run Code Online (Sandbox Code Playgroud)
当我的Sudoku最终输出以下格式的示例拼图P时:
Sudoku = []([](_Var1, _Var2, 8, 7, ..., 6), [](4, ...), ...)
Run Code Online (Sandbox Code Playgroud)
那我会很开心
更新
我再次尝试使用array_list; 它几乎与以下代码一起使用:
convertVectorsToArray(Sudoku,P):-
( for(I,1,9),
param(Sudoku,P)
do
X is Sudoku[I],
Y …Run Code Online (Sandbox Code Playgroud) 我正在使用 Electron 创建一个 Windows 应用程序,该应用程序创建一个全屏透明覆盖窗口。该覆盖层的目的是:
我陷入了第一步,即屏幕截图捕获过程。
我尝试了选项 1,即使用capturePage():
this.electronService.remote.getCurrentWindow().webContents.capturePage()
.then((img: Electron.NativeImage) => { ... }
Run Code Online (Sandbox Code Playgroud)
但这仅捕获我的覆盖窗口(而不是桌面屏幕)。这将是一张对我来说毫无用处的空白图像。
选项 2是使用desktopCapturer:
this.electronService.remote.desktopCapturer.getSources({types: ['screen']}).then(sources => {
for (const source of sources) {
if (source.name === 'Screen 1') {
try {
const mediaDevices = navigator.mediaDevices as any;
mediaDevices.getUserMedia({
audio: false,
video: { // this specification is only available for Chrome -> Electron runs on Chromium browser
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: source.id,
minWidth: …Run Code Online (Sandbox Code Playgroud) 在 Erlang 中以 end 和 ok 结束函数有什么区别?我一直在试图理解以下代码中的含义:
-module(esOne).
-export([start/1, func/1]).
start(Par) ->
io:format("Client: I am ~p, spawned by the server: ~p~n",[self(),Par]),
spawn(esOne, func, [self()]),
Par ! {onPid, self()},
serverEsOne ! {onName, self()},
receiveMessage(),
ok.
receiveMessage() ->
receive
{reply, N} ->
io:format("Client: I received a message: ~p~n",[N])
after
5000->
io:format("Client: I received no message, i quit~n",[])
end.
func(Parent)->
io:format("Child: I am ~p, spawned from ~p~n",[self(),Parent]).
Run Code Online (Sandbox Code Playgroud)
此代码与充当服务器的另一个 .erl 文件结合使用。我只能通过分析给定的服务器文件并复制它的行为来编写这个。首先,我认为 ok 用于结束每个函数,但事实并非如此,因为我不能用 ok 结束 receiveMessage()。然后我想我可以用 end 结束每个函数,但是如果我用 end 替换 ok,start(Par) 会出错。不仅如此,在服务器文件中,我看到 ok 和 …
如何在ECLiPSe CLP中测量方法的执行时间?目前,我有这个:
measure_traditional(Difficulty,Selection,Choice):-
statistics(runtime, _),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
time(solve_traditional(Difficulty,Selection,Choice,_)),
statistics(runtime,[_|T]), % T
write(T).
Run Code Online (Sandbox Code Playgroud)
我需要编写执行方法solve_traditional(...)并将其写入文本文件所花费的时间.但是,它不够精确.有时,给定方法的时间将打印0.015或0.016秒,但通常打印0.0秒.
确定方法完成得太快,我决定使用统计信息(运行时,...)来测量两次运行时调用之间的时间.然后,我可以测量完成20次方法调用所需的时间,并将测量的时间T除以20.
唯一的问题是,20次调用T等于0,16,32或48毫秒.显然,它分别测量每个方法调用的时间,并找到执行时间的总和(通常只有0.0秒).这超过了测量N个方法调用的运行时间并将时间T除以N的全部目的.
简而言之:我用于执行时间测量的当前方法是不合适的.有没有办法使它更精确(例如9位小数)?
我正在使用Spectator编写我的 Angular 8 测试并使用Jest来运行它们。根据自述文件,我可以setInput()用来将我的值分配给有效的字段名称。问题是在创建组件后正在验证输入,但在此之前我需要它,因为我在我的ngOnInit方法中使用它进行初始化:
// item.component.ts
@Input() items: Items[] = [];
ngOnInit(): void {
// do something with this.items
// read query param 'page' and use it for something
}
Run Code Online (Sandbox Code Playgroud)
和
// item.component.spec.ts
let spectator: SpectatorRouting<ItemComponent>;
const createComponent = createRoutingFactory({
component: ItemComponent,
queryParams: {page: 1}
});
beforeEach(() => spectator = createComponent());
it('test items', () => {
spectator.setRouteQueryParam('page', '2');
spectator.setInput("items", myItemsList);
});
Run Code Online (Sandbox Code Playgroud)
旁观者将正确设置 queryParampage和 Input items,但只有在组件已经创建之后。在组件创建期间ngOnInit将使用 …
我正在阅读一些有关智能指针如何在C++中工作的教程,但我仍然坚持我尝试的第一个:唯一指针.我正在遵循维基百科,cppreference和cplusplus的指导原则.我已经看过这个答案了.如果我理解正确的话,唯一的指针应该是对某个存储单元/块具有所有权的唯一指针.这意味着只有唯一指针(应该)指向该单元格而没有其他指针.从维基百科,他们使用以下代码作为示例:
std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2 = p1; //Compile error.
std::unique_ptr<int> p3 = std::move(p1); //Transfers ownership. p3 now owns the memory and p1 is rendered invalid.
p3.reset(); //Deletes the memory.
p1.reset(); //Does nothing.
Run Code Online (Sandbox Code Playgroud)
直到第二行,当我测试它时,这对我来说很好.但是,在将第一个唯一指针移动到第二个唯一指针后,我发现两个指针都可以访问同一个对象.我认为整个想法是让第一个指针变得毫无用处可以这么说?我期望一个空指针或一些未确定的结果.我运行的代码:
class Figure {
public:
Figure() {}
void three() {
cout << "three" << endl;
}
};
class SubFig : public Figure {
public:
void printA() {
cout << "printed a" …Run Code Online (Sandbox Code Playgroud) 我在这里关注API:
我有一个项目列表,我想在提示窗口的ComboBox中显示.来自JOptionPane的showInputDialog方法允许我这样做,但它限制了我两个按钮(确定和取消).我想有更多按钮(我可以定义更多按钮,但我不知道如何使用showInputDialog将其添加到此窗口).
我可以使用showOptionDialog创建一个选项数组(包含我需要的所有按钮),但是提示窗口无法显示我的项目列表.通常接受项目数组的参数(在showInputDialog中)现在需要一个按钮数组.
Object[] selectionValues replaced by Object[] options
Run Code Online (Sandbox Code Playgroud)
有没有办法结合他们的功能?
我可以在技术上创建一个新的GUI来实现这一点,但如果已经有一个现有的实现,我可能会做很多不必要的工作.此外,在能够对原始帧执行任何操作之前,用户在新提示窗口上完成任务非常重要.
所以最后,这应该发生:
angular ×2
eclipse-clp ×2
java ×2
prolog ×2
arrays ×1
c++ ×1
electron ×1
erlang ×1
javascript ×1
jestjs ×1
joptionpane ×1
performance ×1
pointers ×1
swing ×1