Flapus gezegeninde kullanılan sayıların konuşulan isimlerini çıkar.


24

Flapus sakinleri, 8 tabanlı bir sayı sistemini kullanıyor. Sayılar:

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

7'nin üzerindeki sayılar için son hanenin tam adı önce gelir, ardından kesme işareti ve ilk rakamı ilk sesli harf dahil olmak üzere diğer rakamların ilk karakterleri gelir:

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

Rakamlar arttıkça, formül aynı kalır - ilk basamak tam adı önce gelir, sonra kesme işareti ve ilk basamağı da içeren diğer basamakların ilk karakterleri gelir. Son rakamdan (ilk kelime) ayrı olarak, sıranın aynı kaldığını unutmayın.

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

Kuralın istisnası, 0 ile biten sayılar içindir. Burada sözcük Ku ile başlar ve ilk harfle birlikte gelen ve diğer rakamların ilk harfleriyle tamamlanır. Kesme işareti kullanılmıyor.

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

Meydan okuma

Geçerli bir baz-8 sayısını kabul eden bir program veya işlev yazın ve konuşma eşdeğerini çıktılar. Her zaman geçerli bir numara alacağınızı varsayabilirsiniz. Sonundaki beyaz boşluk / tek satırsonu cevabınız tamam. İlk karakter, örneklere göre büyük harf olmalıdır.

Bu . Bayt cinsinden en kısa kod kazanır. Standart boşluklar uygulanır. Uzunlukları dönüştürülen ve ek olarak Flapussian'a gönderilen yanıtlar ekstra çerezler alır.

Test durumları

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
Şimdi düşünüyorum, sayıları oldukça sevimli geliyor
busukxuan

Yanıtlar:


4

Pyth, 117 bayt (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

Pythonic sözde koduna elle çevrilmiş:

                                           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")

İyi iş! if ... elseDöngünüzü forbir mapişleme dönüştürerek ve ardından bazı küçük değişiklikler yaparak sizi bir üçlü haline getirerek birkaç bayt tasarruf edebilirsiniz . İşte elimde ne var. Ayrıca .", sıkıştırılmış tellerde kullanılabilecek dikkatinizi de çekerim .
FryAmTheEggman

@FryAmTheEggman Farkındaydım. ", Ancak ilk dizgeyi sıkıştırabileceğini tamamen beklemiyordum!
busukxuan

10

Retina , Colopee'pokri, 165 157 143 127 123 bayt

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

Sondaki satır besleme hızı önemli.

Çevrimiçi deneyin!

açıklama

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

Sondaki basamağı öne getirerek ve ardından kesme işareti ekleyerek başlıyoruz. Bunun, regex'in eşleşmediğinden tek basamaklı sayıları değiştirmemesini sağladığını unutmayın; böylece bunlar ilk etapta kesme işareti almazlar.

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

Bu, nerede göründüğüne bakılmaksızın her basamağın tam adıyla değiştirilir.

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

Bu kesme işareti sonrasında görünen tüm rakam adlarını kısaltır. Sadece ünlü harflerin iouilk önce rakam adında göründüğüne dikkat edin, bu nedenle bunlardan hemen sonra ve kesme işareti sonrasında bir pozisyonu kontrol ettikten sonra, o pozisyonu takip eden tüm küçük harfleri eşleştirelim (ve kaldırın). Rakam adlarını başlık harfine eklediğimizden, bu bir sonraki haneden önce duracaktır.

T`L`l`'.+

Bu, tüm büyük harf karakterlerini, baş Lharflerle eşleşerek (baştaki sermayeye dokunmadan bırakmak için) lbulunması şartıyla , küçük harf karşılığına çevirmek için harf çevirisini kullanır '.

zla'

Kalan tek şey (sekizlik) 10'un katlarını doğru şekilde kullanmaktır. Bu durumda, onunla Kuzla'başlamak istediğimiz bir sonuç elde edeceğiz Ku. Bu yüzden biz sadece tüm oluşumlarını kaldırırız zla'.


Regex yaklaşımınızı yeniden canlandırdım ve kullandım - 10 byte kazandırır! Java çözümümden daha fazla sıkabileceğimi sanmıyorum. Yine de kilometrelerce uzakta!
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)

Ölçek

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 bayt)

Bunu daha fazla golf oynayamayacağımı düşündüğümde, 33 bayt daha buldum! Çok memnun! En büyük tasarruf, karakter dizilerine geçiş yapmaktan (kısa / büyük / küçük harflere) geçiş yapmak ve kelimeler için giriş dizgisini yeniden kullanmaktı.

400'ün altına kadar birçok golf oyununu keşfetme! Teoride bunu daha da azaltabilirim, çünkü kurallarda bir fonksiyonun iyi olacağını söylerken, bu tam bir programdır.

Martin Büttner'in yaklaşımını kullanarak güncellendi , bunun yerine regex kullanmaya başladım. 10 bayt daha kurtarmayı başardık! Teşekkürler 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);}}

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 FGenel beyanı ana yöntem üzerinde kullanabilir ve silebilirsiniz. Ayrıca, içindeki String[] xve içindeki boşluğu kaldırabilirsiniz .substring(0, v+1).
Addison Crump

1
Diziyi bir dizgeden oluşturarak daha fazla bayt kaydedebilirsiniz: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")satır içi dizi 74 iken, 70 byte olur.
Aaron

Olabildiğince dene, bunu daha fazla golf oynayamadım. Başka ipuçları olan var mı?
Denham Coote,

3

Python (3.5) 225 222 217 202 bayt

Python'da liste anlama özelliğine sahip çalışma çözümü

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)

açıklama

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

(Önceki sürümü: Bölünmüş sürümü ile 3 bayt kazan d="Kuzla","Ponara",...)

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

Son hanenin işlevinde sonucun ilklendirilmesi

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

İlk 2 veya 3 karakteri saklamak için d listesini değiştirin ve küçük harf koyun.

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

Dize kedi


1
2345, Foham'bocovr'u döndürür. Foham'bocovru'yu iade etmeli. Bunun nedeni, ilk ünlü olana kadar ve yerine sadece 2 karakter okuyorsun. Sinir bozucu Vruenat
Denham Coote

'Stikty' ve 'Kricola' için de aynı sorun
Denham Coote

1
@Denham Coote, yorumlarınızı cevaplamayı unuttum. düşünceleriniz için teşekkürler, sorunları düzelttim
Erwan

2

Javascript ES6, 231 228 225 222 204 bayt

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 sayesinde bir sürü baytı kurtardım.


1
Genel golf önerileri: [...s]yerine s.split``; b=b==c[0]?"Ku":b+"'"yerine if(b==c[0]){b="Ku"}else b+="'"; benzer şekilde if(a.length)(sadece parça 0için kullanın else); a.map(d=>b+=c[d].match...)yerine ile ilgilenmek forve shift. Bence zaten 29 byte kaydetti.
Neil

Başkasının cevabına göz atmak, başka bir 2 byte tasarruf yapabileceğinizi gösterir çünkü yalnızca [iou]"ünlü" sınıfınız olarak kullanmanız gerekir .
Neil

@Neil Teşekkürler. Bunu yapacağım.
SuperJedi224

2

F # 364 288 250 bayt (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))

Bir tamsayı alan ve Flapus eşdeğeri döndüren bir işlev döndürür. = D


1

Python 3 - 181 177 bayt (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))

powHayatınız boyunca göreceğiniz en şaşırtıcı kullanımı dikkat edin . u**vBoole bağlamında eşittir, u|(not v)daha önce güzel ~v+2|uifadeyle golf yapıldı !

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.