八股文写春联会是什么样子?

Posted Data-Mining

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八股文写春联会是什么样子?相关的知识,希望对你有一定的参考价值。

目录

什么是八股文

关于春联的常见说法

编程设计

1. 定义两个数组

2. 转换两个 map

3. 两种写春联方式

结论


什么是八股文

八股文(英译:Stereotyped Writing;Eight-Legged Essay),也称制义、制艺、时文、八比文,是明清科举考试的一种文体。八股文章就“四书五经”取题,内容必须用古人的语气,绝对不允许自由发挥,而句子的长短、字的繁简、声调的高低等也都要相对成文,字数也有限制。 八股文就是指文章的八个部分,文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成,题目一律出自四书五经中的原文。后四个部分每部分有两股排比对偶的文字,合起来共八股。旧时科举,八股文要用孔子、孟子的口气说话,四副对子平仄对仗,不能用风花雪月的典故亵渎圣人,每篇文章包括从起股到束股四个部分。——《百度百科》

后来,八股文被引申为“禁锢思想”、“死板僵化”的意思。如果用八股文写春联是什么样子呢?

关于春联的常见说法

  1. 平仄平仄平平仄,仄平仄平仄仄平。

  2. 天对地、雨对风、大陆对长空,雷隐隐对雾蒙蒙,开业大吉对万事亨通。

  3. 上对下,大对小,山花对海树,赤日对苍穹。

除此之外,当然还有很多别的规则,这里这是简单举例。本文以最小的闭环展开讨论。

先来看两幅比较不错的春联。

编程设计

如果简单按照常见的规则去写春联,很多时候是不合适的,本文把这种写春联的方式称为“八股文”。 那么,如何通过编程实现简单的八股文写春联呢?下面就来看一下。

1. 定义两个数组

首先,定义两个互相对照的数组,用来保存上述规则的字和词语,下面以 Go 语言为例进行举例:

// 上联
upArray := [...]string"天", "雨", "大陆", "上", "大", "山花", "赤日"
// 下联
blowArray := [...]string"地", "风", "长空", "下", "小", "海树", "苍穹"

注意,其实这两个数组可以很长很长,这里我们“点到为止”。

2. 转换两个 map

根据第一步中定义的两个数组,分别转换出对应的两个 map,两个 map 以数组的元素为 key,索引值 index 为 value 进行定义。相关代码如下:

// 上联
upMap := map[string]int
        "天": 0,
        "雨": 1,
        "大陆": 2,
        "上": 3,
        "大": 4,
        "山花": 5,
        "赤日": 6,
        "秋": 7,
    
   
// 下联
blowMap := map[string]int
        "地": 0,
        "风": 1,
        "长空": 2,
        "下": 3,
        "小": 4,
        "海树": 5,
        "苍穹": 6,
        "春": 7,
       

3. 两种写春联方式

第一种方式、自动生成春联

自动生成春联的方式就是自动生成上下联,编码实现的话,需要依赖上面提到的两个数组。实现思路是随机生成一段数字,然后把数字每位的数字作为数组索引下标,分别通过两个数组生成上下联。举例试一下,看看如何自动生成春联。

package main

import (
	"fmt"
	"math/rand"
    "time"
)

func main() 
	myRand := rand.New(rand.NewSource(time.Now().UnixNano()))
    // 随机生成数
	n :=myRand.Intn(1000)
	fmt.Println(n)

输出结果:235

生成对联代码如下:

package main

import (
	"fmt"
)

func main() 
	// 上联数组
	upArray := [...]string"天", "雨", "大陆", "上", "大", "山花", "赤日"
	// 下联数组
	blowArray := [...]string"地", "风", "长空", "下", "小", "海树", "苍穹"
	
	up := upArray[2]+upArray[3]+upArray[5]
	blow := blowArray[2]+blowArray[3]+blowArray[5]
	
	fmt.Println(up) // 大陆上山花
	fmt.Println(blow) // 长空下海树

那么,

上联就是:大陆上山花,

下联就是:长空下海树。

评价:语句对仗还算工整,含义嘛,差点意思。

第二种方式、根据上联对下联

这种方式就是根据已有的上联,自动对出下联。编码实现的话,需要依赖上面提到的两个数组和两个map。根据上联的字和词,分别遍历两个map得出对应的数组和索引值 index,再根据相对的数组和索引值 index 得出对应的下联。

下面通过一个例子来看一下,如果上联是“春风吹海树”,那么下联应该是“秋雨天山花”。貌似还差一个字儿没对上,但是如果原始字段足够多的话,其实也是可以对出下联的,可能就是含义上差点意思。代码实现如下:

package main

import (
	"fmt"
)

func main() 
	// 上联数组
	upArray := [...]string"天", "雨", "大陆", "上", "大", "山花", "赤日", "秋"
   
	// 下联map
	blowMap := map[string]int
		"地": 0,
		"风": 1,
		"长空": 2,
		"下": 3,
		"小": 4,
		"海树": 5,
		"苍穹": 6,
		"春":7 ,
	
	one := []int
	one = append(one, blowMap["春"])
	one = append(one, blowMap["风"])
	one = append(one, blowMap["吹"])
	one = append(one, blowMap["海树"])
	res := ""
	for i:=0; i<len(one); i++ 
		res += upArray[one[i]]
	
	
	fmt.Println(res)

结论

哈哈,目前看来纯八股文写春联多少还是不太靠谱,有太多的情况和意境很难融进去。当然我们也可以通过优化算法和改进实现方式来让程序写出更加优美,更加符合人类习惯的春联,比如利用大数据收集足够的素材,利用人工智能模拟人类习惯和风格“推算”出尽可能优美的春联。好了,关于八股文写春联的讨论就讲这么多。如果你有什么好点子,欢迎评论留言!最后,祝大家新年快乐,牛年大吉!


作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!😄

以上是关于八股文写春联会是什么样子?的主要内容,如果未能解决你的问题,请参考以下文章

如何区分对联

基于卷积神经网络VGG实现水果分类识别

对联一句——百花深处

对联一句——百花深处

Java代码写春联,支持各种字体颜色设置,比python还简单

Java代码写春联,支持各种字体颜色设置,比python还简单