Виведіть розмовні назви чисел, які використовуються на планеті Флапус


24

Мешканці Флапуса використовують базову систему числення 8. Цифри:

0 - Кузла
1 - Понара
2 - Боккель
3 - Колопі
4 - Вруенат
5 - Фохам
6 - Стикти
7 - Крикола

Для чисел, що перевищують 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, отримують додаткові файли cookie.

Тестові справи

0 -> Кузла
1 -> Понара
2 -> Боккель
3 -> Колоп
4 -> Вруенат
5 -> Фохам
6 -> Стикти
7 -> Крикола
10 -> Купо
11 -> Понара'по
23 -> Колопі'бо
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

Ручний переклад на пітонічний псевдокод:

                                           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

Почнемо з того, що підводимо проміжну цифру до передньої частини та вставляємо після неї апостроф. Зауважте, що це залишає одноцифрові числа незмінними, оскільки регулярний вираз не збігається - тому вони ніколи не отримують апострофа в першу чергу.

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'.


Я відремонтував та застосував ваш підхід до регулярного вибору - економить 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 байти! Дуже задоволений! Найбільша економія була від переходу на масиви знаків (коротший на верхній / нижній регістр) та повторного використання масиву вхідних рядків для слів.

Відкриваючи безліч трюків з гольфу, аж до 400! Теоретично я все-таки міг би зменшити це більше, тому що я сказав, що в правилах функція буде нормальною, тоді як це повна програма.

Оновлено, використовуючи підхід Мартіна Бюттнера, я відновив натомість використання регулярного виразу. Вдалося зберегти ще 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);}}

Безумовно

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).
Аддісон Кримп

1
Ви можете зберегти ще кілька байт, генеруючи масив із розділеного рядка: "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")це 70 байт, тоді як вбудований масив - 74.
Аарон

Спробуйте, як я міг, я не можу здатися, що гольфу це важче. Хтось із будь-якими подальшими порадами?
Denham Coote

3

Python (3.5) 225 222 217 202 байт

Робоче рішення з розумінням списку в 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 повертається Фохам'боковр. Це повинно повернути Фохам'боковру. Це тому, що ви читаєте лише 2 символи, а не до першої голосної. Пескі Вруенат
Денхам

Та ж проблема для "Stikty" та "Kricola"
Denham Coote

1
@Denham Coote На жаль, я забув відповісти на ваші коментарі. дякую за ваші зауваження, я виправив проблеми
Ерван,

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)

Зберегли купу байтів завдяки Нілу.


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 байтів.
Ніл

Заглянувши у чужу відповідь, ви можете зберегти ще 2 байти, тому що вам потрібно використовувати лише [iou]як ваш "голосний" клас.
Ніл

@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

Пітон 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виражене!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.