행성 Flapus에 사용 된 숫자의 음성 이름을 출력합니다


24

Flapus 거주자는 기본 8 숫자 체계를 사용합니다. 숫자는 다음과 같습니다.

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

7보다 큰 숫자의 경우 마지막 자릿수의 전체 이름이 먼저 나오고 아포스트로피와 다른 자릿수의 첫 문자가 첫 번째 모음까지 포함됩니다.

11-포 나라 (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

도전

유효한 base-8 숫자를 받아들이고 동등한 음성을 출력하는 프로그램이나 함수를 작성하십시오. 항상 유효한 번호를받을 것이라고 가정 할 수 있습니다. 답변 후 후행 whitepace / 단일 개행은 괜찮습니다. 첫 문자는 예제와 같이 대문자 여야합니다.

이것은 입니다. 바이트 단위의 최단 코드가 이깁니다. 표준 허점이 적용됩니다. Flapussian으로 길이를 변환하고 추가로 제출 한 답변에는 추가 쿠키가 제공됩니다.

테스트 사례

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-> 쿠크리
100-> 쿠쿠쿠 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

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변경하여 삼항으로 변경하여 몇 바이트를 절약 할 수 있습니다 . 여기 내가 가진 것입니다. 압축 된 문자열에 사용할 수있는 주의를 기울일 것 입니다. formap."
FryAmTheEggman

@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

자바 스크립트 (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 바이트를 더 발견했습니다! 매우 기쁜! 가장 큰 비용 절감은 문자 배열 (대문자 / 소문자)로 전환하고 단어에 입력 문자열 배열을 재사용하는 것입니다.

400 개 미만의 골프 트릭을 발견하십시오! 이론적으로는 규칙에서 기능이 정상이라고 말했지만 전체 프로그램이므로 여전히 더 줄일 수 있습니다.

업데이트 Martin Bü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).
애디슨 크럼프

1
분할 문자열에서 배열을 생성하여 바이트를 더 절약 할 수 있습니다 "Kuzla,Ponara,Boqkel,Colopee,Vruenat,Foham,Stikty,Kricola".split(","). 인라인 배열은 74 바이트 인 반면 70 바이트입니다.
Aaron

내가 시도한대로, 나는 이것을 더 열심히 골프하는 것처럼 보이지 않습니다. 추가 정보가없는 사람이 있습니까?
Denham Coote

3

파이썬 (3.5) 225 222 217 202 바이트

파이썬에서 목록 이해력이있는 작업 솔루션

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]

처음 2 ~ 3자를 유지하고 소문자를 입력하도록 d 목록을 변경하십시오.

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

문자열을 고양이


1
2345는 Foham'bocovr을 반환합니다. Foham'bocovru를 반환해야합니다. 첫 모음을 포함하지 않고 2 자만 읽을 수 있기 때문입니다. 성가신 Vruenat
덴햄 쿠테

'Stikty'와 'Kricola'의 동일한 문제
Denham Coote

1
@ Denham Coote 죄송합니다 귀하의 의견에 답변을 잊어 버렸습니다. 귀하의 의견에 감사드립니다. 문제를 해결했습니다
Erwan

2

자바 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)

Neil 덕분에 많은 바이트를 절약했습니다.


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 바이트가 이미 저장되어 있다고 생각합니다.
Neil

다른 사람의 대답을 엿 보면 [iou]"모음"클래스 로만 사용해야하므로 2 바이트를 더 절약 할 수 있습니다 .
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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.