为了提高我的 Haskell 技能,我正在尝试解决Code 2018的出现。正如预期的那样,我已经被困在第 1 天,特别是第 2 部分:
- - 第二部分 - -
您会注意到设备一遍又一遍地重复相同的频率更改列表。
要校准设备,您需要找到它达到的第一个频率两次。
例如,使用上面相同的更改列表,设备将循环如下:
当前频率0,变化+1;结果频率 1。
当前频率1,变化-2;结果频率-1。
当前频率-1,变化+3;结果频率 2。
当前频率2,变化+1;结果频率 3.
(此时,设备从列表的开头继续。)
当前频率3,变化+1;结果频率 4.
当前频率4,变化-2;结果频率 2,这已经被看到了。
在这个例子中,第一个达到两次的频率是
2。请注意,在找到重复频率之前,您的设备可能需要多次重复其频率更改列表,并且在处理列表的过程中可能会发现重复项。以下是其他示例:
+1, -1 首先达到 0 两次。
+3、+3、+4、-2、-4 首先达到 10 两次。
-6、+3、+8、+5、-6 首先达到 5 两次。
+7, +7, -2, -7, -4 首先两次达到 14。
您的设备达到两次的第一个频率是多少?
基本上,我有一个非常大的列表vals::[Int],其中包括上面提到的所有频率变化。
这是我为解决此问题而编写的函数:
-- [1] The list of frequency changes
-- [2] The first repeat frequency
-- [1] [2]
part2helper :: [Int] …Run Code Online (Sandbox Code Playgroud) 我已经完成了这个Megaparsec教程,现在我正在尝试编写自己的解析器.我想为编写汇编语言编写一个简单的解析器:
Label: lda $0ffe
sta %10100110
push $01, $02, $03
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的简单数据类型:
-- Syntax.hs
module Syntax where
import Data.Int
-- |A program is made up of one or more source lines
type Program = [SourceLine]
data SourceLine = SourceLine
{ label :: Maybe String -- ^ Each line may contain a label
, instr :: Maybe String -- ^ This can either be an opcode or an assembler directive
, operand :: Maybe String -- ^ The opcode/instruction may …Run Code Online (Sandbox Code Playgroud)