Scala趣味程式設計 列印古詩歌

2021-08-04 11:38:42 字數 1578 閱讀 2124

上次用scala做了一道數學題,今天我們來列印一下古詩,你會發現函式式程式設計在資料處理中的妙用,居然只用一行**就搞定了,不要太爽。

我們列印的列印函式要實現將輸入的橫排詩歌列印成從右到左的豎排版。

例如:」故人西辭黃鶴樓烟花三月下揚州孤帆遠影碧空盡唯見長江天際流「

列印成:

唯 孤 煙 故

見 帆 花 人

長 遠 三 西

江 影 月 辭

天 碧 下 黃

際 空 揚 鶴

流 盡 州 樓

**:

defprintpoem(txt:string

, offset:int) =

txt.zipwithindex.groupby(_._2%offset).toarray.sortwith(_._1 < _._1).foreach(

a => println(a._2.map(_._1).reverse.mkstring(" "))

)printpoem("故人西辭黃鶴樓烟花三月下揚州孤帆遠影碧空盡唯見長江天際流"

, 7)

處理的大致流程:將字串中的字元通過zipwithindex程式設計對偶序列,然後通過下標轉換成map,需要對map中的類容進行排序,然後分行列印。我們來看下每次函式操作後的內容,以便更好理解操作流程:

txt.zipwithindex
輸出:(故,0),(人,1),(西,2),(辭,3),(黃,4),(鶴,5),(樓,6),(煙,7),(花,8),(三,9),(月,10),(下,11),(揚,12),(州,13),(孤,14),(帆,15),(遠,16),(影,17),(碧,18),(空,19),(盡,20),(唯,21),(見,22),(長,23),(江,24),(天,25),(際,26),(流,27)

groupby
0 -> vector((故,0), (煙,7), (孤,14), (唯,21)),5 -> vector((鶴,5), (揚,12), (空,19), (際,26)),1 -> vector((人,1), (花,8), (帆,15), (見,22)),6 -> vector((樓,6), (州,13), (盡,20), (流,27)),2 -> vector((西,2), (三,9), (遠,16), (長,23)),3 -> vector((辭,3), (月,10), (影,17), (江,24)),4 -> vector((黃,4), (下,11), (碧,18), (天,25))

.toarray.sortwith(_._1 < _._1)
(0,vector((故,0), (煙,7), (孤,14), (唯,21))),(1,vector((人,1), (花,8), (帆,15), (見,22))),(2,vector((西,2), (三,9), (遠,16), (長,23))),(3,vector((辭,3), (月,10), (影,17), (江,24))),(4,vector((黃,4), (下,11), (碧,18), (天,25))),(5,vector((鶴,5), (揚,12), (空,19), (際,26))),(6,vector((樓,6), (州,13), (盡,20), (流,27)))

.foreach
得到最後結果

趣味程式設計 螺旋列印

給定乙個自然數n,列印1 n之間所有的數,要求 按螺旋形狀順時針列印。以前看到過這道題,說的是從外向內螺旋列印,而前幾天又看到乙個變種,由內向外列印。比之前的稍微難一點,趁週末閒著沒事,總結一下。先上兩幅圖,大家看一下效果。這兩種輸出方法,其實大同小異,道理都差不多,會了一種,則另一種不難,先看從外...

趣味程式設計 過橋問題

過橋問題。有n n 2 個人在晚上需要從x地到達y地,中間要過一座橋,過橋需要手電筒 而他們只有1個手電筒 每次最多兩個人一起過橋 否則橋會垮 n個人的過橋時間依次存入陣列t n 中,分別為 t 0 t 1 t n 1 過橋的速度以慢的人為準!注意 手電筒不能丟過橋!問題是 程式設計求這n個人過橋所...

趣味程式設計題 猜算式

看下面的算式 x x 它表示 兩個兩位數相乘等於乙個兩位數乘以乙個三位數。如果沒有限定條件,這樣的例子很多。但目前的限定是 這9個方塊,表示1 9的9個數字,不包含0。該算式中1至9的每個數字出現且只出現一次!比如 46 x 79 23 x 158 54 x 69 27 x 138 54 x 93 ...