【Godot4.3】題目與答案解析合并器

免責申明
本文和工具截圖中涉及題庫和題目,均為本人自學使用,并未有商業和傳播企圖。如有侵害,聯系刪改。

概述

筆者本人醫學專業從業人員,編程只是業余愛好。在自己的專業應考學習過程當中:

  • 有時候不太喜歡紙質題庫的排版,比如題目與答案分開,甚至是分開在兩本書上。
  • 想要翻錄下來,轉存到筆記軟件中,作為自己積累的一個題庫,而且方便隨時查看、修改和擴充筆記。

這項工作,我從2024年頭就開始實踐,并且已經積累了一定的題目量。作為專業學習和考試的專用復習資料。

翻錄操作

我的具體做法是:

  • 攤開書,翻頁,手機拍照后轉存PDF
  • 在WPS中進行掃描件識別,獲取文本
  • 在VSCode中進行批量替換和初步處理
  • 復制到筆記軟件(我用的是語雀),進行更詳細的優化排版
  • 學習和補充筆記,手機隨時查看記憶
  • 選擇性打印為冊子,方便查看

翻錄環節一直是很順暢和熟練的。但是,后續處理有時候比較麻煩。尤其是很多紙質題庫是將題目和參考答案以及解析分開的。手動排版是個海量的工作。因此,需要編程實現題目與答案的合并。

之前的Python版本

2024年11月11日創建的Python版本,其原理是:

  • 把題目和答案都預處理為---分隔的形式
  • 各自拆分為字符串數組,檢測題目總數和答案總數一致后,進行題目和答案解析的合并
