Xuất ra tên nói của các số được sử dụng trên hành tinh Flapus


24

Các cư dân của Flapus sử dụng hệ thống số 8 cơ sở. Các con số là:

0 - Kuzla
1 - Ponara
2 - Boqkel
3 - Colopee
4 - Vruenat
5 - Foham
6 - Stikty
7 - Kricola

Đối với các số trên 7, tên đầy đủ của chữ số cuối cùng xuất hiện trước, theo sau là dấu nháy đơn và các ký tự đầu tiên của (các) chữ số khác, cho đến và bao gồm nguyên âm đầu tiên:

11 - Ponara (1) 'po (1)
13 - Colopee (3)' po (1)
64 - Vruenat'sti
55 - Foham'fo
47 - Kricola'vru

Khi các con số tăng lên, công thức vẫn giữ nguyên - tên đầy đủ của chữ số cuối cùng xuất hiện trước, theo sau là dấu nháy đơn và các ký tự đầu tiên của các chữ số khác, lên đến và bao gồm cả nguyên âm đầu tiên. Lưu ý rằng ngoài chữ số cuối cùng (từ đầu tiên), thứ tự vẫn giữ nguyên.

123 - Colopee (3) 'po (1) bo (2)
205 - Foham (5)' bo (2) ku (0)
1123 - Colopee'popobo
7654 - Vruenat'kristifo

Ngoại lệ cho quy tắc là các số kết thúc bằng 0. Ở đây từ bắt đầu bằng Ku và được hoàn thành với các chữ cái đầu tiên của các chữ số khác, lên đến và bao gồm cả nguyên âm đầu tiên. Không có dấu nháy đơn được sử dụng.

10 - Kupo
70 - Kukri
350 - Kucofo
630 - Kustico
1000 - Kupokuku

Thử thách

Viết chương trình hoặc hàm chấp nhận số cơ sở 8 hợp lệ và xuất ra số tương đương. Bạn có thể cho rằng bạn sẽ luôn nhận được một số hợp lệ. Trailing whitepace / dòng mới sau câu trả lời của bạn là ok. Ký tự đầu tiên cần phải viết hoa, theo ví dụ.

Đây là . Mã ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng. Câu trả lời có độ dài được chuyển đổi và gửi bổ sung trong Flapussian nhận thêm cookie.

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

0 -> Kuzla
1 -> Ponara
2 -> Boqkel
3 -> Colopee
4 -> Vruenat
5 -> Foham
6 -> Stikty
7 -> Kricola
10 -> Kupo
11 -> Ponara'po
23 -> Colopee'bo
56 - > Stikty'fo
70 -> Kukri
100 -> Kupoku
222 -> Boqkel'bobo
2345 -> Foham'bocovru


3
Bây giờ tôi nghĩ về nó, những con số nghe có vẻ khá dễ thương
busukxuan

Câu trả lời:


4

