主页

博客转移笔记


#编程#博客

你如果关注这个博客,可能已经发现我很长时间没有发新的文章了。这是大部分因为,自寒假以来,我就一直在寻找更好的静态博客框架。Hexo 已经不再活跃更新,而且其功能也不能满足我的需求。那么为什么拖了这么长时间才完成迁移呢?在这段时间内,我尝试了很多种框架,包括自己写生成器。下面就是我的迁移路线——

继续阅读»

用 LxRunOffline 安装 Arch Linux

前段时间重装系统之后我就一直在 WSL 内开发。Ubuntu 因为我不喜欢所以直接放弃(???),所以就一直在用 openSUSE。然而现在越用越感觉 zypper 的下载源坑爹……于是在 Github 上一阵搜索之后,我终于找到了这个神器:LxRunOffline。于是我毅然卸载了 openSUSE,开始尝试安装 Arch Linux……

(2018-07-25 修改,原文见 Github

继续阅读»

Project Euler 欧拉计划 62 Cubic permutations 解题记录

立方数 41063625(3453345 ^ 3)可以重排为另外两个立方数:56623104(3843384 ^ 3)和 66430125(4053405 ^ 3)。实际上,41063625 是重排中恰好有三个立方数的最小立方数。

求重排中恰好有五个立方数的最小立方数。

题目转载于 pe-cn.github.io,英文原站:projecteuler.org

思路

就是暴力搜索。记录下每种重排的出现次数,最先到达 5 次的就是结果。

题解

Github:ProjectEuler.hs

answer62_1 :: String
answer62_1 = search 0 1 [] cubes
  where -- 立方数的列表
        -- :: [(String, 原立方数
        --      String)] 排序后的立方数
        cubes = [(c, sort c) | x <- [1..], let c = show $ x * x * x]
        -- 搜索函数
        -- :: Int 立方数的位数
        -- -> [(String, String, Integer)] 保存搜索结果
        -- -> [(String, String)] 立方数列表
        -- -> String 答案
        search x l cs @ ((n, c) : r)
          -- 若立方数位数增加,清空搜索结果再继续
          | length c > x = search (x + 1) [] cs
          -- 否则把当前立方数加入搜索结果
          | otherwise = let (nl, t, nr) = add c n l []
                         in -- 若当前处理的立方数的重排已出现 5 次,
                            -- 则返回这个立方数的最小重排
                            if t == 5 then nr
                            -- 否则继续搜索
                            else search x nl r
        -- 处理搜索结果
        -- :: String 排序好的立方数
        -- -> String 原立方数
        -- -> [(String, String, Integer)] 原搜索结果
        -- -> [(String, String, Integer)] 新的搜索结果
        -- -> ([(String, String, Integer)], 处理完成的搜索结果
        --     Integer, 当前处理的立方数的重排的出现次数
        --     String) 当前处理的立方数的最小立方数重排
        add c n ((tu @ (c', n', t)) : r) res
          -- 若当前处理的立方数的重排已出现过,
          -- 则在搜索结果中把记录的出现次数加 1,返回结果
          | c == c' = (r ++ (c', n', t + 1) : res, t + 1, n')
          | otherwise = add c n r (tu : res)
        -- 若当前处理的立方数的重排是第一次出现,
        -- 则在搜索结果中加入这一记录,返回结果
        add c n [] res = ((c, n, 1) : res, 1, "")

测试环境

  • 操作系统:Windows 10 Pro Insder Preview Build 16199
  • Haskell 编译环境:GHC 8.0.2
前往评论»

TCOC006 补充:用 Haskell 优雅地生成杨辉三角

这几天又想了一下上一期 TCOC 中的第二题 欧拉计划 Problem 15 Lattice paths。突然想到,由于 Haskell 的惰性,所以我就可以用一种非常优雅的方式来生成杨辉三角:

pascalsTriangle :: Integral a => [[a]]
pascalsTriangle = generate $ repeat 1
  where generate xs = xs : generate (generateRaw 1 $ tail xs)
        generateRaw l (u : r) = let n = l + u
                                  in l : generateRaw n r

于是这一题就可以这样做:

main :: IO ()
main = print (pascalsTriangle !! 20 !! 20)

无比简单优雅!

从这里就可以看出,Haskell 里的无限列表在解决这类数学问题时是非常好用的,以后这类问题可以多从这个方向思考。

测试环境

  • 操作系统:x86_64 Linux 4.10.13-1-ARCH
  • Haskell 编译环境:ghc 8.0.2
前往评论»

TCOC002 简单的数学题

上一期 做的题是 OI 题。这类题目可能对 Scala、Haskell 这类函数式的编程语言有点不公平。所以这个系列同时也会做一些其他题目。这一期的题目是 欧拉计划 的前两题。欧拉计划中的题目都是数学题,这类题目会比较适合用函数式的风格来写。这两题也是比较简单的,这里我会用多种方法进行求解。

继续阅读»

the Collision of Code: 代码碰撞——在博客水更多文章的尝试[雾]

上一篇文章已经是去年八月份的了。过了半年才想起要在这写文章真是不好意思~

那么就直入正题吧!这次是要开一个系列坑,主要就是通过用各种不同的语言、不同的方法来做同一道题,来体现不同思想之间的区别,同时提高我的编程技术。「代码碰撞」这名字就是这么来的。

第一篇先写点简单的吧,先写 洛谷 上「新手村」的第一个任务。有三道题,分别是「A+B Problem」「小玉买文具」「小鱼的游泳时间」

选这么简单的题目是为了比较简单地导入这些语言,求勿喷~

继续阅读»