เอาท์พุทชื่อพูดของตัวเลขที่ใช้บนดาวเคราะห์ Flapus


24

ชาว Flapus ใช้ระบบเลขฐาน 8 ตัวเลขคือ:

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

สำหรับตัวเลขที่มากกว่า 7 ชื่อเต็มของหลักสุดท้ายจะมาก่อนตามด้วยเครื่องหมายอัญประกาศเดี่ยวและอักขระตัวแรกของตัวเลขอื่นจนถึงและรวมถึงสระแรก:

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

เมื่อตัวเลขเพิ่มขึ้นสูตรจะยังคงเหมือนเดิม - ชื่อเต็มต้องเป็นเลขท้ายก่อนตามด้วยเครื่องหมายอัญประกาศเดี่ยวและอักขระตัวแรกของตัวเลขอื่นจนถึงและรวมถึงสระตัวแรก โปรดทราบว่านอกเหนือจากหลักสุดท้าย (คำแรก) คำสั่งซื้อยังคงเหมือนเดิม

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

ข้อยกเว้นสำหรับกฎนี้คือตัวเลขที่ลงท้ายด้วย 0 นี่คือคำที่ขึ้นต้นด้วย Ku และเสร็จสิ้นด้วยตัวอักษรตัวแรกของตัวเลขอื่นจนถึงและรวมถึงเสียงสระแรก ไม่มีการใช้เครื่องหมายอัญประกาศเดี่ยว

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

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับหมายเลขฐาน 8 ที่ถูกต้องและส่งออกเสียงพูดที่เทียบเท่า คุณอาจคิดว่าคุณจะได้รับหมายเลขที่ถูกต้องเสมอ ไวท์สเปซต่อท้าย / ขึ้นบรรทัดเดียวหลังจากคำตอบของคุณก็โอเค ตัวอักษรตัวแรกจะต้องเป็นตัวพิมพ์ใหญ่ตามตัวอย่าง

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานใช้ คำตอบที่มีการแปลงความยาวและส่งเพิ่มเติมใน Flapussian จะได้รับคุกกี้เพิ่มเติม

กรณีทดสอบ

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


3
ตอนนี้ฉันคิดแล้วว่าตัวเลขทั้งหมดน่ารักน่ารัก
busukxuan

คำตอบ:


4

