Tôi lập trình câu đố, il mã golf


21

Lý lịch

Mạo từ xác định Ý (tương ứng với tiếng Anh các ) có bảy hình thức khác nhau: l' , il , lo , gli , i , la , le . Cái nào để sử dụng phụ thuộc vào ba biến:

  • Giới tính: nam tính / nữ tính.
  • Số: số ít / số nhiều.
  • Chữ cái đầu của từ tiếp theo: nguyên âm / phụ âm loại A / phụ âm loại B.
    • Nguyên âm là bất kỳ trong số này: aeiou .
    • Phụ âm loại B là bất kỳ trường hợp: s- tiếp theo phụ âm khác, z- , gn- , pn- , PS , x- , i- sau nguyên âm (điều này tôi đóng vai trò như một bán mẫu âm).
    • Phụ âm loại A là phụ âm không phải loại B.

Bảng này cho thấy hình thức bài viết sẽ được sử dụng trong mỗi mười hai kết hợp của ba biến trên. Lưu ý rằng mẫu l ' được đính kèm với từ sau với một trích dẫn duy nhất và không có dấu cách.

nhập mô tả hình ảnh ở đây

Các thách thức

Nhập một từ và một hoặc hai chuỗi, số hoặc Booleans cho biết giới tínhsố . (Các chữ cái ban đầu sẽ phải được lấy từ từ đầu vào).

Từ đầu vào sẽ là một chuỗi các chữ cái ASCII viết thường. Nguyên âm có dấu sẽ được thay thế bằng các phiên bản không có dấu (ví dụ: realtà sẽ được nhập dưới dạng realta ).

Các đầu vào giới tính và số có thể là các số riêng biệt, Booleans hoặc chuỗi hoặc một số chuỗi kết hợp (ví dụ: 1 cho số ít nam tính, 2 cho số ít nữ tính, v.v.).

Bất kỳ định dạng hợp lý và dấu phân cách có thể được sử dụng, miễn là nó được chỉ định trong câu trả lời.

Xuất ra từ đứng trước hình thức thích hợp của bài viết , với khoảng trắng hoặc trích dẫn khi cần thiết. Đầu ra cũng nên viết thường. Trailing hoặc hàng đầu không gian trống được cho phép.

Mã golf, thắng ngắn nhất.

Các trường hợp thử nghiệm

Trong phần tiếp theo tôi sử dụng các chữ cái đầu vào m, fđể xác định giới tính, và s, pcho số (điều này chỉ là một khả năng định dạng đầu vào).

Input               Output              Comment

macchina f s        la macchina         Initial letter is cons. A
zio m s             lo zio              Initial letter is cons. B
libri m p           i libri             Initial letter is cons. A
ieri m s            lo ieri             Initial letter is cons. B
aquile f p          le aquile           Initial letter is vowel
spagnoli m p        gli spagnoli        Initial letter is cons. B
golf m s            il golf             Initial letter is cons. A
ombra f s           l'ombra             Initial letter is vowel
impossibili m p     gli impossibili     Initial letter is vowel

Bạn cũng có thể muốn thực hiện một thử thách về sự kết hợp của các động từ thông thường.
dùng6245072

@ user6245072 Chà, đã có điều này ... sự khác biệt có lẽ sẽ quá nhỏ
Luis Mendo 16/07/2016

1
Một tỉ mỉ quá kỹ thuật nhỏ: / j / thường gọi là bán mẫu âm bằng tiếng Anh, không phải là một semiconsonant . Tôi tự hỏi các giải pháp sẽ là gì nếu chúng là yếu tố trong các trường hợp cạnh như ⟨ch⟩ đại diện cho [ʃ] thay vì [k] ( lo Chef , lo chardonnay ), biến thể với tên tiếng Pháp ( l'Havet but lo Hugo ), các hình thức hóa thạch ( gli dei , per lo meno ), phụ nữ được gọi bằng tên cuối cùng của họ ( l'Antonia nhưng la Antonini ), v.v ... Đó sẽ là điều khá ghê gớm đối với mã golf.
Janus Bahs Jacquet

1
Như tiếng Ý tôi yêu cầu bạn bỏ ieritrường hợp kiểm tra vì là trạng từ chứ không phải danh từ! (BTW chính thức là chính xác) Xin vui lòng!
Giacomo Garabello

1
Chúng tôi thường nói: "Non penare a ieri, Pensa a Domani"
Giacomo Garabello 18/07/2016

Câu trả lời:


7

Võng mạc, 138 133 129 113 byte

^.(s[^aeiou]|z|gn|pn|ps|x|i[aeiou])
B$&
^.[aeiou]
V$&
^\d.
A$&
V[02]
l'
A0
il 
B0
lo 
A1
i 
.1
gli 
.2
la 
.3
le 