Pyth, 117 byte (Kricola'popo)

Jc"Ku Po Bo Co Vru Fo Sti Kri";K+kc"nara qkel lopee enat ham kty cola";=TsezIszp@JTp@KTp?&T>sz7\'kVPzpr@JsN0;.?"Kuzla

Chuyển mã bằng tay sang mã giả pythonic:

                                           z = input()      # unevaluated, raw
                                           k = ""
Jc"Ku Po Bo Co Vru Fo Sti Kri";            J = "Ku Po...Kri".split()
K+kc"nara qkel lopee enat ham kty cola";   K = k + "nara...cola".split() # k casted to [""]
=Tsez                                      T = int(end(z))  # end(z) means z[-1]
Isz                                        if int(z):
  p@JT                                         print(J[T])
  p@KT                                         print(K[T])
  p?&T>sz7\'k                                  print("'" if T and s > z else k)
  VPz                                          for N in z[:-1]:  # P(z) is z[:-1]
    pr@JsN0                                        print(J[int(N)].lower())
.?                                         else:
  "Kuzla                                       print("Kuzla")

Công việc tốt đẹp! Bạn có thể lưu một vài byte bằng cách thay đổi if ... elsethành một ternary bằng cách thay đổi forvòng lặp của bạn thành một maphoạt động, và sau đó thực hiện một số thay đổi nhỏ. Đây là những gì tôi nhận được. Tôi cũng muốn thu hút sự chú ý của bạn ."vào chuỗi có thể được sử dụng.
FryAmTheEggman

@FryAmTheEggman Tôi đã biết. ", Nhưng tôi hoàn toàn không ngờ rằng nó có thể nén chuỗi đầu tiên!
busukxuan

10

Võng mạc , Colopee'pokri, 165 157 143 127 123 byte

(.+)(.)
$2'$1
0
Kuzla
1
Ponara
2
Boqkel
3
Colopee
4
Vruenat
5
Foham
6
Stikty
7
Kricola
(?<='.*[iou])[a-z]+

T`L`l`'.+
zla'

Các linefeed trailing là đáng kể.

Hãy thử trực tuyến!

Giải trình

(.+)(.)
$2'$1

Chúng tôi bắt đầu bằng cách đưa chữ số ở phía trước và chèn dấu nháy đơn sau nó. Lưu ý rằng điều này khiến các số có một chữ số không thay đổi, vì biểu thức chính quy không khớp - vì vậy những số đó không bao giờ có dấu nháy đơn ở vị trí đầu tiên.

0
Kuzla
1
Ponara
2
Boqkel
3
Colopee
4
Vruenat
5
Foham
6
Stikty
7
Kricola

Điều này thay thế mỗi chữ số với tên đầy đủ của nó, bất kể nó xuất hiện ở đâu.

(?<='.*[iou])[a-z]+

Điều này rút ngắn tất cả các tên chữ số xuất hiện sau dấu nháy đơn. Lưu ý rằng chỉ các nguyên âm iouxuất hiện đầu tiên trong tên chữ số, vì vậy chúng tôi kiểm tra vị trí ngay sau một trong những nguyên âm đó sau dấu nháy đơn và sau đó khớp (và xóa) tất cả các chữ cái viết thường theo vị trí đó. Vì chúng tôi đã chèn tên chữ số trong trường hợp tiêu đề, điều này sẽ dừng trước chữ số tiếp theo.

T`L`l`'.+

Điều này sử dụng chuyển ngữ để biến tất cả các ký tự chữ hoa, Lthành đối tác chữ thường của chúng l, miễn là chúng được tìm thấy trong một trận đấu bắt đầu bằng' (để không bị bỏ vốn đầu tư).

zla'

Điều duy nhất còn lại là xử lý chính xác bội số của (bát phân) 10. Trong trường hợp đó, chúng tôi sẽ có kết quả bắt đầu bằng Kuzla', thay vào đó chúng tôi muốn bắt đầu bằng Ku. Vì vậy, chúng tôi chỉ cần loại bỏ tất cả các lần xuất hiện của zla'.


Tôi đã tái cấu trúc và sử dụng phương pháp regex của bạn - tiết kiệm 10 byte! Tôi không nghĩ rằng tôi có thể vắt kiệt nhiều hơn từ giải pháp Java của mình. Vẫn dặm từ bạn mặc dù!
Denham Coote

4

JavaScript (ES6), 171

n=>(x='Kuzla Ponara Boqkel Colopee Vruenat Foham Stikty Kricola ku po bo co vru fo sti kri'.split` `,r=x[d=+(n=[...n]).pop()],n.map(d=>r+=x[+d+8],n[0]?r=d?r+"'":'Ku':0),r)

Kiểm tra

F=n=>(
  x='Kuzla Ponara Boqkel Colopee Vruenat Foham Stikty Kricola ku po bo co vru fo sti kri'.split` `,
  r=x[d=+(n=[...n]).pop()],
  n.map(d=>r+=x[+d+8],n[0]?r=d?r+"'":'Ku':0),
  r
)  


console.log=x=>O.textContent+=x+'\n'

o=''
for(i=0;i<999;i++)
  o+=i.toString(8) +':'+ F(i.toString(8))+(i%8!=7?' ':'\n')
console.log(o)
#O { font-size:12px }
<pre id=O></pre>


4

Java (1.8) - Vruenat'fobo ( 486 340 byte)

Ngay khi tôi nghĩ rằng tôi không thể chơi golf được nữa, tôi đã tìm thấy thêm 33 byte! Rất hài lòng! Tiết kiệm lớn nhất là từ chuyển sang mảng char (ngắn hơn thành chữ thường / chữ thường) và sử dụng lại chuỗi chuỗi đầu vào cho các từ.

Khám phá vô số các thủ thuật chơi gôn, xuống dưới 400! Về lý thuyết tôi vẫn có thể giảm điều này nhiều hơn, vì tôi đã nói một hàm sẽ ổn trong các quy tắc, trong khi đây là một chương trình đầy đủ.

Được cập nhật bằng cách sử dụng phương pháp của Martin Büttner, tôi đã tái cấu trúc để sử dụng regex thay thế. Quản lý để tiết kiệm thêm 10 byte! Cảm ơn Martin.

interface F{static void main(String[]n){String t="",o,a=n[0];n="Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",");int i=0,l=a.length()-1;char f=a.charAt(l);o=n[f-48]+(l>0?"'":"");while(i<l)t+=n[a.charAt(i++)-48];o+=t.replaceAll("(?<=.*[iou])[a-z]+","").toLowerCase();if(f==48)o=o.replace("zla'","");System.out.print(o);}}

Bị đánh cắp

interface Flapus {
static void main(String[] names) {
    String temp="",out, a = names[0];
    names = "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",");
    int i=0, last = a.length()-1;
    char lastchar = a.charAt(last);

    out=names[lastchar-48]+(last>0?"'":"");
    while(i<last) {
        temp+=names[a.charAt(i++)-48];
    }
    out+=temp.replaceAll("(?<=.*[iou])[a-z]+", "").toLowerCase();
    if (lastchar==48) {
        out=out.replace("zla'","");
    }
    System.out.print(out);
}
}

1
Bạn có thể sử dụng interface Fvà loại bỏ khai báo công khai trên phương thức chính. Bạn cũng có thể loại bỏ không gian trong String[] xvà trong .substring(0, v+1).
Addison Crump

1
Bạn có thể lưu thêm một số byte bằng cách tạo mảng từ chuỗi phân tách: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")là 70 byte, trong khi mảng nội tuyến là 74.
Aaron

Cố gắng hết sức có thể, tôi dường như không thể đánh golf này khó hơn. Bất cứ ai ngoài đó với bất kỳ lời khuyên thêm?
Denham Coote

3

Python (3.5) 225 222 217 202 byte

Một giải pháp làm việc với sự hiểu biết danh sách trong python

s=input()
d="Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(',')
r=d[int(s[-1])]+"'"if s[-1]!='0'else'Ku'
d=[i[:2+(i[2]in'ui')].lower()for i in d]
for i in s[:-1]:r+=d[int(i)]
print(r)

Giải trình

d="Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(',')

Giành được 3 byte với phiên bản tách (phiên bản trước d="Kuzla","Ponara",...:)

r=d[int(s[-1])]+"'"if s[-1]!='0'else'Ku'

Khởi tạo kết quả theo chức năng của chữ số cuối

d=[i[:2+(i[2]in'ui')].lower()for i in d]

Thay đổi danh sách d để giữ 2 hoặc 3 ký tự đầu tiên và đặt chữ thường

for i in s[:-1]:r+=d[int(i)]

Cát chuỗi


1
2345 trả lại Foham'bocovr. Nó sẽ trả lại Foham'bocovru. Điều này là do bạn chỉ đọc 2 ký tự, thay vì tối đa và bao gồm nguyên âm đầu tiên. Pesky Vruenat
Denham Coote

Vấn đề tương tự cho 'Stikty' và 'Kricola'
Denham Coote

1
@Denham Coote oops Tôi quên trả lời ý kiến ​​của bạn. cảm ơn vì nhận xét của bạn, tôi đã sửa chữa các vấn đề
Erwan

2

Javascript ES6, 231 228 225 222 204 byte

a=[...prompt(c="Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split`,`)];b=c[a.pop()];a.length?b=b==c[0]?"Ku":b+"'":0;for(;a.length;)b+=c[a.shift()].match(/.+?[iou]/)[0].toLowerCase();alert(b)

Đã lưu một loạt các byte nhờ Neil.


1
Mẹo chơi golf nói chung: [...s]thay vì s.split``; b=b==c[0]?"Ku":b+"'"thay vì if(b==c[0]){b="Ku"}else b+="'"; tương tự cho if(a.length)(chỉ sử dụng 0cho elsemột phần); a.map(d=>b+=c[d].match...)thay vì loay hoay với forshift. Tôi nghĩ rằng đã lưu 29 byte.
Neil

Nhìn trộm câu trả lời của người khác cho thấy bạn có thể lưu thêm 2 byte vì bạn chỉ cần sử dụng [iou]làm lớp "nguyên âm" của mình.
Neil

@Neil Cảm ơn. Tôi sẽ làm việc đó.
SuperJedi224

2

F #, 364 288 250 byte (Kubofo)

let M="Ku-Ponara-Boqkel-Colopee-Vruenat-Foham-Stikty-Kricola".Split '-'
let m="Ku-Po-Bo-Co-Vru-Fo-Sti-Kri".Split '-'
let rec r a=function|0->a|i->r(m.[i%10].ToLower()::a)(i/10)
fun i->String.concat""<|M.[i%10]::((if(i%10)=0 then""else"'")::r[](i/10))

Trả về một hàm lấy một số nguyên và trả về tương đương Flapus của nó. = D


1

Python 3 - 181 177 byte (Ponara'bosti)

a='Ku Po Bo Co Vru Fo Sti Kri zla nara qkel lopee enat ham kty cola'.split()
*y,x=map(int,input())
u=x>0
v=y>[]
print(a[x]+a[x+8]*u**v+"'"*(u&v)+''.join(a[i].lower()for i in y))

Cảnh giác với việc sử dụng tuyệt vời nhất powbạn từng thấy trong toàn bộ cuộc sống của bạn. u**vlà tương đương với bối cảnh boolean như u|(not v)trước đây đã được chơi golf với ~v+2|ubiểu hiện tốt đẹp !

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.