【问题标题】:I successfully compiled my program. Now how do I run it?我成功编译了我的程序。现在我该如何运行它?
【发布时间】:2015-06-05 13:48:13
【问题描述】:

我要解决Project EulerProblem 1

如果我们列出所有小于 10 且是 3 或 5 倍数的自然数,我们会得到 3、5、6 和 9。这些倍数之和是 23。

求1000以下所有3或5的倍数之和。

这是我的代码:

\documentclass[10pt,a4paper]{article}
\usepackage{hyperref}
\newcommand*\rfrac[2]{{}^{#1}\!/_{#2}}
\title{Solution to Project Euler Problem 1}
\author{Aadit M Shah}
\begin{document}
\maketitle
We want to find the sum of all the multiples of 3 or 5 below 1000. We can use the formula of the $n^{th}$ triangular number\footnote{\url{http://en.wikipedia.org/wiki/Triangular_number}} to calculate the sum of all the multiples of a number $m$ below 1000. The formula of the $n^{th}$ triangular number is:

\begin{equation}
T_n = \sum_{k = 1}^n k = 1 + 2 + 3 + \ldots + n = \frac{n (n + 1)}{2}
\end{equation}

If the last multiple of $m$ below 1000 is $x$ then $n = \rfrac{x}{m}$. The sum of all the multiples of $m$ below 1000 is therefore:

\begin{equation}
m \times T_{\frac{x}{m}} = m \times \sum_{k = 1}^{\frac{x}{m}} k = \frac{x (\frac{x}{m} + 1)}{2}
\end{equation}

Thus the sum of all the multiples of 3 or 5 below 1000 is equal to:

\begin{equation}
3 \times T_{\frac{999}{3}} + 5 \times T_{\frac{995}{5}} - 15 \times T_{\frac{990}{15}} = \frac{999 \times 334 + 995 \times 200 - 990 \times 67}{2}
\end{equation}
\end{document}

我使用pdflatex编译成功:

$ pdflatex Problem1.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014/Arch Linux) (preloaded format=pdflatex)
.
.
.
Output written on Problem1.pdf (1 page, 106212 bytes).
Transcript written on Problem1.log.

它生成了以下输出 PDF 文件以及一堆带有可怕扩展名的其他文件:

如何运行此 PDF 文件以计算解决方案?我知道问题的解决方案,但我想知道如何执行 PDF 文件来计算解决方案。

我之所以喜欢 LaTeX 而不是其他编程语言是因为它支持literate programming,这是Donald Knuth 引入的一种编程方法,TeX 的创建者和有史以来最伟大的计算机科学家之一。

编辑:如果能够在屏幕上或纸上打印计算出的解决方案也将是一件好事。在不打印的情况下计算解决方案对于加热房间很有用,但随着夏季和全球变暖的到来,它已经很热了。此外,打印解决方案会教我如何用 LaTeX 编写一个 hello world 程序。

【问题讨论】:

  • “愚人节”标签...? :)
  • 这不是很明显吗?你需要编译成postscript,而不是pdf,然后你可以在你的打印机上运行程序。
  • 也许只是复制粘贴到 Wolfram Alpha 中。这就是所有大数学天才的做法。
  • 很抱歉对这个“愚人节”问题投票 - 但我认为这有点离题
  • 我认为这可以使用内置的 Linux 功能轻松解决。只需执行以下操作: Problem1.tex > /dev/null; /dev/urandom > Problem1-Solution.txt

标签: javascript pdf compilation


【解决方案1】:

所以,今天似乎是解决这个问题的安全日子......


OP 似乎并不那么精通PDF。 然而,他显然是一个非常有文化的 LaTeX 人。 这意味着,他也一定非常了解 TeX,因为他是 Donald Knuth 的崇拜者......

预赛就这么多。 现在是真正的肉。

首先,引用the official PDF-1.7 specification文档:

PDF 不是编程语言,PDF 文件也不是程序。
(第 92 页,第 7.10.1 节)

然而,PDF 格式的前身 PostScript,IS 是一种 Turing-complete 编程语言……图灵完备,就像 TeX 一样,Donald Knuth 是有史以来最伟大的计算机科学家之一。

另一方面,PostScript 文件是 ARE 程序,并且可以很容易地由 PostScript 打印机执行(尽管无法提前可靠地确定此执行时间)。

因此,第二,OP 应该能够找到将他的高级 LaTeX 代码转换为低级 TeX 代码的方法。 该代码需要发出 PostScript 程序,而该程序又可以由 PostScript 打印机执行。 对于像 OP 这样的人来说,编写 TeX 代码应该是微不足道的,一旦他获得了应该是他的 TeX 代码结果的 PostScript 代码。

我自己对问题解决过程的 TeX 方面并不十分熟悉。 不过,我可以帮忙处理 PostScript。

OP 的 TeX 代码应该生成的 PostScript 是这样的(肯定有更优化的版本可能——这只是第一次,快速的'n'dirty):

%!PS

% define variables
/n1 999 def
/t1 334 def
/n2 995 def
/t2 200 def
/n3 990 def
/s1  67 def
/t3   2 def

% run the computational code
n1 t1 mul
n2 t2 mul
n3 s1 mul
sub
add
t3    div

% print result on printer, not on <stdout>
/Helvetica findfont
24 scalefont
setfont
30 500 moveto
(Result for 'Project Euler Problem No. 1' :) show 
/Helvetica-Bold findfont
48 scalefont
setfont
80 400 moveto
(                   ) cvs show 
showpage

将此 PostScript 代码发送到 PostScript 打印机,它将计算并打印解决方案。


更新

回答其中一个问题:如果您用简单的print 语句替换以/Helvetica findfont 开头的PostScript 代码的最后一部分,它不会像您想象的那样做。

print 不会导致打印机输出纸张。相反,它要求 PostScript 解释器将堆栈上的最顶层项(必须是 (string)!)写入标准输出通道。 (如果栈顶元素的类型不是(string),则会触发typecheck PostScript 错误。)

因此,将修改后的 PostScript 文件(print 替换了我 PS 代码的最后一部分)发送到打印机将无法正常工作(除非打印机支持交互式 executive PostScript 模式 - - 这不是 PostScript 语言的标准部分)。但是,如果您将该文件提供给终端中的 Ghostscriptcmd.exe 窗口,它将起作用。

【讨论】:

  • 嘿,Kurt,很遗憾 PDF 既不是编程语言也不是程序。至少现在我知道我需要将我的 LaTeX 代码转换为 TeX 代码,它会生成一个 PostScript 文件,用于计算和打印解决方案。我更新了我的问题以反映这样一个事实,即我不仅要计算解决方案,还要打印它。感谢您提供 PostScript 代码。这很有帮助。
  • 那么你还是这样做了,尽管我的快速'n'脏 PostScript 代码中仍然存在拼写错误。没有测试运行它(仍然没有),但现在我发现了两个错误。现在修复...
  • 还是错了。它应该是n1 t1 mul n2 t2 mul n3 s1 mul sub add t3 div(即第一个add 应该是sub,如果我没记错的话)。使用串联编程语言的问题。
  • 我可以在表达式后添加print 以将其打印出来(即... sub add t3 div print)吗?我对 PostScript 了解不多。
  • 我检查了PDF reference 1.7 at adobe.com,“PDF 不是编程语言”的引用似乎实际上在第 166 页第 3.9 节中。
【解决方案2】:

您无法运行 pdf 文件。您需要使用latex 命令而不是pdflatex。例如

latex Problem1.tex

Here's some documentation

【讨论】:

  • 愚蠢的我。没看到标签。但这里只有 3/31 :)
猜你喜欢
  • 2014-06-22
  • 2012-05-23
  • 2023-03-09
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2011-01-22
  • 2022-12-21
相关资源
最近更新 更多