Keluarkan nama-nama yang diucapkan dari angka yang digunakan di planet Flapus

24

Penduduk Flapus menggunakan sistem nomor basis-8. Jumlahnya adalah:

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

Untuk angka di atas 7, nama lengkap dari digit terakhir didahulukan, diikuti oleh apostrof dan karakter pertama dari digit lainnya, hingga dan termasuk vokal pertama:

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

Ketika angkanya naik, rumusnya tetap sama - nama lengkap digit terakhir yang lebih dulu, diikuti oleh tanda kutip dan karakter pertama dari digit lainnya, hingga dan termasuk vokal pertama. Perhatikan bahwa terlepas dari digit terakhir (kata pertama), urutannya tetap sama.

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

Pengecualian aturan adalah untuk angka yang diakhiri dengan 0. Di sini kata itu dimulai dengan Ku dan dilengkapi dengan huruf pertama dari digit lainnya, hingga dan termasuk vokal pertama. Tidak ada apostrof yang digunakan.

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

Tantangan

Tulis program atau fungsi yang menerima nomor basis-8 yang valid, dan hasilkan persamaan yang diucapkan. Anda mungkin menganggap Anda akan selalu menerima nomor yang valid. Mengejar whitepace / baris baru setelah jawaban Anda ok. Karakter pertama harus huruf besar, sesuai contoh.

Ini adalah . Kode terpendek dalam byte menang. Celah standar berlaku. Jawaban yang panjangnya dikonversi dan tambahan dikirim di Flapussian mendapatkan cookie tambahan.

Uji kasus

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

Denham Coote
sumber
3
Sekarang saya memikirkannya, semua angka terdengar sangat lucu
busukxuan

Jawaban:

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

Dipindah tangan ke pseudocode 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")
busukxuan
sumber
Kerja bagus! Anda dapat menyimpan beberapa byte dengan mengubah Anda if ... elsemenjadi terner dengan mengubah forloop Anda menjadi sebuah mapoperasi, dan kemudian membuat beberapa perubahan kecil. Inilah yang saya dapat. Saya juga akan menarik perhatian Anda ."yang dapat digunakan pada string terkompresi.
FryAmTheEggman
@FryAmTheEggman yang saya sadari. ", Tapi saya benar-benar tidak berharap itu bisa mengompresi string pertama!
busukxuan
10

Retina , 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'

Linefeed tambahan sangat penting.

Cobalah online!

Penjelasan

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

Kami mulai dengan membawa digit tambahan ke depan dan memasukkan tanda kutip setelahnya. Perhatikan bahwa ini membuat angka satu digit tidak berubah, karena regex tidak cocok - sehingga mereka tidak pernah mendapatkan tanda kutip di tempat pertama.

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

Ini menggantikan setiap digit dengan nama lengkapnya, terlepas dari di mana ia muncul.

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

Ini memperpendek semua nama digit yang muncul setelah tanda kutip. Perhatikan bahwa hanya vokal yang ioumuncul pertama kali dalam nama digit, jadi kami memeriksa posisi yang tepat setelah salah satu dari mereka, dan setelah tanda kutip dan kemudian mencocokkan (dan menghapus) semua huruf kecil yang mengikuti posisi itu. Karena kami telah memasukkan nama digit dalam case title, ini akan berhenti sebelum digit berikutnya.

T`L`l`'.+

Ini menggunakan transliterasi untuk mengubah semua karakter huruf besar, Lmenjadi pasangan huruf kecil l,, asalkan ditemukan dalam pertandingan yang dimulai dengan '(agar modal utama tidak tersentuh).

zla'

Satu-satunya hal yang tersisa adalah menangani dengan benar kelipatan (oktal) 10. Dalam hal ini, kita akan mendapatkan hasil yang dimulai dengan Kuzla', yang ingin kita mulai dengan Ku. Jadi kami cukup menghapus semua kemunculan zla'.

Martin Ender
sumber
Saya refactored dan menggunakan pendekatan regex Anda - menghemat 10 byte! Saya tidak berpikir saya bisa memeras lebih banyak dari solusi Java saya. Masih bermil-mil jauhnya dari milikmu!
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)

Uji

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>

edc65
sumber
4

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

Tepat ketika saya pikir saya tidak mungkin bermain golf lagi, saya menemukan 33 byte lagi! Sangat tersanjung! Penghematan terbesar adalah dari beralih ke array char (lebih pendek ke huruf besar / kecil), dan menggunakan kembali array string input untuk kata-kata.

Menemukan banyak trik golf, hingga di bawah 400! Secara teori saya masih bisa mengurangi ini lagi, seperti yang saya katakan fungsi akan ok dalam aturan, sedangkan ini adalah program lengkap.

Diperbarui Menggunakan pendekatan Martin Büttner, saya refactored untuk menggunakan regex sebagai gantinya. Berhasil menyimpan 10 byte lagi! Terima kasih 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);}}

Tidak disatukan

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);
}
}
Denham Coote
sumber
1
Anda dapat menggunakan interface Fdan menghapus deklarasi publik tentang metode utama. Anda juga dapat menghapus ruang masuk String[] xdan masuk .substring(0, v+1).
Addison Crump
1
Anda bisa menyimpan lebih banyak byte dengan menghasilkan array dari string yang terpecah: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")adalah 70 byte, sedangkan array inline adalah 74.
Aaron
Cobalah sekuat tenaga, saya tidak bisa bermain golf ini lebih sulit. Adakah yang punya tips lebih lanjut?
Denham Coote
3

Python (3.5) 225 222 217 202 byte

Solusi yang berfungsi dengan pemahaman daftar dalam 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)

Penjelasan

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

Menang 3 byte dengan versi split (versi sebelumnya: d="Kuzla","Ponara",...)

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

Inisialisasi hasil dalam fungsi digit terakhir

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

Ubah daftar d untuk mempertahankan 2 atau 3 karakter pertama dan masukkan huruf kecil

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

Cat string

Erwan
sumber
1
2345 mengembalikan Foham'bocovr. Seharusnya mengembalikan Foham'bocovru. Ini karena Anda hanya membaca 2 karakter, bukan hingga dan termasuk vokal pertama. Pesky Vruenat
Denham Coote
Masalah yang sama untuk 'Stikty' dan 'Kricola'
Denham Coote
1
@Denham Coote oops Saya lupa menjawab komentar Anda. terima kasih atas komentar Anda, saya memperbaiki masalah
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)

Menyimpan banyak byte berkat Neil.

SuperJedi224
sumber
1
Kiat golf umum: [...s]alih-alih s.split``; b=b==c[0]?"Ku":b+"'"bukannya if(b==c[0]){b="Ku"}else b+="'"; sama untuk if(a.length)(gunakan saja 0untuk elsebagian); a.map(d=>b+=c[d].match...)bukannya mengutak-atik fordan shift. Saya pikir sudah 29 byte yang disimpan.
Neil
Mengintip jawaban orang lain menyarankan Anda dapat menyimpan 2 byte lagi karena Anda hanya perlu menggunakan [iou]kelas "vokal" Anda.
Neil
@Neil Terima kasih. Saya akan melakukannya.
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))

Mengembalikan fungsi yang mengambil bilangan bulat dan mengembalikan setara Flapus-nya. = D

Roujo
sumber
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))

Waspadalah terhadap penggunaan paling menakjubkan yang powpernah Anda lihat dalam seluruh hidup Anda. u**vsetara dengan konteks boolean seperti u|(not v)yang sebelumnya di-golf dengan ~v+2|uekspresi yang bagus !

JBernardo
sumber