小编And*_*kha的帖子

WordCount:McIlroy的解决方案效率如何?

长话短说:1986年,一位采访者要求Donald Knuth写一个输入文本和数字N的程序,并列出按频率排序的N个最常用的单词.Knuth制作了一个10页的Pascal程序,Douglas McIlroy用以下6行shell脚本回复:

tr -cs A-Za-z '\n' |
tr A-Z a-z |
sort |
uniq -c |
sort -rn |
sed ${1}q
Run Code Online (Sandbox Code Playgroud)

请阅读http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/阅读全文.

当然,他们有着截然不同的目标:Knuth展示了他的文学编程概念,并从零开始构建了所有内容,而McIlroy使用了一些常见的UNIX实用程序来实现最短的源代码.

我的问题是:那有多糟糕?
(纯粹从运行时速度的角度来看,因为我很确定我们都同意6行代码比10页更容易理解/维护,有文化编程与否.)

我可以理解,这sort -rn | sed ${1}q可能不是提取常用词的最有效方法,但有什么不对tr -sc A-za-z '\n' | tr A-Z a-z?它看起来对我很好.关于sort | uniq -c,这是一种非常慢的确定频率的方法吗?

一些注意事项:

  • tr 应该是线性时间(?)
  • sort我不确定,但我认为它不是那么糟糕
  • uniq 也应该是线性时间
  • 产卵过程应该是线性时间(在过程数量上)

sorting algorithm shell knuth word-frequency

14
推荐指数
2
解决办法
2686
查看次数

位板到titboard(三元位板)转换

在许多棋盘游戏中(如跳棋,go和othello/reversi),每个方块可以用三种状态表示:白色,黑色空白.

这种游戏引擎中的8x8板通常表示为两个位板:一个64位整数用于白色位置,另一个64位整数用于黑色.

然而,当存储本地游戏模式时,这种二进制表示可能需要大量空间.例如,为8平方行的所有可能值创建查找表将需要具有256*256 = 4 ^ 8 = 65536值的数组,而仅有3 ^ 8 = 6561个可能位置(因为正方形永远不可能是被黑色和白色片段占据).

另一种方法是将电路板存储为三元数 - 所谓的标题.但我没有找到任何在两个二进制整数表示和三元整数表示之间转换的快速算法.

因此,我的问题是

有没有一种有效的方法来转换(编码)三个数字中的两个互斥二进制数(w & b == 0),这样每个唯一的这样的整数对将被映射到一个唯一的整数?(最好用C/C++.)

Python示例

是我的Python解决方案:

white_black_empty = lambda w, b: int(format(w, 'b'), base=3) + \
                                 int(format(b, 'b'), base=3)*2
Run Code Online (Sandbox Code Playgroud)

示例值:

  • w = 1010001 2 = 81
  • b = 0100100 2 = 36
  • 结果= 1010001 3 + 0100100 3*2 = 1010001 3 + 0200200 3 = 1210201 3 = …

c algorithm math ternary bitboard

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

Python PIL:字体粗细和样式

在我的电脑上,我只有一个用于Ubuntu Condensed字体的文件.即:

/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf 
Run Code Online (Sandbox Code Playgroud)

但是,在LibreOffice中,我可以将此字体设为粗体和斜体: 在此输入图像描述

Ubuntu字体测试器网页上,我还可以为Ubuntu Condensed系列设置不同的字体粗细(即常规和粗体)和不同的字体样式(即正常和斜体).在CSS中,这可能转化为:

/* CSS for bold and italic Ubuntu Condensed font */
font-family: Ubuntu Condensed;
font-style: italic;
font-weight: 700;
Run Code Online (Sandbox Code Playgroud)

要么:

/* CSS for regular and normal Ubuntu Condensed font */
font-family: Ubuntu Condensed;
font-style: normal;
font-weight: 400;
Run Code Online (Sandbox Code Playgroud)

但是,当谈到Python的PIL/Pillow时,我找不到ImageFont中任何可以修改字体样式和/或重量的工作选项,除了ImageFont.truetype()函数加载不同的字体文件.

对于"常规"Ubuntu字体(不是Condensed),我可以加载四个单独文件中的一个,以在Python中获得普通,粗体,斜体和粗体+斜体样式:

/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttf
Run Code Online (Sandbox Code Playgroud)

但不适用于Ubuntu Condensed.

所以问题是,是否可以在PIL/Pillow中使用粗体和/或斜体Ubuntu Condensed字体绘制图像?或者至少可以生成四个Ubuntu Condensed文件,以便它可以像Python中的Ubuntu字体一样使用?

python fonts truetype python-imaging-library pillow

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

如何使用wavio将双通道wav文件的每个通道分成两个不同的文件?或另一个图书馆?

以下脚本可以播放原始文件.我尝试以明显的方式分离每个频道,但它不起作用.

import os
import wavio
import numpy
import pyglet

file_name = "guitarup_full.wav"

# I get the file !
File = wavio.read(file_name)
rate = File.rate
# it looks good
print File.data.shape
print rate
# and then the channels:
channel_1 = File.data[:,0]
channel_2 = File.data[:,1]
wavio.write("guitar_channel_1.wav", channel_1, rate )
wavio.write("guitar_channel_2.wav", channel_2, rate )

# now we try to play:
source =  pyglet.resource.media(file_name, streaming=False)
source_ch1 =  pyglet.resource.media("guitar_channel_1.wav", streaming=False)
source_ch2 =  pyglet.resource.media("guitar_channel_2.wav", streaming=False)

#uncomment the one you want to listen.
source.play()
#source_ch1.play()
#source_ch2.play()

pyglet.app.run() …
Run Code Online (Sandbox Code Playgroud)

python pyglet wav

3
推荐指数
3
解决办法
3651
查看次数

C/C++ 表达式运算符优先级的括号计算器

在将一些混淆的 C 代码移植到 C++(即Harm Geert Muller 的Fairy-Max国际象棋引擎)后,我收到了很多类似于以下的警告:

建议在 '&' [-Werror=parentheses] 的操作数中的比较周围加上括号

建议在“&”的操作数中将“+”括起来

虽然关闭警告不是一个选项,但解决方案是根据运算符优先级在表达式中添加括号。

例如:

if(z&S&&!ab&K==INF&d>2&v>V&v<Beta){
Run Code Online (Sandbox Code Playgroud)

需要改成这样:

if((z&S) && ((!ab)&(K==INF)&(d>2)&(v>V)&(v<Beta))) {
Run Code Online (Sandbox Code Playgroud)

但是手动执行此操作非常耗时。

我尝试使用这个clang-format内部使用的反混淆工具,但它没有在表达式中添加括号......

是否有一种工具(最好是在线的)可以将 C/C++ 表达式作为输入并返回一个无警告的等效表达式作为输出?

c c++ operator-precedence deobfuscation

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

提取关键帧| Python | Opencv的

我目前正在从视频中提取关键帧。

代码:

while success:
    success, currentFrame = vidcap.read()
    isDuplicate = False
    limit = count if count <= 10  else (count - 10)
    for img in xrange(limit, count):
        previusFrame = cv2.imread("%sframe-%d.png" % (outputDir, img))
        try:
            difference = cv2.subtract(currentFrame, previusFrame)
        except:
            pass
Run Code Online (Sandbox Code Playgroud)

这给了我很多相框。预期输出:计算帧之间的像素差异,然后将其与阈值进行比较并存储唯一的关键帧。

首次处理视频。请指导如何实现预期的输出

python video opencv keyframe image-segmentation

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