Geben Sie die gesprochenen Namen der auf dem Planeten Flapus verwendeten Nummern aus

24

Die Bewohner von Flapus verwenden ein Zahlensystem zur Basis 8. Die Zahlen sind:

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

Bei Zahlen über 7 steht der vollständige Name der letzten Ziffer an erster Stelle, gefolgt vom Apostroph und den ersten Zeichen der anderen Ziffer (n) bis einschließlich des ersten Vokals:

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

Wenn die Zahlen steigen, bleibt die Formel gleich - die letzte Ziffer des vollständigen Namens steht an erster Stelle, gefolgt von einem Apostroph und den ersten Zeichen der anderen Ziffern bis einschließlich des ersten Vokals. Beachten Sie, dass die Reihenfolge bis auf die letzte Ziffer (erstes Wort) gleich bleibt.

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

Die Ausnahme von der Regel gilt für Zahlen, die mit 0 enden. Hier beginnt das Wort mit Ku und wird mit den ersten Buchstaben der anderen Ziffern bis einschließlich des ersten Vokals abgeschlossen. Es wird kein Apostroph verwendet.

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

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die eine gültige Basis-8-Zahl akzeptiert und das gesprochene Äquivalent ausgibt. Sie können davon ausgehen, dass Sie immer eine gültige Nummer erhalten. Nachgestellte Leerzeichen / einzelne Zeilenumbrüche nach Ihrer Antwort sind in Ordnung. Das erste Zeichen muss gemäß den Beispielen in Großbuchstaben geschrieben werden.

Das ist . Kürzester Code in Bytes gewinnt. Es gelten Standardlücken. Antworten, deren Länge konvertiert und zusätzlich in Flapussisch übermittelt wird, erhalten zusätzliche Cookies.

Testfälle

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
quelle
3
Jetzt, wo ich darüber nachdenke, klingen die Zahlen alle ziemlich süß
busukxuan

Antworten:

4

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

Handtranspilierter pythonischer Pseudocode:

                                           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
quelle
Gute Arbeit! Sie können einige Bytes einsparen, indem Sie if ... elseIhre forSchleife in eine mapOperation umwandeln und dann einige geringfügige Änderungen vornehmen. Hier ist was ich habe. Ich möchte Sie auch darauf aufmerksam machen, ."welche Zeichenfolgen für komprimierte Zeichenfolgen verwendet werden können.
FryAmTheEggman
@FryAmTheEggman, von dem ich wusste. ", Aber ich hatte absolut nicht erwartet, dass es die erste Zeichenfolge komprimieren könnte!
busukxuan
10

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

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

Der Zeilenvorschub am Ende ist signifikant.

Probieren Sie es online!

Erläuterung

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

Wir beginnen damit, die nachgestellte Ziffer nach vorne zu bringen und ein Apostroph danach einzufügen. Beachten Sie, dass einstellige Zahlen unverändert bleiben, da der reguläre Ausdruck nicht übereinstimmt. Daher erhalten diese überhaupt keinen Apostroph.

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

Dies ersetzt jede Ziffer mit ihrem vollständigen Namen, unabhängig davon, wo sie angezeigt wird.

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

Dies verkürzt alle Ziffernnamen, die nach einem Apostroph erscheinen. Beachten Sie, dass iouin einem stelligen Namen nur die Vokale zuerst vorkommen. Wir überprüfen daher eine Position, die direkt nach einer dieser und nach einem Apostroph liegt, und setzen dann alle Kleinbuchstaben, die auf diese Position folgen, in Übereinstimmung (und entfernen sie). Da wir die Ziffernnamen in Groß- und Kleinschreibung eingegeben haben, stoppt dies vor der nächsten Ziffer.

