Afficher les noms parlés des nombres utilisés sur la planète Flapus

24

Les habitants de Flapus utilisent un système de numérotation en base 8. Les chiffres sont les suivants:

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

Pour les nombres supérieurs à 7, le nom complet du dernier chiffre vient en premier, suivi de l'apostrophe et des premiers caractères des autres chiffres, jusqu'à et y compris la première voyelle:

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

Au fur et à mesure que les chiffres augmentent, la formule reste la même - le nom complet du dernier chiffre vient en premier, suivi d'une apostrophe et des premiers caractères des autres chiffres, jusqu'à et y compris la première voyelle. Notez qu'à part le dernier chiffre (premier mot), l'ordre reste le même.

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

L'exception à la règle est pour les nombres se terminant par 0. Ici, le mot commence par Ku et se termine par les premières lettres des autres chiffres, jusqu'à et y compris la première voyelle. Aucune apostrophe n'est utilisée.

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

Défi

Écrivez un programme ou une fonction qui accepte un nombre de base 8 valide et génère l'équivalent parlé. Vous pouvez supposer que vous recevrez toujours un numéro valide. Espace blanc / saut de ligne unique après votre réponse est correct. Le premier caractère doit être en majuscule, selon les exemples.

C'est du . Le code le plus court en octets gagne. Des échappatoires standard s'appliquent. Les réponses dont les longueurs sont converties et soumises en plus en flapussien reçoivent des cookies supplémentaires.

Cas de test

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
la source
3
Maintenant que j'y pense, les chiffres semblent tous assez mignons
busukxuan

Réponses:

4

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

Transformé à la main en pseudocode pythonique:

                                           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
la source
Bon travail! Vous pouvez économiser quelques octets en changeant votre if ... elseen ternaire en changeant votre forboucle en mapopération, puis en apportant quelques modifications mineures. Voici ce que j'ai. Je voudrais également attirer votre attention sur ."ce qui peut être utilisé sur les chaînes compressées.
FryAmTheEggman
@FryAmTheEggman que j'étais au courant. ", Mais je ne m'attendais absolument pas à ce qu'il puisse compresser la première chaîne!
busukxuan
10

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

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

Le saut de ligne arrière est important.

Essayez-le en ligne!

Explication

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

Nous commençons par amener le dernier chiffre à l'avant et en insérant une apostrophe après. Notez que cela laisse les nombres à un chiffre inchangés, car l'expression régulière ne correspond pas - donc ceux-ci n'obtiennent jamais une apostrophe en premier lieu.

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

Cela remplace chaque chiffre par son nom complet, peu importe où il apparaît.

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

Cela raccourcit tous les noms de chiffres qui apparaissent après une apostrophe. Notez que seules les voyelles iouapparaissent en premier dans un nom de chiffre, nous vérifions donc une position juste après l'une d'elles, et après une apostrophe, puis nous comparons (et supprimons) toutes les lettres minuscules qui suivent cette position. Puisque nous avons inséré les noms des chiffres dans la casse du titre, cela s'arrêtera avant le chiffre suivant.

T`L`l`'.+

Cela utilise la translittération pour transformer tous les caractères majuscules Len leur homologue minuscule l, à condition qu'ils se trouvent dans une correspondance commençant par '(afin de ne pas toucher à la première majuscule).

zla'

La seule chose qui reste est de gérer correctement les multiples de (octal) 10. Dans ce cas, nous aurons un résultat commençant par Kuzla', avec lequel nous voulons commencer à la Kuplace. Nous supprimons donc simplement toutes les occurrences de zla'.

Martin Ender
la source
J'ai refactorisé et utilisé votre approche regex - économise 10 octets! Je ne pense pas pouvoir tirer beaucoup plus de ma solution Java. Toujours à des kilomètres de la vôtre!
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)

Tester

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
la source
4

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

Juste au moment où je pensais que je ne pouvais plus jouer au golf, j'ai trouvé 33 autres octets! Très content! Les plus grandes économies ont été réalisées en passant aux tableaux de caractères (plus courts en majuscules / minuscules) et en réutilisant le tableau de chaînes d'entrée pour les mots.

Découvrez de nombreuses astuces de golf, jusqu'à moins de 400! En théorie, je pourrais encore réduire cela, comme je l'ai dit, une fonction serait ok dans les règles, alors que c'est un programme complet.

Mise à jour En utilisant l'approche de Martin Büttner, j'ai refactorisé pour utiliser l'expression régulière à la place. Géré pour économiser encore 10 octets! Merci 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);}}

Non golfé

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
la source
1
Vous pouvez utiliser interface Fet supprimer la déclaration publique sur la méthode principale. Vous pouvez également supprimer l'espace à l'intérieur String[] xet à l'intérieur .substring(0, v+1).
Addison Crump
1
Vous pouvez économiser encore plus d'octets en générant le tableau à partir d'une chaîne divisée: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")70 octets, tandis que le tableau en ligne est 74.
Aaron
Essayez comme je pourrais, je n'arrive pas à jouer au golf plus fort. Quelqu'un avec d'autres conseils?
Denham Coote
3

Python (3,5) 225 222 217 202 octets

Une solution de travail avec compréhension de liste en 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)

Explication

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

Gagnez 3 octets avec la version partagée (version précédente: d="Kuzla","Ponara",... )

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

Initialisation du résultat en fonction du dernier chiffre

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

Modifiez la liste d pour conserver les 2 ou 3 premiers caractères et mettez-les en minuscules

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

Cat la chaîne

Erwan
la source
1
2345 renvoie Foham'bocovr. Il devrait renvoyer Foham'bocovru. C'est parce que vous ne lisez que 2 caractères, au lieu de jusqu'à et y compris la première voyelle. Pesky Vruenat
Denham Coote
Même problème pour 'Stikty' et 'Kricola'
Denham Coote
1
@Denham Coote oups J'ai oublié de répondre à vos commentaires. merci pour vos remarques, j'ai corrigé les problèmes
Erwan
2

Javascript ES6, 231 228 225 222 204 octets

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)

Sauvegardé un tas d'octets grâce à Neil.

SuperJedi224
la source
1
Conseils généraux sur le golf: [...s]au lieu de s.split``; b=b==c[0]?"Ku":b+"'"au lieu de if(b==c[0]){b="Ku"}else b+="'"; de même pour le if(a.length)(juste utiliser 0pour la elsepartie); a.map(d=>b+=c[d].match...)au lieu de jouer avec foret shift. Je pense que c'est déjà 29 octets enregistrés.
Neil
Jetant un coup d'œil à la réponse de quelqu'un d'autre, vous pouvez enregistrer 2 octets supplémentaires car vous n'avez besoin que de l'utiliser [iou]comme classe "voyelle".
Neil
@Neil Merci. Je ferai ça.
SuperJedi224
2

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

Renvoie une fonction qui prend un entier et renvoie son équivalent Flapus. = D

Roujo
la source
1

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

Méfiez-vous de l'utilisation la plus étonnante de powvotre vie. u**vest équivalent sur le contexte booléen comme u|(not v)qui était auparavant joué à la belle ~v+2|uexpression!

JBernardo
la source