小编the*_*may的帖子

在Prolog中列举顺序

我试图通过将inorder列表转回BST来"反转"inorder遍历.

BST具有谓词形式node(Value,Left,Right)或者leaf,因此空树只是leaf一棵树,一个节点就是node(_,leaf,leaf).

给定谓词enumerate_bst(Elems,Bst),目标是匹配Bstinorder列表的所有可能性Elems.例如(注意setof/3):

?- setof(Bst,enumerate_bst([],Bst),Enum).
Enum = [leaf].

?- setof(Bst,enumerate_bst([1,2],Bst),Enum).
Enum = [
    node(1, leaf, node(2, leaf, leaf)),
    node(2, node(1, leaf, leaf), leaf)
].

?- setof(Bst,enumerate_bst([1,2,3],Bst),Enum).
Enum = [
    node(1, leaf, node(2, leaf, node(3, leaf, leaf))),
    node(1, leaf, node(3, node(2, leaf, leaf), leaf)),
    node(2, node(1, leaf, leaf), node(3, leaf, leaf)),
    node(3, node(1, leaf, node(2, leaf, leaf)), leaf),
    node(3, node(2, node(1, leaf, leaf), leaf), leaf) …
Run Code Online (Sandbox Code Playgroud)

prolog binary-search-tree dcg failure-slice

2
推荐指数
1
解决办法
326
查看次数

为什么 n & (n - 1) 总是从 n 中清除 1 位?

给定一个数字n,逐位运算n & (n - 1)总是产生一个距离 1 位的数字n。以下是一些示例:

n = 4 => b'100' & b'011' = b'000'
n = 5 => b'101' & b'100' = b'100'
n = 6 => b'110' & b'101' = b'100' 
Run Code Online (Sandbox Code Playgroud)

换句话说,n & (n - 1)总是从 中清除 1 位n。为什么是这样?有人可以提供证明吗?

bit-manipulation

2
推荐指数
1
解决办法
813
查看次数

同时收听多个 go 频道

假设我有一个 go 接收通道。有没有一种方法可以让我同时收听所有内容?例如:

channels := make([]<-chan int, 0, N)
// fill the slice with channels
for _, channel := range channels {
  <-channel
}
Run Code Online (Sandbox Code Playgroud)

这是我能做到的最接近的事情。但是,此实现取决于切片元素的顺序。

为了清楚起见,我不需要知道 go 通道的值。我只需要知道他们都完成了。

channel go goroutine

1
推荐指数
1
解决办法
1998
查看次数

grep 带有可能前缀的 SHA-1 哈希

我想从git submodule status <PATH>我的子模块的 SHA-1 提交哈希中进行 grep 。根据git submodule --help

状态 [--缓存] [--递归] [--] [...]

显示子模块的状态。这将打印每个子模块当前签出的提交的 SHA-1,以及 SHA-1 的子模块路径和 git 描述的输出。如果子模块未初始化,则每个 SHA-1 可能会以 - 为前缀;如果当前签出的子模块提交与包含存储库的索引中找到的 SHA-1 不匹配,则以 + 为前缀;如果子模块存在合并冲突,则每个 SHA-1 可能会以 U 为前缀。

所以结果看起来像这样:

 f1eeb6aa2a5009b5ef68b5b754499dcb3ab575d1 my-submodule (remotes/origin/HEAD)
Run Code Online (Sandbox Code Playgroud)

描述提到每个哈希可能会以 a+或 a为前缀-。我对这些符号不感兴趣,因此,无论它给我什么结果,我都想获得不带前缀的 40 个字符的哈希值。

例子:

input: +f1eeb6aa2a5009b5ef68b5b754499dcb3ab575d1 my-submodule (remotes/origin/HEAD)
desired output: f1eeb6aa2a5009b5ef68b5b754499dcb3ab575d1

input: f1eeb6aa2a5009b5ef68b5b754499dcb3ab575d1 my-submodule (remotes/origin/HEAD)
desired output: f1eeb6aa2a5009b5ef68b5b754499dcb3ab575d1
Run Code Online (Sandbox Code Playgroud)

我已经尝试过类似的方法awk '{print $1;}' | grep -e '[0-9a-f]\{40\}',但它似乎没有删除前缀。有什么优雅的解决方案吗?

regex git bash grep

1
推荐指数
1
解决办法
753
查看次数

Golang 结构的 Postgres 数组

我有以下 Go 结构:

type Bar struct {
    Stuff string `db:"stuff"`
    Other string `db:"other"`
}

type Foo struct {
    ID    int    `db:"id"`
    Bars  []*Bar `db:"bars"`
}
Run Code Online (Sandbox Code Playgroud)

所以Foo包含一个Bar指针切片。我在 Postgres 中还有以下表格:

CREATE TABLE foo (
    id  INT
)

CREATE TABLE bar (
    id      INT,
    stuff   VARCHAR,
    other   VARCHAR,
    trash   VARCHAR
)
Run Code Online (Sandbox Code Playgroud)

我想LEFT JOIN在 table 上bar并将其聚合为一个数组以存储在 struct 中Foo。我试过了:

SELECT f.*,
ARRAY_AGG(b.stuff, b.other) AS bars
FROM foo f
LEFT JOIN bar b
ON f.id = …
Run Code Online (Sandbox Code Playgroud)

postgresql go sqlx

1
推荐指数
1
解决办法
5473
查看次数

使用@Inject 进行依赖注入

我觉得奇怪的是我找不到这些信息,所以如果可能的话,请把我指向一个可靠的来源。此问题仅与 Java 相关。

简而言之,我想知道依赖注入实际上是如何在语法上发生的

我对依赖注入的理解如下:

public class Car {
    private Engine engine
    
    @Inject
    public Car(Engine engine) {
        this.engine = engine
    }
}
Run Code Online (Sandbox Code Playgroud)

是否相当于

public class Car {
    private Engine engine
    
    public Car(Engine engine) {
        this.engine = engine
    }
}
Run Code Online (Sandbox Code Playgroud)

其中关键字@Inject是语法糖,让 Java 知道engine要注入依赖项。这样,Car将不负责创建engine,因此具有的依赖Engine。但是,没有示例向我展示如何注入它。简而言之:

public MyClass {
    public static void main(String[] args) {
        ToyotaEngine toyotaEngine = new ToyotaEngine();
        HondaEngine hondaEngine = new HondaEngine();
        // ??? which …
Run Code Online (Sandbox Code Playgroud)

java

1
推荐指数
1
解决办法
75
查看次数

在没有 NULL 或重复值的窗口上滚动计数

id考虑已按时间戳分组并按降序排序的关注窗口。

ID 时间戳 瓦尔
10:50 无效的
10:40 A
10:30 A
10:20 无效的
10:10 无效的
10:00
9:50 C
9:40 无效的
9:30 d
9:20 无效的

假设val一旦出现不同的值,a就不会再次出现。也就是说,我不会出现,a,b,aa,null,a可能会出现。我想针对valNULL见过或以前见过的条件生成滚动计数。也就是说,我想要这样的东西:

ID 时间戳 瓦尔 数数
10:50 无效的 0
10:40 A 1
10:30 A 1
10:20 无效的 1
10:10 A 1
10:00 2
9:50 C 3
9:40 …

google-bigquery

1
推荐指数
1
解决办法
427
查看次数

C++`srand()`函数产生一个模式?

新的C++和下面的初学者的教程在这里.请参阅标题为C++中的随机数的部分.准确使用给出的代码:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main () {
   int i,j;

   // set the seed
   srand( (unsigned)time( NULL ) );

   /* generate 10  random numbers. */
   for( i = 0; i < 10; i++ ) {
      // generate actual random number
      j = rand();
      cout <<" Random Number : " << j << endl;
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我播种srand()time()(编译g++)等所产生的结果应该是完全随机的.但是,这是我得到的结果:

$ ./a.out
 Random Number : 1028986599 …
Run Code Online (Sandbox Code Playgroud)

c++ random srand

-1
推荐指数
1
解决办法
96
查看次数