Pyth, 117 ไบต์ (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

transpiled มือเพื่อ pythonic 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")

เยี่ยมมาก! คุณสามารถบันทึกไม่กี่ไบต์โดยเปลี่ยนif ... elseเป็นไตรภาคโดยเปลี่ยนการforวนซ้ำเป็นการmapดำเนินการแล้วทำการเปลี่ยนแปลงเล็กน้อย นี่คือสิ่งที่ฉันได้รับ ฉันจะดึงความสนใจของคุณ."ซึ่งสามารถใช้กับสตริงที่บีบอัดได้
FryAmTheEggman

@FryAmTheEggman ฉันรู้ "แต่ฉันไม่คาดหวังเลยว่ามันจะบีบอัดข้อความแรกได้!
busukxuan

10

Retina , Colopee'pokri, 165 157 143 127 123 ไบต์

(.+)(.)
$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'

ตัวป้อนบรรทัดต่อท้ายมีความสำคัญ

ลองออนไลน์!

คำอธิบาย

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

เราเริ่มต้นด้วยการนำตัวเลขท้ายไปที่ด้านหน้าและใส่เครื่องหมายอัญประกาศเดี่ยวหลังจากนั้น โปรดทราบว่าการดำเนินการนี้จะไม่เปลี่ยนแปลงตัวเลขหลักเดียวเนื่องจาก regex ไม่ตรงกันดังนั้นผู้ที่ไม่เคยได้รับเครื่องหมายอัญประกาศเดี่ยวในตอนแรก

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

สิ่งนี้จะแทนที่แต่ละหลักด้วยชื่อเต็มไม่ว่าจะปรากฏที่ไหน

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

นี่จะทำให้ชื่อหลักทั้งหมดที่สั้นลงหลังจากเครื่องหมายวรรคตอนสั้นลง โปรดทราบว่ามีเพียงเสียงสระiouปรากฏในชื่อหลักเท่านั้นดังนั้นเราจึงตรวจสอบตำแหน่งที่อยู่หลังหนึ่งในนั้นและหลังเครื่องหมายอัญประกาศเดี่ยวแล้วจับคู่ (และลบ) อักษรตัวพิมพ์เล็กทั้งหมดที่ตามตำแหน่งนั้น เนื่องจากเราได้ใส่ชื่อหลักลงในตัวพิมพ์ชื่อเรื่องแล้วชื่อนี้จะหยุดก่อนหน้าหลัก

T`L`l`'.+

นี้ใช้ทับศัพท์ที่จะเปิดตัวพิมพ์ใหญ่ทั้งหมดLลงไปในกรณีที่คู่ที่ต่ำกว่าของพวกเขาlให้พวกเขาจะพบในการแข่งขันที่เริ่มต้นด้วย'(ในการสั่งซื้อที่จะออกจากเมืองหลวงชั้นนำแตะต้อง)

zla'

สิ่งเดียวที่เหลืออยู่คือการจัดการทวีคูณของ (ฐานแปด) อย่างถูกต้อง 10. ในกรณีนี้เราจะมีผลลัพธ์เริ่มต้นด้วยKuzla'ซึ่งเราต้องการเริ่มต้นด้วยKuแทน zla'ดังนั้นเราก็ลบที่เกิดขึ้นทั้งหมด


ฉันได้รับการจัดโครงสร้างใหม่และใช้วิธีการ regex ของคุณ - ประหยัด 10 ไบต์! ฉันไม่คิดว่าฉันจะบีบโซลูชัน Java ของฉันออกไปได้อีกมาก ยังห่างไกลจากคุณแม้ว่า!
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)

ทดสอบ

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 ไบต์)

เมื่อฉันคิดว่าฉันไม่สามารถตีกอล์ฟนี้ได้อีกฉันพบอีก 33 ไบต์! ยินดีเป็นอย่างยิ่ง! การออมที่ใหญ่ที่สุดมาจากการสลับไปยังอาร์เรย์ char (สั้นไปเป็นบน / ล่าง) และนำอาร์เรย์สตริงอินพุตสำหรับคำนั้น

ค้นพบเทคนิคการตีกอล์ฟมากมายจนถึงต่ำกว่า 400! ในทางทฤษฎีฉันยังสามารถลดสิ่งนี้ได้อีกเพราะฉันบอกว่าฟังก์ชั่นจะใช้ได้ในกฎในขณะที่นี่เป็นโปรแกรมเต็มรูปแบบ

อัปเดต ด้วยวิธีการของ Martin Büttnerฉันปรับโครงสร้างให้ใช้ regex แทน จัดการเพื่อบันทึกอีก 10 ไบต์! ขอบคุณมาร์ติน

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);}}

Ungolfed

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
คุณสามารถใช้interface Fและลบการประกาศสาธารณะในวิธีการหลัก นอกจากนี้คุณยังสามารถลบพื้นที่ในและในString[] x .substring(0, v+1)
Addison Crump

1
คุณสามารถประหยัดไบต์บางมากขึ้นโดยการสร้างอาร์เรย์จากสตริงแยก: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")70 ไบต์ขณะอาร์เรย์แบบอินไลน์คือ 74
แอรอน

ลองอย่างที่ฉันอาจจะไม่สามารถเล่นกอล์ฟนี้ยากขึ้น ใครบ้างที่มีเคล็ดลับเพิ่มเติม?
Denham Coote

3

Python (3.5) 225 222 217 202 ไบต์

วิธีการแก้ปัญหาการทำงานกับ list comprehension ใน 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)

คำอธิบาย

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

ชนะ 3 ไบต์กับรุ่นแยก (รุ่นก่อนหน้านี้: d="Kuzla","Ponara",...)

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

การเริ่มต้นของผลลัพธ์ในการทำงานของตัวเลขสุดท้าย

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

เปลี่ยนรายการ d เพื่อเก็บอักขระ 2 หรือ 3 ตัวแรกและใส่ตัวพิมพ์เล็ก

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

แมวสตริง


1
2345 ส่งคืน Foham'bocovr มันควรจะคืน Foham'bocovru นี่เป็นเพราะคุณกำลังอ่านอักขระเพียง 2 ตัวแทนที่จะเป็นสูงสุดและรวมถึงสระแรก Pesky Vruenat
Denham Coote

ปัญหาเดียวกันสำหรับ 'Stikty' และ 'Kricola'
Denham Coote

1
@Denham Coote อุ๊ปส์ฉันลืมที่จะตอบความคิดเห็นของคุณ ขอบคุณสำหรับคำพูดของคุณฉันแก้ไขปัญหา
Erwan

2

Javascript ES6, 231 228 225 222 204 ไบต์

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)

บันทึกจำนวนไบต์ต้องขอบคุณ Neil


1
เคล็ดลับการเล่นกอล์ฟทั่วไป: [...s]แทนที่จะเป็นs.split``; b=b==c[0]?"Ku":b+"'"แทนif(b==c[0]){b="Ku"}else b+="'"; ในทำนองเดียวกันสำหรับif(a.length)(เพียงใช้0สำหรับelseส่วน); a.map(d=>b+=c[d].match...)แทนการเล่นซอรอบด้วยและfor shiftฉันคิดว่าบันทึก 29 ไบต์แล้ว
Neil

การดูคำตอบของคนอื่นแนะนำว่าคุณสามารถบันทึกได้อีก 2 ไบต์เพราะคุณจะต้องใช้[iou]เป็นคลาส "สระเสียง" ของคุณเท่านั้น
Neil

@ Neil ขอบคุณ ฉันจะทำอย่างนั้น.
SuperJedi224

2

F #, 364 288 250 ไบต์ (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))

ส่งคืนฟังก์ชันที่ใช้จำนวนเต็มและส่งคืน Flapus ที่เทียบเท่า = D


1

Python 3 - 181 177 ไบต์ (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))

ระวังการใช้งานที่น่าตื่นตาตื่นใจที่สุดของpowคุณจะได้เห็นตลอดชีวิตของคุณ u**vเทียบเท่ากับบริบทบูลีนu|(not v)ซึ่งก่อนหน้านี้ได้~v+2|uแสดงออกถึงนิพจน์ที่ดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.