Wyjście wypowiedzianych nazw liczb używanych na planecie Flapus

24

Mieszkańcy Flapusa używają systemu liczbowego base-8. Liczby to:

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

W przypadku liczb powyżej 7 pierwsza jest pełna nazwa ostatniej cyfry, po której następuje apostrof i pierwsze znaki drugiej cyfry, aż do pierwszej samogłoski:

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

Gdy liczby rosną, formuła pozostaje niezmienna - na pierwszym miejscu znajduje się pełna nazwa ostatnia cyfra, a następnie apostrof i pierwsze znaki pozostałych cyfr, aż do pierwszej samogłoski. Pamiętaj, że oprócz ostatniej cyfry (pierwszego słowa) kolejność pozostaje taka sama.

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

Wyjątkiem od reguły są liczby kończące się na 0. Tutaj słowo zaczyna się od Ku i jest uzupełnione pierwszymi literami pozostałych cyfr, aż do pierwszej samogłoski włącznie. Nie stosuje się apostrofu.

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

Wyzwanie

Napisz program lub funkcję, która akceptuje prawidłowy numer base-8 i wyświetla wypowiadany odpowiednik. Możesz założyć, że zawsze otrzymasz prawidłowy numer. Końcowy biały / pojedynczy znak nowej linii po odpowiedzi jest w porządku. Pierwsza postać musi składać się z wielkich liter, jak na przykładach.

To jest . Najkrótszy kod w bajtach wygrywa. Obowiązują standardowe luki. Odpowiedzi, których długości są konwertowane i dodatkowo przesyłane w języku flapussian, otrzymują dodatkowe pliki cookie.

Przypadki testowe

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
źródło
3
Teraz, gdy o tym myślę, wszystkie liczby brzmią całkiem uroczo
busukxuan

Odpowiedzi:

4

