输出Flapus星球上使用的数字的口语名称


24

Flapus的居民使用以8为底的数字系统。这些数字是:

0-库兹拉
1-蓬纳拉
2-博克尔
3-科洛佩
4-弗鲁埃纳特
5-泡沫
6-斯蒂基蒂
7-克里科拉

对于超过7的数字,最后一位的全名是第一位的,其后是撇号和其他位的第一个字符,直到并包括第一个元音:

11-波纳拉(1)'po(1)
13-柯洛佩(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

Answers:


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

手动翻译为pythonic伪代码:

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

@FryAmTheEggman我知道了。”,但我完全没想到它会压缩第一个字符串!
busukxuan

10

视网膜,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

爪哇(1.8) - Vruenat'fobo(486个 340字节)

就在我以为无法再打高尔夫球的时候,我又发现了33个字节!很高兴!最大的节省是从切换到char数组(从小写到大写/小写),以及为单词重新使用输入字符串数组。

发现多达400种以下的高尔夫技巧!从理论上讲,我仍然可以进一步减少这个费用,因为我说规则中的某个功能可以,但是这是一个完整的程序。

使用MartinBüttner的方法进行了更新,我重构为使用正则表达式。设法节省了另外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)
Addison Crump

1
您可以通过从拆分字符串生成数组来节省更多字节:"Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(",")是70个字节,而内联数组是74。–
Aaron

尽我所能,我似乎再也不能打高尔夫球了。有其他建议吗?
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返回Foham'bocovr。它应该返回Foham'bocovru。这是因为您只读取2个字符,而不是直到并包括第一个元音。斯基(Pesky Vruenat)
丹纳姆·库特

'Stikty'和'Kricola'的相同问题
Denham Coote

1
@Denham Coote糟糕,我忘了回答您的评论。感谢您的发言,我更正了这些问题
Erwan,2016年

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...)而不是摆弄forshift。我认为已经保存了29个字节。
尼尔

偷看别人的答案表明您可以再节省2个字节,因为您只需要[iou]用作“元音”类即可。
尼尔

@尼尔谢谢。我会去做。
SuperJedi224 '16

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

Python的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表情!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.