我看到这个日食的解决方案中提到的问题这个 XKCD漫画.我试图将其转换为纯Prolog.
go:-
Total = 1505,
Prices = [215, 275, 335, 355, 420, 580],
length(Prices, N),
length(Amounts, N),
totalCost(Prices, Amounts, 0, Total),
writeln(Total).
totalCost([], [], TotalSoFar, TotalSoFar).
totalCost([P|Prices], [A|Amounts], TotalSoFar, EndTotal):-
between(0, 10, A),
Cost is P*A,
TotalSoFar1 is TotalSoFar + Cost,
totalCost(Prices, Amounts, TotalSoFar1, EndTotal).
Run Code Online (Sandbox Code Playgroud)
我不认为这是最好的/最具声明性的解决方案,人们可以提出.有没有人有任何改进建议?提前致谢!
我正在尝试使用模板在C++中展开循环,如下所示.
#include <iostream>
template< class T, T i >
struct printDown {
static void run(void) {
std::cout << i << "\n";
printDown< T, i - 1 >::run();
}
};
template< class T >
struct printDown< T, 0 > {
static void run(void) {
std::cout << 0 << "\n";
}
};
int main(void) {
printDown< int, 10 >::run();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在Cygwin中编译w/g ++ 3.4.4时,我收到以下错误.
tmp.cpp:12:错误:类型
T' of template argument0'取决于模板参数
我究竟做错了什么?我是否需要以某种方式注释0来说它是T型?
提前致谢.
c++ templates partial-specialization specialization loop-unrolling
我想出了瓦特/下面的代码来替换出现的所有Find瓦特/ Replace中Request和放在答案Result.这是使用DCG,因此它们都是字符代码列表.客户端代码将使用的谓词是substitute.
findReplace(_, _, [], []) -->
[]. % The end.
findReplace(Find, Replace, Result, ResultRest) -->
Find, % Found Find.
{ append(Replace, Intermediate, Result) }, % Put in Replace in Find's place.
!, % Make sure we don't backtrack & interpret Find as the next case.
findReplace(Find, Replace, Intermediate, ResultRest).
findReplace(Find, Replace, [ C | Intermediate ], ResultRest) -->
[ C ], % Any other character.
findReplace(Find, Replace, Intermediate, ResultRest).
substitute(Find, …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码.我正在尝试将矢量向量输出到ostream.
#include <iterator>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
template<typename T>
std::ostream &operator <<(std::ostream &os, const std::vector<T> &v) {
using namespace std;
copy(v.begin(), v.end(), ostream_iterator<T>(os, "\n"));
return os;
}
int main() {
using namespace std;
vector<string> v1;
cout << v1;
vector<vector<string> > v2;
cout << v2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我输出字符串向量的语句有效.我输出字符串向量向量的那个没有.我正在使用g ++ 4.7.0.我试过w /&w/o -std = c ++ 11标志.在C++ 11模式下,它在半页的错误中给出了这一行.
error: cannot bind 'std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >::ostream_type {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
Run Code Online (Sandbox Code Playgroud)
我不认为我理解这意味着什么.有人可以向我解释一下吗?我或多或少知道rvalue引用是什么,但我不明白为什么std::basic_ostream<char>不绑定std::basic_ostream<char>&&.也许我不太了解它.还有更好的方法吗?
提前致谢.
让我们假设我们正在读取标准输入并构建已读取的所有行的列表.最后,我们需要显示那些以逗号分隔的行.
go:-
prompt(_, ''),
processInput([ ], Lines),
findall(_, (member(L, Lines), write(L), write(',')), _),
nl.
processInput(LinesSoFar, Lines):-
read_line_to_codes(current_input, Codes),
processInput(Codes, LinesSoFar, Lines).
processInput(Codes, LinesSoFar, Lines):-
( Codes \= end_of_file
->
atom_codes(Line, Codes),
append(LinesSoFar, [ Line ], LinesSoFar1), % <---- append/3 - O(n)
processInput(LinesSoFar1, Lines)
;
Lines = LinesSoFar ).
Run Code Online (Sandbox Code Playgroud)
这个代码的问题在于append调用processInput/3成本为O(n).我们怎样才能避免这种成本并且仍然让我们的谓词是尾递归的(因为我们可能从标准输入中读取了很多行)?
在我看来,我们可以用append以下内容代替.
LinesSoFar1 = [ Line | LinesSoFar ],
Run Code Online (Sandbox Code Playgroud)
我们可以在显示之前反转列表.但这看起来很糟糕.有没有更好的办法?