Pyth, 117 bajtów (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

Ręcznie transponowany do pseudokodu pythonowego:

                                           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
źródło
Dobra robota! Możesz zaoszczędzić kilka bajtów, zmieniając swój if ... elsetrójskładnik, zmieniając forpętlę w mapoperację, a następnie wprowadzając niewielkie zmiany. Oto co mam. Chciałbym również zwrócić uwagę na to, ."które mogą być użyte na skompresowanych ciągach.
FryAmTheEggman
@FryAmTheEggman byłem świadomy. ", Ale zupełnie nie spodziewałem się, że to skompresuje pierwszy ciąg!
busukxuan
10

Retina , Colopee'pokri, 165 157 143 127 123 bajtów

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

Końcowe podawanie linii jest znaczące.

Wypróbuj online!

Wyjaśnienie

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

Zaczynamy od przeniesienia cyfry końcowej na przód i wstawienia apostrofu po niej. Zauważ, że pozostawia to liczby jednocyfrowe bez zmian, ponieważ regex się nie zgadza - więc one nigdy nie otrzymują apostrofu.

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

Zastępuje każdą cyfrę pełną nazwą, niezależnie od tego, gdzie się pojawia.

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

Skraca to wszystkie nazwy cyfr pojawiające się po apostrofie. Zauważ, że tylko samogłoski ioupojawiają się najpierw w nazwie cyfrowej, więc sprawdzamy pozycję tuż za jedną z nich i po apostrofie, a następnie dopasowujemy (i usuwamy) wszystkie małe litery następujące po tej pozycji. Ponieważ wstawiliśmy nazwy cyfr w tytule, zatrzyma się przed następną cyfrą.

T`L`l`'.+

Wykorzystuje transliterację, aby zamieniać wszystkie wielkie litery Lna ich małe litery l, pod warunkiem, że zostaną znalezione w dopasowaniu rozpoczynającym się od '(w celu pozostawienia wiodącej stolicy nietkniętej).

zla'

Pozostała tylko poprawna obsługa wielokrotności (ósemkowej) 10. W takim przypadku otrzymamy wynik zaczynający się od Kuzla', od którego chcemy zacząć Ku. Więc po prostu usuwamy wszystkie wystąpienia zla'.

Martin Ender
źródło
Refaktoryzowałem i zastosowałem twoje wyrażenie regularne - oszczędza 10 bajtów! Nie sądzę, żebym mógł wycisnąć znacznie więcej z mojego rozwiązania Java. Ale wciąż mil od ciebie!
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)

Test

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
źródło
4

Java (1.8) - Vruenat'fobo ( 486 340 bajtów)

Właśnie kiedy pomyślałem, że nie mogę już dłużej grać w golfa, znalazłem kolejne 33 bajty! Bardzo zadowolony! Największe oszczędności dotyczyły przejścia na tablice znaków (krótsze na wielkie / małe) i ponownego użycia tablicy ciągów wejściowych dla słów.

Odkrywanie mnóstwa sztuczek golfowych, nawet poniżej 400! Teoretycznie mógłbym jeszcze bardziej to zmniejszyć, ponieważ powiedziałem, że funkcja będzie odpowiednia w regułach, podczas gdy jest to pełny program.

Zaktualizowałem Korzystając z podejścia Martina Büttnera, zrezygnowałem z użycia wyrażenia regularnego. Udało się zaoszczędzić kolejne 10 bajtów! Dzięki 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);}}

Bez golfa

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
źródło
1
Możesz użyć interface Fi usunąć deklarację publiczną dotyczącą głównej metody. Możesz także usunąć miejsce wewnątrz String[] xi na zewnątrz .substring(0, v+1).
Addison Crump,
1
Możesz zaoszczędzić trochę więcej bajtów, generując tablicę z podzielonego łańcucha: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")ma 70 bajtów, a wbudowana tablica to 74.
Aaron
Staram się, jak potrafię, nie mogę bardziej grać w golfa. Czy ktoś ma jakieś dodatkowe wskazówki?
Denham Coote,
3

Python (3.5) 225 222 217 202 bajtów

Działające rozwiązanie ze zrozumieniem listy w Pythonie

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)

Wyjaśnienie

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

Wygraj 3 bajty w wersji podzielonej (poprzednia wersja d="Kuzla","Ponara",...:)

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

Inicjalizacja wyniku w funkcji ostatniej cyfry

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

Zmień listę d, aby zachować pierwsze 2 lub 3 znaki i umieścić małe litery

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

Kot ciąg

Erwan
źródło
1
2345 zwraca Foham'bocovr. Powinien zwrócić Foham'bocovru. Wynika to z faktu, że czytasz tylko 2 znaki, zamiast pierwszej samogłoski włącznie. Pesky Vruenat
Denham Coote
Ten sam problem dla „Stikty” i „Kricola”
Denham Coote
1
@Denham Coote ups, zapomniałem odpowiedzieć na twoje komentarze. dzięki za uwagi, naprawiłem problemy
Erwan
2

JavaScript ES6, 231 228 225 222 204 bajty

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)

Zaoszczędził sporo bajtów dzięki Neilowi.

SuperJedi224
źródło
1
Ogólne wskazówki dotyczące gry w golfa: [...s]zamiast s.split``; b=b==c[0]?"Ku":b+"'"zamiast if(b==c[0]){b="Ku"}else b+="'"; podobnie dla if(a.length)(po prostu użyj 0dla elseczęści); a.map(d=>b+=c[d].match...)zamiast bawić się z fori shift. Myślę, że to już 29 bajtów zapisanych.
Neil
Zerknięcie na odpowiedź kogoś innego sugeruje, że możesz zapisać kolejne 2 bajty, ponieważ wystarczy użyć tylko [iou]jako klasy „samogłoskowej”.
Neil
@Neil Thanks. Zrobię to.
SuperJedi224,
2

F #, 364 288 250 bajtów (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))

Zwraca funkcję, która przyjmuje liczbę całkowitą i zwraca jej odpowiednik Flapus. = D.

Roujo
źródło
1

Python 3 - 181 177 bajtów (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))

Uważaj na najbardziej niesamowite wykorzystanie pow, jakie kiedykolwiek zobaczysz w całym swoim życiu. u**vjest równoważne w kontekście boolowskim, ponieważ u|(not v)wcześniej grało w golfa do miłego ~v+2|uwyrażenia!

JBernardo
źródło