# 讀取文件內容
def read_file(path):with open(path, 'r',encoding="utf-8") as file:content = file.read()return content# 讀取文件內容
def save_file(path,content):with open(path, 'w',encoding="utf-8") as file:content = file.write(content)# 獲取題目和答案合并的結果
def get_result(qus_path,ans_path):result = ""qus = read_file(qus_path) # 問題ans = read_file(ans_path) # 答案# 用 --- 劃分qus_arr = qus.split("---")ans_arr = ans.split("---")if len(qus_arr) == len(ans_arr): # 答案和題目數量一致# 遍歷生成合并字符串for i in range(len(qus_arr)):q = qus_arr[i]a = ans_arr[i]result += f"""{q}
:::tips
{a}
:::"""return resultsave_file("result.md",get_result("qus.txt","ans.txt"))

這個版本的壞處的,必須依靠VSCode和工作目錄,并且需要將題目和答案分別存儲到固定名稱的文件中。

而字符串處理的大部分操作還是需要手動在VSCode中進行。

創建Godot版本

為了更方便快捷的合并,編寫了一個簡單的Godot應用。

  • 用Godot創建合并器,以復制粘貼文本形式,而不是文件形式,處理起來會更靈活。
  • 而且代碼和處理的靈活性也會進一步上升

初步界面設計

初期界面規劃

初步實現

extends HSplitContainer
@onready var qus_txt: TextEdit = %qusTxt
@onready var ans_txt: TextEdit = %ansTxt
@onready var result_txt: TextEdit = %resultTxt# ================================= 按鈕點擊 =================================
# 整體添加分隔線
func _on_splits_btn_pressed() -> void:qus_txt.text = add_splits(qus_txt.text)ans_txt.text = add_splits(ans_txt.text)# 執行合并
func _on_join_btn_pressed() -> void:result_txt.text = do_joins_result(qus_txt.text,ans_txt.text)pass# ================================= 自定義方法 =================================
# 查找題目或答案序號,并添加 --- 分隔符
func add_splits(old_str:String) -> String:var regex = RegEx.new()regex.compile(r"\n\d\.")for result in regex.search_all(old_str):var res = result.get_string()old_str = old_str.replace(res,"\n --- %s" % res)return old_str# 執行合并
func do_joins_result(qus_str:String,ans_str:String) -> String:var result:PackedStringArray = []var qus_arr = qus_str.split("---",false)var ans_arr = ans_str.split("---",false)if qus_arr.size() == ans_arr.size(): # 題目數量與答案解析數量一致# 遍歷生成合并字符串for i in range(qus_arr.size()):var qus = qus_arr[i]var ans = ans_arr[i]result.append(qus_ans_str(qus,ans))return "\n".join(result)# 根據模版字符串生成題目和答案解析的合并字符串
func qus_ans_str(qus:String,ans:String) -> String:var tmp = """%s
:::tips
%s
:::""" % [qus,ans]return tmp

已經實現基礎的題目與答案解析合并功能,復制到語雀自動識別后,也是可以正常顯示:

編寫處理類

上面將處理邏輯編寫為三個函數,混雜在主場景中,顯得并不優秀。

好的辦法是進一步編寫類,來固定處理相似的邏輯。這樣也就讓邏輯和UI部分分離了。

新類設想

  • 新的類將自動處理輸入的普通的題目和答案解析字符串,并維護題目和答案兩個數組
  • 將可以編寫簡單的題庫系統,順序查看題目和答案

新類實現

# =========================================================
# 名稱:QusAnsList
# 類型:GDSCript類
# 描述:解析和處理普通的題目和答案解析字符串,生成合并字符串的處理類
# Godot版本:v4.3.stable.steam [77dcf97d8]
# 創建時間:202521213:08:13
# 最后修改時間:202521221:38:46
# =========================================================
class_name QusAnsList
# 切分后的題目與答案集合
var qus_arr:PackedStringArray
var ans_arr:PackedStringArray# 原始字符串
var qus_str:String
var ans_str:String
# 添加分隔符后的字符串
var split_qus_str:String
var split_ans_str:String# 創建實例
func _init(qus_str:String,ans_str:String) -> void:self.qus_str = inline_opts(qus_str)self.ans_str = ans_str# 添加分隔線self.split_qus_str = add_lines(self.qus_str,true)self.split_ans_str = add_lines(ans_str)# 分割添加了分隔線的字符串,獲得題目與答案集合splits()# ================================ 方法 ================================# 將ABCDE選項放置到一行
func inline_opts(old_str:String) -> String:var new_str = old_strfor opt in ["B","C","D","E"]:new_str = new_str.replace("\n%s." % opt,"%s%s." % ["\t".repeat(2),opt])return new_str# 查找題目或答案序號,并添加 --- 分隔符
# old_str 要添加分隔符的原始字符串
# ignore_first 是否忽略第一項,用于題目序號不是在第一行的情況
func add_lines(old_str:String,ignore_first:=false) -> String:# 創建對序號的正則匹配var regex = RegEx.new()regex.compile(r"\n\d+\.")# 遍歷所有搜索到的序號,替換為 --- var results = regex.search_all(old_str)for i in range(results.size()):if ignore_first and i==0: # 忽略第一次continuevar res = results[i].get_string()old_str = old_str.replace(res,"\n---%s" % res)return old_str# 分割添加了分隔線的字符串獲得題目與答案集合
func splits() -> void:qus_arr = split_qus_str.split("\n---\n",false)ans_arr = split_ans_str.split("\n---\n",false)# 檢測題目與答案集合的數目是否相等
func is_qus_equal_ans_count() -> bool:return qus_arr.size() == ans_arr.size()# 獲取執行合并的字符串
func get_joins_result() -> String:var result:PackedStringArray = []if qus_arr.size() == ans_arr.size(): # 題目數量與答案解析數量一致# 遍歷生成合并字符串for i in range(qus_arr.size()):var qus = qus_arr[i]var ans = ans_arr[i]result.append(qus_ans_str(qus,ans))return "\n".join(result)# 根據模版字符串生成題目和答案解析的合并字符串
func qus_ans_str(qus:String,ans:String) -> String:var tmp = """%s
:::tips
%s
:::""" % [qus,ans]return tmp

基于新類,主場景的代碼簡化如下:

extends HSplitContainervar QAlist:QusAnsList
var current_index:int = 0@onready var qus_txt: TextEdit = %qusTxt
@onready var ans_txt: TextEdit = %ansTxt
@onready var result_txt: TextEdit = %resultTxt
@onready var tk_qus_txt: CodeEdit = %tkQusTxt
@onready var tk_ans_txt: CodeEdit = %tkAnsTxt# ================================= 按鈕點擊 =================================# 執行合并
func _on_join_btn_pressed() -> void:QAlist = QusAnsList.new(qus_txt.text,ans_txt.text)result_txt.text = QAlist.get_joins_result()# 題庫顯示第一題show_tk_qus_ans(0)# 題庫顯示指定的第幾題
func show_tk_qus_ans(index:int) -> void:tk_qus_txt.text = QAlist.qus_arr[index]tk_ans_txt.text = QAlist.ans_arr[index]# 顯示上一題
func _on_last_btn_pressed() -> void:current_index = clamp(current_index-1,0,QAlist.qus_arr.size()-1)show_tk_qus_ans(current_index)# 顯示下一題
func _on_next_btn_pressed() -> void:current_index = clamp(current_index+1,0,QAlist.qus_arr.size()-1)show_tk_qus_ans(current_index)

程序效果

一鍵處理和合并題目與答案

  • 生成合并字符串并進行展示,可以復制到語雀中自動識別和排版

生成題庫預覽

  • 因為新類內部維護兩個數組,存儲題目和答案
  • 所以可以搭建簡易的題庫預覽界面,來按順序查看每一道題目

后續改進

界面分開

  • 將界面分為合并器和題庫預覽兩部分,通過頂欄的按鈕進行界面的切換

分開后的合并器主界面

分開后的題庫預覽界面,字號做了相應放大

題號列表

  • 只通過上一題,下一題查看題庫并不方便,可以生成題號按鈕,點擊快速查看。

修改題庫預覽界面樣式

  • 兩邊留白,讓視野寬度略小于屏幕寬度,中心聚焦且看的不是太累。

刷題計時器

  • 設計一個簡單的刷題計時器,可以重置、開始、暫停,用以記錄刷題時間
  • 首先是編寫一個函數獲取累計時間的HH:MM:SS形式字符串
# 返回累計時間的時分秒的字符串形式 HH:MM:SS
func get_time_str(time:int) -> String:var dic = Time.get_time_dict_from_unix_time(time)return "%02d:%02d:%02d" % [dic["hour"],dic["minute"],dic["second"]]
# 返回累計時間的時分秒的字符串形式 HH小時MMSS秒
func get_time_str(time:int) -> String:var dic = Time.get_time_dict_from_unix_time(time)return "%02d小時%02d分%02d秒" % [dic["hour"],dic["minute"],dic["second"]]
  • 接著就是使用和控制Timer節點顯示累計時間

UI美化

加載和保存題庫

  • 題庫文件是題目和答案用特殊解析字符串#================;所連接的純文本文件

總結

  • 至此,意為著利用純文本形式的題目和答案字符串,快速合并獲得適用于語雀顯示的格式將變得異常方便
  • 同時,可以以非常簡便的方式創建刷題系統。只需要維護和保存一堆.txt文件即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70556.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Lm studio本地部署DeepSeek

為什么用Lm studio Ollama官網下載過慢或失敗(Lm默認下載源無法下載,但可以更換下載源)Ollama默認安裝至C盤一部分Nivida顯卡無法吃滿顯存資源一部分AMD顯卡替換rocm文件后無法啟動 Lm studio安裝 官網下載:LM Studio - Discov…

基于Qlearning強化學習的2DoF機械臂運動控制系統matlab仿真

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1 2DoF機械臂運動學模型 2.2 Q-learning強化學習算法原理 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2022a仿真結果如下(完整代碼運行后無水印): 仿真操作步驟可參…

Unity貼圖與模型相關知識

一、貼圖 1.貼圖的類型與形狀 貼圖類型 貼圖形狀 2.在Unity中可使用一張普通貼圖來生成對應的法線貼圖(但并不規范) 復制一張該貼圖將復制后的貼圖類型改為Normal Map 3.貼圖的sRGB與Alpha sRGB:勾選此選項代表此貼圖存儲于Gamma空間中…

快速上手 Unstructured:安裝、Docker部署及PDF文檔解析示例

1. 核心概念 1.1 Unstructured簡介 Unstructured 是一個強大的 Python 庫,專注于從非結構化數據中提取和預處理文本信息,廣泛應用于 PDF、Word 文檔、HTML 等多種格式的文件處理。其核心功能包括分區、清理、暫存和分塊,能夠將復雜的非結構化文檔轉換為結構化輸出,為后續…

pyecharts介紹

文章目錄 介紹安裝pyecharts基本使用全局配置選項 折線圖相關配置地圖模塊使用柱狀圖使用 介紹 echarts慮是個由百度開源的數據可視化,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可,而Pyhon是門富有表達力的語言&a…

Fisher信息矩陣與Hessian矩陣:區別與聯系全解析

Fisher信息矩陣與Hessian矩陣:區別與聯系全解析 在統計學和機器學習中,Fisher信息矩陣(FIM)和Hessian矩陣是兩個經常出現的概念,它們都與“二階信息”有關,常用來描述函數的曲率或參數的敏感性。你可能聽說…

python與C系列語言的差異總結(1)

/ 表示浮點除法 // 表示整數除法 print(8/3)print(8//3)布爾型 False/True 首字母大寫 整數的大小是沒有限制的,會根據需要自動增長,僅受限于可用內存的大小。 m**n表示m的n次方 x 4.3 ** 2.4print(x)print(3.5e30 * 2.77e45)print(1000000001.0 *…

Python selenium 庫

Selenium 是一個用于自動化 Web 瀏覽器操作的強大工具,廣泛應用于 Web 應用程序測試、網頁數據抓取和任務自動化等場景。 Selenium 為各種編程語言提供了 API,用作測試。 目前的官方 API 文檔有 C#、JavaScript、Java、Python、Ruby。 安裝 Selenium 和…

vllm部署LLM(qwen2.5,llama,deepseek)

目錄 環境 qwen2.5-1.5b-instruct 模型下載 vllm 安裝 驗證安裝 vllm 啟動 查看當前模型列表 OpenAI Completions API(文本生成) OpenAI Chat Completions API(chat 對話) vllm 進程查看,kill llama3 deep…

Python NumPy庫使用指南:從入門到精通

1. 引言 NumPy(Numerical Python)是 Python 中用于科學計算的核心庫之一。它提供了強大的多維數組對象(ndarray),以及一系列高效的數學函數,能夠輕松處理大規模的數值數據。NumPy 是許多其他科學計算庫(如 Pandas、Matplotlib、Scikit-learn 等)的基礎。 本文將詳細介…

15.2 智能銷售顧問系統技術架構解密:構建企業級知識驅動型對話引擎

智能銷售顧問系統技術架構解密:構建企業級知識驅動型對話引擎 關鍵詞:RAG 架構設計、銷售知識庫系統、LoRA 微調優化、多模態交互引擎、高并發服務部署 1. 系統技術架構全景解析 1.1 核心架構設計圖 #mermaid-svg-UBkTgaR5lf5WfGMa {font-family:"trebuchet ms",…

用PyTorch從零構建 DeepSeek R1:模型架構和分步訓練詳解

DeepSeek R1 的完整訓練流程核心在于,在其基礎模型 DeepSeek V3 之上,運用了多種強化學習策略。 本文將從一個可本地運行的基礎模型起步,并參照其技術報告,完全從零開始構建 DeepSeek R1,理論結合實踐,逐步…

爬蟲基礎入門之爬取豆瓣電影Top250-Re正則的使用

網址:豆瓣電影 Top 250 本案例所需要的模塊 requests (用于發送HTTP請求)re (用于字符串匹配和操作) 確定需要爬取的數據 : 電影的名稱電影的年份電影的評分電影評論人數 一. 發送請求 模擬瀏覽器向服務器發送請求 準備工作 -分析頁面: F12 or 右擊點擊檢查 查看…

力扣hot100——島嶼數量 島嶼問題經典dfs總結

給你一個由 1(陸地)和 0(水)組成的的二維網格,請你計算網格中島嶼的數量。 島嶼總是被水包圍,并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此外,你可以假設該網格的四條邊…

FPGA DSP:Vivado 中帶有 DDS 的 FIR 濾波器

本文使用 DDS 生成三個信號,并在 Vivado 中實現低通濾波器。低通濾波器將濾除相關信號。 介紹 用DDS生成三個信號,并在Vivado中實現低通濾波器。低通濾波器將濾除較快的信號。 本文分為幾個主要部分: 信號生成:展示如何使用DDS&am…

MessageAuthenticator

MessageAuthenticator https://coova.github.io/JRadius/ https://coova.github.io/JRadius/ import org.tinyradius.packet.RadiusPacket; import org.tinyradius.util.RadiusUtil; import java.nio.charset.StandardCharsets;public class RadiusAuthUtils {/*** 生成 RADI…

Spring Boot嵌入式服務器深度解析:從配置到調優的全方位指南

文章目錄 引言一、嵌入式服務器核心原理1.1 架構設計特點1.2 主流服務器對比 二、嵌入式服務器配置實戰2.1 基礎配置模板2.2 HTTPS安全配置 三、高級調優策略3.1 線程池優化(Tomcat示例)3.2 響應壓縮配置3.3 訪問日志配置 四、服務器切換實戰4.1 切換至U…

基于CentOS7安裝kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有節點主機名 主節點就修改成master hostnamectl set-hostname master 然后輸入bash刷新當前主機名 工作節點1就修改成node1 hostnamectl set-hostname node1 然后輸入bash刷新當前主機名 二、全部節點安裝依賴并同步時間 yum -y install socat conntrack ebta…

探索與Cursor協作創建一個完整的前后端分離的項目的最佳實踐

探索與Cursor協作創建一個完整的前后端分離的項目的最佳實踐 Cursor簡介 Cursor在目前代表了AI編程技術的頂峰。在一定程度上可以說是當今AI時代的最強生產力代表。為此,不惜重金開了年費會員來緊跟時代步伐。當然cline、roo code、trae等開源或者免費產品也在緊追不舍。 C…

支持向量機(SVM)在 NLP 中的使用場景

支持向量機(Support Vector Machine, SVM)是一種強大的監督學習算法,廣泛應用于分類任務中。由于其出色的分類性能和高效的計算特點,SVM 已經成為自然語言處理(NLP)領域中的一種經典模型。SVM 在 NLP 中的應用非常廣泛,尤其在文本分類任務中,表現出色。 本文將探討 SV…