Bộ thử nghiệm. ( %(G`\ndự kiến ​​chạy tất cả các trường hợp thử nghiệm cùng một lúc)

Định dạng đầu vào: macchina f strở thành2macchina thay thế.

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

Bảng chuyển đổi nhờ Kevin Lau .


4

Python 3.5, 238 235 192 181 178 byte:

( -13 byte nhờ các mẹo từ Leaky Nun! )

import re;R=re.match;lambda a,b:(R('s[^aeiou]|(z|gn|pn|ps|x|i)[aeiou]',a)and['lo ','gli ','la '][b]or R('[aeiou]',a)and["l'",'gli '][b%2]or['il ','i ','la '][b]if b<3else'le ')+a

Hàm lambda ẩn danh nhận các đối số ở dạng (<String>, <Integer Gender-Plurality mapping>), trong đó ánh xạ như sau:

0 -> Masculine Singular
1 -> Masculine Plural
2 -> Feminine Singular
3 -> Feminine Plural

Để gọi nó, chỉ cần cung cấp cho hàm bất kỳ tên hợp lệ nào, và sau đó gọi nó như một hàm bình thường được bọc bên trong một câu lệnh in. Do đó, nếu câu hỏi được đặt tên U, chỉ cần gọi nó nhưprint(U(<String>, <Integer Gender-Plurality mapping>)) .

Dùng thử trực tuyến! (Ý)


zzz and yyy or xxxngắn hơn hai byte so với[xxx,yyy][bool(zzz)]
Leaky Nun

@LeakyNun Tôi có thể làm điều đó? Wow, tôi thậm chí không biết. Cảm ơn! :)
R. Kap

Nó hoạt động miễn yyylà sự thật.
Leaky Nun

@LeakyNun Vâng, tất nhiên.
R. Kap

["l'",'gli '][b%2]ngắn hơn 3 byte so với["l'",'gli ',"l'"][b]
Leaky Nun

4

Java, 227 208 195 byte

-13 byte nhờ Leaky Nun

String f(String a,int o){boolean v=a.matches("^([aeou]|i[^aeiou]).*"),b=a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");return(o>1?o>2?"le ":v?"l'":"la ":o>0?v||b?"gli ":"i ":v?"l'":b?"lo ":"il ")+a;}

Lấy chuỗi của bạn và int dựa trên ánh xạ sau:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

Trả về một chuỗi với kết quả.

Ung dung với các trường hợp thử nghiệm và không có toán tử ternary (thực tế bây giờ):

class Test {

    public static String f(String a, int o) {
        boolean v = a.matches("^([aeou]|i[^aeiou]).*");
        boolean b = a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");
        String r;
        if(o > 1)
            if(o > 2)
                r = "le ";
            else
                if(v)
                    r = "l'";
                else
                    r = "la ";
        else
            if(o > 0)
                if(v || b)
                    r = "gli ";
                else
                    r = "i ";
            else
                if(v)
                    r = "l'";
                else if(b)
                    r = "lo ";
                else
                    r = "il ";
        return r + a;
    }

    public static void main(String[] args) {
        System.out.println(f("macchina", 2));
        System.out.println(f("zio", 0));
        System.out.println(f("libri", 1));
        System.out.println(f("ieri", 0));
        System.out.println(f("aquile", 3));
        System.out.println(f("spagnoli", 1));
        System.out.println(f("golf", 0));
        System.out.println(f("ombra", 2));
        System.out.println(f("impossibili", 1));
    }
}

Sử dụng một chút ma thuật regex và hành động tùy thuộc vào hai booleans được chỉ định. Thật ngạc nhiên, không cần nhập, điều này giúp cho kích thước mã!


1
Của tôi là ... dài hơn JAVA?! Tôi phải đánh golf xuống càng sớm càng tốt! Làm tốt lắm! +1
R. Kap

Nếu tôi phải lấy lý lẽ của mình từ dòng lệnh hoặc stdin, hãy tin tôi, nó sẽ dài hơn rất nhiều: P

Vâng, Booleans cũng chấp nhận. Tôi đã chỉnh sửa nó trong
Luis Mendo 16/07/2016

Tôi nghĩ rằng bạn có thể sử dụng 0/1thay vì false/truesẽ tiết kiệm cho bạn một số byte.
Leaky Nun

Không sử dụng String e = "[^aeiou]).*";thực sự giúp bạn tiết kiệm 5 byte.
Leaky Nun

3

Ruby, 147 146 byte

Dùng thử trực tuyến?

Có thể sử dụng một phương pháp tốt hơn để xác định bài viết nào sẽ sử dụng, nhưng tôi không biết về bất kỳ bài viết nào.

Theo thông số kỹ thuật, mã định danh là một số, như sau:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

->w,i{(%w"lo gli la le l' gli l' le il i la le"[(0..2).find{|r|[/^(i[aeiou]|s[^aeiou]|z|x|[gp]n|ps)/,/^[aeiou]/,//][r]=~w}*4+i]+' '+w).sub"' ",?'}

2

Mẻ, 446 390 385 380 byte

@echo off
set w=%2
call:l %1 l' gli_ l' le_ il_ i_ la_ le_ lo_ gli_ le_ le_
exit/b
:l
for /l %%a in (0,1,%1)do shift
set o=%5
for %%a in (gn pn ps)do if %%a==%w:~,2% set o=%9
for %%a in (s z x)do if %%a==%w:~,1% set o=%9
for %%a in (a e i o u)do if %%a==%w:~,1% set o=%1
for %%a in (a e i o u)do if i%%a==%w:~,2% (set o=%9)else if s%%a==%w:~,2% set o=%1
echo %o:_= %%w%

Phiên bản mới sử dụng cùng 0-3mã hóa cho giới tính và số lượng như một số câu trả lời khác. Công trình bằng cách tạo ra một mảng 1 chiều %2.. %13các hình thức, sau đó chuyển ra đầu tiên 1+%1yếu tố để các hình thức lãi suất trở thành %1, %5%9(đó là may mắn như hàng loạt sẽ không đi trên %9mà không thay đổi). Sau đó, nó kiểm tra kỹ lưỡng danh sách các tiền tố để tìm ra hình thức nào cần được sử dụng. _được sử dụng như một trình giữ chỗ để thể hiện một khoảng trắng cho đến khi từ được xuất ra.


Cũng có thể mã hóa chúng thành một chữ số (hoặc chữ cái nếu cần, vì thông số kỹ thuật cho phép) để lưu byte. Tất cả mọi thứ là vì lợi ích của byte!
Mực giá trị

@ KevinLau-notKenny Chuyển sang mã hóa chữ số cho phép tôi tiết kiệm được 56 byte bằng cách viết lại giới tính và xử lý số!
Neil

1

Python 3, 235 byte

Tôi đã quan tâm để xem làm thế nào tôi có thể nhận được điều này trong Python mà không cần regexes. Hóa ra đây không phải là lựa chọn tốt nhất ...

lambda s,c,v='aeiou':[["l'",'il','lo'],['gli','i','gli'],["l'",'la','la'],['le']*3][c][[[1,2][s[0]=='s'and s[1]not in v or s[0]in'zx'or s[:2]in['gn','pn','ps']or s[0]=='i'and s[1]in v],0][s[0]in v and not(s[0]=='i'and s[1]in v)]]+' '+s

Một hàm ẩn danh lấy đầu vào thông qua đối số của từ svà mã số giới tính clàm số nguyên, sử dụng ánh xạ sau:

0 - Masculine Singular
1 - Masculine Plural
2 - Feminine Singular
3 - Feminine Plural

và trả về từ với bài viết chính xác.

Làm thế nào nó hoạt động

Một danh sách chứa các khả năng cho từng cdanh sách riêng biệt được tạo ra. Danh sách này sau đó được lập chỉ mục sử dụng giá trị của c, thu được danh sách 3 yếu tố với các tùy chọn liên quan. Một chỉ mục danh sách hiện được chọn bằng cách lập chỉ mục vào một danh sách lồng nhau khác với kết quả của các biểu thức Boolean. Nếu ký tự đầu tiên slà nguyên âm và không được itheo sau bởi nguyên âm, tùy chọn cho vowelđược mang lại thông qua việc trả về chỉ mục0 . Khác, một biểu thức Boolean trở về Truecho cons. BFalsecho cons. Ađược đánh giá, năng suất các chỉ số 21tương ứng. Cuối cùng, chỉ mục được sử dụng để mang lại bài viết, được nối với một khoảng trắng và chuỗi gốc trước khi được trả về.

Hãy thử nó trên Ideone


1

JavaScript 210 byte

(s,p)=>{var c=i=>!("aeiou".indexOf(s[i])+1),r=["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))||(c(1)?s[0]=="s":s[0]=="i")?2:c(0)?1:0;return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s}

Một hàm ẩn danh lấy hai tham số s và p trong đó

s  is the input string
p  is plurality (bit 0, set=plural) and gender (bit 1, set=f) combined as
    0 = masculine singular
    1 = masculine plural
    2 = feminine singular
    3 = feminine plural

Sau khi gán hàm cho một biến và một số giải nén), nó có thể được kiểm tra như

var f=(s,p)=>{
    var c = i=>!("aeiou".indexOf(s[i])+1),
        r = ["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))
             || ( c(1)? s[0]=="s":s[0]=="i" )
             ?   2 : c(0) ? 1 : 0;

     return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s;
}

console.log("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
 f("macchina",2),
 f("zio",0),
 f("libri",1),
 f("ieri", 0),
 f("aquile",3),
 f("spagnoli",1),
 f("golf",0),
 f("ombra",2),
 f("impossibili",1))

Ở đâu

  • clà một chức năng để kiểm tra smột phụ âm tại vị trí i.
  • r ước tính thành 0 để bắt đầu bằng nguyên âm, 1 để bắt đầu với phụ âm loại A và 2 để bắt đầu với phụ âm loại B (được kiểm tra theo thứ tự ngược lại).
  • Bit bashing trong tuyên bố trở lại đặt nó cùng nhau.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.