T`L`l`'.+

Hierbei werden alle Großbuchstaben durch Transliteration Lin Kleinbuchstaben umgewandelt l, sofern sie in einer Übereinstimmung gefunden werden, die mit '( beginnt , um die führende Hauptstadt unangetastet zu lassen) beginnt .

zla'

Jetzt müssen wir nur noch ein Vielfaches von (Oktal) 10 richtig verarbeiten. In diesem Fall beginnen wir mit einem Ergebnis, mit Kuzla'dem wir Kustattdessen beginnen möchten . Also entfernen wir einfach alle Vorkommen vonzla' .

Martin Ender
quelle
Ich habe Ihren Regex-Ansatz überarbeitet und verwendet - spart 10 Bytes! Ich glaube nicht, dass ich mehr aus meiner Java-Lösung herausholen kann. Immer noch Meilen von dir entfernt!
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)

Prüfung

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
quelle
4

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

Gerade als ich dachte, ich könnte das nicht mehr Golf spielen, fand ich weitere 33 Bytes! Sehr zufrieden! Die größten Einsparungen ergaben sich durch den Wechsel zu Zeichenfeldern (in Groß- / Kleinbuchstaben) und die Wiederverwendung des Eingabezeichenfolgenfelds für die Wörter.

Entdecken Sie jede Menge Golf-Tricks bis unter 400! Theoretisch könnte ich dies noch weiter reduzieren, da ich sagte, dass eine Funktion in den Regeln in Ordnung wäre, während dies ein vollständiges Programm ist.

Aktualisiert Mit Martin Büttners Ansatz habe ich neu gestaltet, um stattdessen Regex zu verwenden. Es ist gelungen, weitere 10 Bytes zu sparen! Vielen Dank, 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);
}
}
Denham Coote
quelle
1
Sie können interface Fdie öffentliche Deklaration für die Hauptmethode verwenden und entfernen. Sie können auch das Leerzeichen in String[] xund in entfernen .substring(0, v+1).
Addison Crump
1
Sie können weitere Bytes einsparen, indem Sie das Array aus einer geteilten Zeichenfolge erstellen: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")ist 70 Bytes, während das Inline-Array 74 ist.
Aaron
Versuchen Sie, wie ich könnte, ich kann nicht scheinen, dieses härter zu Golf zu spielen. Hat da draußen jemand weitere Tipps?
Denham Coote
3

Python (3.5) 225 222 217 202 Bytes

Eine funktionierende Lösung mit Listenverständnis in 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)

Erläuterung

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

Gewinnen Sie 3 Bytes mit der Split - Version (Vorgängerversion: d="Kuzla","Ponara",...)

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

Initialisierung des Ergebnisses in Abhängigkeit von der letzten Ziffer

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

Ändern Sie die d-Liste, um die ersten 2 oder 3 Zeichen beizubehalten und in Kleinbuchstaben zu schreiben

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

Katze die Schnur

Erwan
quelle
1
2345 kehrt Foham'bocovr zurück. Es sollte Foham'bocovru zurückgeben. Dies liegt daran, dass Sie nur 2 Zeichen lesen, anstatt bis einschließlich des ersten Vokals. Pesky Vruenat
Denham Coote
Gleiches Problem für 'Stikty' und 'Kricola'
Denham Coote
1
@Denham Coote Hoppla, ich habe vergessen, Ihre Kommentare zu beantworten. danke für eure anmerkungen, ich habe die
probleme
2

Javascript ES6, 231 228 225 222 204 Bytes

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)

Dank Neil eine Menge Bytes gespeichert.

SuperJedi224
quelle
1
Allgemeine Golftipps: [...s]statt s.split``; b=b==c[0]?"Ku":b+"'"statt if(b==c[0]){b="Ku"}else b+="'"; ähnlich für die if(a.length)(nur 0für das elseTeil verwenden); a.map(d=>b+=c[d].match...)anstatt mit forund herumzuspielen shift. Ich denke das sind schon 29 Bytes gespart.
Neil
Ein Blick auf die Antwort einer anderen Person legt nahe, dass Sie weitere 2 Bytes speichern können, da Sie diese nur [iou]als "Vokal" -Klasse verwenden müssen.
Neil
@ Neil Danke. Ich werde das tun.
SuperJedi224
2

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

Gibt eine Funktion zurück, die eine Ganzzahl annimmt und ihr Flapus-Äquivalent zurückgibt. = D

Roujo
quelle
1

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

Hüten Sie sich vor dem erstaunlichsten Nutzen, den powSie jemals in Ihrem ganzen Leben gesehen haben werden. u**vist gleichbedeutend mit dem booleschen Kontext, u|(not v)der zuvor auf den netten ~v+2|uAusdruck gesetzt wurde!

JBernardo
quelle