Rust + Toki Pona
Bất kỳ ngôn ngữ nào cũng được chấp nhận, vì vậy tôi đã viết một chương trình trong Rust tạo ra một số câu trong Toki Pona .
Toki Pona là một nỗ lực để tạo ra một ngôn ngữ tự nhiên tối thiểu, và nó có một ngữ pháp siêu đơn giản và thông thường. Đó là một tài sản rất hữu ích cho cuộc thi này!
use std::rand;
#[deriving(Rand)]
struct Phrase { a: Option<~GNominal>, b: ~Sujet, c: ~Predicat }
#[deriving(Rand)]
enum Sujet { A(~GNominal), B(~SCompose) }
#[deriving(Rand)]
enum Predicat { C(~GVerbal), D(~PCompose) }
#[deriving(Rand)]
struct SCompose { a: ~Sujet, b: ~Sujet }
#[deriving(Rand)]
struct PCompose { a: ~Predicat, b: ~Predicat }
#[deriving(Rand)]
struct GNominal { a: ~nom::Nom, b: Multi<~adjectif::Adjectif> }
#[deriving(Rand)]
struct GVerbal { a: ~verbe::Verbe, b: Multi<~adjectif::Adjectif>, c: Multi<~ODirect> }
#[deriving(Rand)]
struct ODirect { a: ~GNominal}
#[deriving(Rand)]
enum Multi<T> { Zero, One(T), Two((T,T)) }
mod nom {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Nom {akesi,ala,ale,anpa,ante,ijo,ike,ilo,insa,jaki,jan,jo,kala,kalama,kama,kasi,ken,kili,kiwen,ko,kon,kule,kulupu,lape,lawa,len,lete,linja,lipu,luka,lupa,ma,mama,mani,meli,mi,mije,moku,moli,monsi,mun,musi,mute,nanpa,nasin,nena,nimi,noka,oko,olin,ona,pakala,pali,palisa,pana,pilin,pimeja,pini,pipi,poka,poki,pona,seli,selo,sewi,sijelo,sike,sina,sinpin,sitelen,sona,soweli,suli,suno,supa,suwi,tan,tawa,telo,tenpo,toki,tomo,tu,unpa,uta,utala,walo,wan,waso,wawa,weka,wile}
}
mod verbe {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Verbe {ante,awen,ijo,ike,jaki,jan,jo,kalama,kama,ken,kepeken,kule,kute,lape,lawa,lete,lili,lon,lukin,moku,moli,musi,mute,nasa,olin,open,pakala,pali,pana,pilin,pimeja,pini,pona,seli,sin,sitelen,sona,suli,suwi,tawa,telo,toki,tu,unpa,utala,wan,wawa,weka,wile,}
}
mod adjectif {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Adjectif {ala,ale,anpa,ante,awen,ike,insa,jaki,jan,jelo,kama,kin,kiwen,kon,kule,kute,kulupu,lape,laso,lawa,lete,lili,linja,loje,luka,lukin,mama,meli,mi,mije,moli,monsi,mun,musi,mute,nasa,ni,olin,ona,pali,pimeja,pini,poka,pona,sama,seli,sewi,sike,sin,sina,suli,suwi,taso,tawa,toki,tomo,unpa,uta,walo,wan,wawa,weka,wile,}
}
impl ToStr for Phrase {
fn to_str(&self) -> ~str {
self.a.as_ref().map_or(~"", |g| format!("{:s} la ", g.to_str()))
+ format!("{:s} li {:s}", self.b.to_str(), self.c.to_str())
}
}
impl ToStr for Sujet {
fn to_str(&self) -> ~str {
match *self {
A(ref v) => v.to_str(),
B(ref v) => v.to_str(),
}
}
}
impl ToStr for Predicat {
fn to_str(&self) -> ~str {
match *self {
C(ref v) => v.to_str(),
D(ref v) => v.to_str(),
}
}
}
impl ToStr for SCompose {
fn to_str(&self) -> ~str {
format!("{:s} en {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for PCompose {
fn to_str(&self) -> ~str {
format!("{:s} li {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for GNominal {
fn to_str(&self) -> ~str {
format!("{:s} {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for GVerbal {
fn to_str(&self) -> ~str {
format!("{:s} {:s} {:s}", self.a.to_str(), self.b.to_str(), self.c.to_str())
}
}
impl ToStr for ODirect {
fn to_str(&self) -> ~str {
format!("e {:s}", self.a.to_str())
}
}
impl<T: ToStr> ToStr for Multi<~T> {
fn to_str(&self) -> ~str {
match *self {
Zero => ~"",
One(ref v) => v.to_str(),
Two((ref v,ref w)) => format!("{:s} {:s}", v.to_str(), w.to_str()),
}
}
}
fn main() {
let phrase = rand::random::<Phrase>();
println!("{:s}\n{:?}", phrase.to_str(), phrase);
}
Tôi không nói Toki Pona, nhưng tôi đã tìm thấy cú pháp của Toki Pona như một bộ quy tắc BNF trên Wikipedia. Tôi đã tạo một cấu trúc hoặc enum cho mỗi quy tắc BNF và tôi chú thích chúng với nhau deriving(Rand)
, điều này cho tôi cách tạo ra một Phrase
cấu trúc ngẫu nhiên miễn phí! Sau đó, tôi triển khai ToStr
cho từng cấu trúc này để chuyển đổi chúng thành một chuỗi.
Tôi cố tình để lại các tên cấu trúc trong tiếng Pháp, bởi vì các quy tắc BNF mà tôi tìm thấy là bằng tiếng Pháp, và cũng vì nó tái hiện bản chất đa ngôn ngữ trong bài nộp của tôi!
Đầu ra mẫu
Một số kết quả đầu ra và bản dịch của chúng, mà tôi đã làm dựa trên các quy tắc BNF và từ điển Toki Pona . Tôi chắc chắn rằng những bản dịch này hầu hết là sai, nhưng Toki Pona thực sự để lại rất nhiều chỗ cho việc giải thích một câu.
nasin mi tawa la jan li jaki
Trong chuyến đi của tôi, một người nào đó bị ô nhiễm
monsi li jaki li jan ike musi
Cái mông bẩn và là một người xấu vui
sina li tawa ale jelo e kili tawa e insa
Bạn đã chuyển trái cây và trung tâm đến vũ trụ màu vàng
Các vấn đề
- Tôi không kiểm tra xem một động từ có bắc cầu hay không, do đó một số câu không đúng ngữ pháp.
- Một số cấu trúc được đệ quy và khi một quy tắc có thể được lặp lại, tôi chọn ngẫu nhiên để xuất 0, 1 hoặc 2 phần tử. Điều này có thể dẫn đến các câu được tạo ra từ lâu của veeeeeery, chứa hàng ngàn từ ...
- Tôi thực sự không thể xác minh tính hợp lệ của đầu ra, tôi hoàn toàn dựa vào cú pháp BNF, từ điển và những phỏng đoán hoang dã của riêng tôi :)