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


24

Жители Flapus используют систему счисления base-8. Числа:

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

Для чисел, превышающих 7, полное имя последней цифры идет первым, за ним следует апостроф и первые символы другой цифры, вплоть до первой гласной включительно:

11 - Понара (1) 'по (1)
13 - Колопи (3)' по (1)
64 - Вруенатьсти
55 - Фохам'фо
47 - Крикола'вру

При увеличении чисел формула остается неизменной - первая цифра полного имени идет первой, за ней следует апостроф и первые символы других цифр, вплоть до первой гласной и включительно. Обратите внимание, что кроме последней цифры (первого слова), порядок остается неизменным.

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

Исключением из правила являются числа, оканчивающиеся на 0. Здесь слово начинается с Ku и заканчивается первыми буквами других цифр, вплоть до первого гласного и включительно. Апостроф не используется.

10 - Купо
70 - Кукри
350 - Кучофо
630 - Кустико
1000 - Купокуку

Вызов

Напишите программу или функцию, которая принимает действительный номер base-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. Тем не менее все еще далеко от вас!
Денхам Кут

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

Ява (1,8) - Вруенатьфобо ( 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);}}

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 Fи удалить публичное объявление основного метода. Вы также можете удалить пространство в String[] xи в .substring(0, v+1).
Эддисон Крамп

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

Попробуйте, как я мог, я не могу играть в гольф это сложнее. У кого-нибудь есть еще советы?
Денхам Кут

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 символа вместо первого гласного. Пески Вруенат
Denham Coote

Та же проблема для «Стикты» и «Криколы»
Денхам Кут

1
@Denham Coote ой, я забыл ответить на ваши комментарии. спасибо за ваши замечания, я исправил проблемы
Erwan

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]как класс «гласных».
Нил

@ Нейл Спасибо. Я это сделаю.
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 байт (Понарабости)

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.