스페인 시간이야!


24

코드를 사용하여 비교적 쉽게 구현할 수있는 간단한 작업이 있습니다. 목표 는 시간을 HH : MM 형식으로 제공하여 스페인어로 작성된 시간을 출력하는 프로그램을 작성하는 것입니다. 많은 사람들 이이 작업을 수행 하는 방법 을 모르기 때문에 자세히 설명하겠습니다.

스페인어로 된 시간은 상당히 논리적입니다. 일반적으로 "Es la / Son las (hour) y (minutes)"패턴을 따릅니다. 시간은 12 시간 형식이며 "Es la"는 시간이 1 (예 : 1시) 인 경우 에만 사용 됩니다. 분은 다른 이야기입니다. 분이 30보다 작 으면 위와 같이 표시됩니다. 그러나 분이 30을 초과하면 시간이 반올림되고 분이 뺍니다. 예를 들어, 7:35는 "8 시간-25 분"에 해당합니다. 아래에 몇 가지 예가 더 있습니다. 필요한 스페인어 번호 목록은 여기 에서 찾을 수 있습니다 . 일부 숫자에는 악센트가 있지만 반드시 그럴 필요는 없습니다.

참고 : 소스는 "uno"라고 말하지만 문법적으로는 "una"여야합니다. 이것은 지금까지 어떤 대답에도 영향을 미치지 않습니다.

참고 2 : 또한 "세로"는 필요하지 않습니다. 프로그램이 "Es la una"또는 "Son las tres"를 출력하면 괜찮습니다. 이 규칙이 변경되어 죄송합니다.

규칙

  • 입력은 STDIN 또는 해당 언어로 이에 상응하는 내용을 통해 제공됩니다.
  • 외부 도서관에서 읽지 마십시오.
  • 코드가 유효하지 않은 입력으로 무엇이든 할 수 있습니다.

보너스

  • 코드에서 이러한 추가 문구를 추가하는 경우 -10 : : 15의 경우 "y cuarto", : 30의 경우 "y media", : 45의 경우 "menos cuarto"(반올림)
  • -15 코드가 AM 및 PM을 처리 할 수 ​​있으면 "de la mañana"및 "de la tarde"로 응답합니다.
  • 입력이 없으면 코드에서 현재 시간을 변환 할 수있는 경우 -15

채점

  • 이것은 코드 골프 챌린지이며 문자가 아닌 바이트로 점수가 매겨집니다.

입력 : 8:10 출력 :Son las ocho y diez.

입력 : 6:45 출력 :Son las siete menos quince (or cuarto).

입력 : 1:29 출력 :Es la una y veintinueve.

입력 : 12:55 출력 :Es la una menos cinco.

여기에 지정할 것이 있으면 알려주십시오. 이것은 내 첫 번째 질문이므로 완벽하지는 않습니다.


자세한 내용은 샌드 박스에 게시하기 전에 피드백을받을 수 있습니다 .
Stretch Maniac

1
@Sparr 나는 그것을 의심한다. 이를 위해서는 하드 코딩해야 할 숫자가 충분할 것입니다. 최소한 45 자 이상의 가치가 있으며 패턴을 설명하기까지합니다.
mdc32 1

1
@ 데니스 흠 ... 둘 다 괜찮을 것 같아요. Es la una y cero꽤 반복적이므로 요점을 알 수 있습니다. 나는 이것을 지정하지 않았으므로 어느 쪽이든 괜찮을 것 같습니다. 피드백 감사드립니다.
mdc32

1
01:21적어도 하나의 답변자가 una vs uno 에 대해 말한 내용에 혼란스러워 테스트 사례로 추가해야합니다 .
피터 테일러

3
두 번째 보너스는 "de la", "manana"및 "tarde"라는 문구만으로 이미 16 바이트까지 계산되므로 (거의?) 가치가 없습니다.
britishtea

답변:


9

자바 스크립트 (ES6) (308) (316)

Edit2가 버그 수정 편집 보너스 항에 잊었
팝업을 통해 I / O와 프로그램으로를

s='media0uno0dos0tres0cuatro0cinco0seis0siete0ocho0nueve0diez0once0doce0trece0catorce0cuarto0dieci0veint'.split(0),
N=n=>n<16?s[n]:n<20?s[16]+s[n-10]:n>29?s[0]:s[17]+(n>20?'i'+s[n-20]:'e'),
[h,m]=prompt().split(':'),
alert(((h=(10-~h+(m>30))%12)?'Son las '+N(1+h):'Es la una')+(m>30?' menos '+N(60-m):-m?' y '+N(~~m):''))

테스트 가능한 기능으로

F=t=>(
  s='media0uno0dos0tres0cuatro0cinco0seis0siete0ocho0nueve0diez0once0doce0trece0catorce0cuarto0dieci0veint'.split(0),
  N=n=>n<16?s[n]:n<20?s[16]+s[n-10]:n>29?s[0]:s[17]+(n>20?'i'+s[n-20]:'e'),
  [h,m]=t.split(':'),
  ((h=(10-~h+(m>30))%12)?'Son las '+N(1+h):'Es la una')+(m>30?' menos '+N(60-m):-m?' y '+N(~~m):'')
)

FireFox / FireBug 콘솔에서 테스트

for(i=0;i<13;i++)
{
   console.log(F(i+':'+i)+'. '+F(i+':'+(i+15))+'. '+F(i+':'+(i+30))+'. '+F(i+':'+(i+45)))
}

산출

Son las doce. Son las doce y cuarto. Son las doce y media. Es la una menos cuarto
Es la una y uno. Es la una y dieciseis. Son las dos menos veintinueve. Son las dos menos catorce
Son las dos y dos. Son las dos y diecisiete. Son las tres menos veintiocho. Son las tres menos trece
Son las tres y tres. Son las tres y dieciocho. Son las cuatro menos veintisiete. Son las cuatro menos doce
Son las cuatro y cuatro. Son las cuatro y diecinueve. Son las cinco menos veintiseis. Son las cinco menos once
Son las cinco y cinco. Son las cinco y veinte. Son las seis menos veinticinco. Son las seis menos diez
Son las seis y seis. Son las seis y veintiuno. Son las siete menos veinticuatro. Son las siete menos nueve
Son las siete y siete. Son las siete y veintidos. Son las ocho menos veintitres. Son las ocho menos ocho
Son las ocho y ocho. Son las ocho y veintitres. Son las nueve menos veintidos. Son las nueve menos siete
Son las nueve y nueve. Son las nueve y veinticuatro. Son las diez menos veintiuno. Son las diez menos seis
Son las diez y diez. Son las diez y veinticinco. Son las once menos veinte. Son las once menos cinco
Son las once y once. Son las once y veintiseis. Son las doce menos diecinueve. Son las doce menos cuatro
Son las doce y doce. Son las doce y veintisiete. Es la una menos dieciocho. Es la una menos tres

8

예, 세계 최악의 골퍼가 코딩 한 골프 대회에서 가장 기대되는 언어가 돌아 왔습니다!

Java-676 바이트 (716-10-15-15)

골프 :

class A{void main(String[]a){java.util.Calendar c=java.util.Calendar.getInstance();int h,m;String s="";h=c.get(c.HOUR);m=c.get(c.MINUTE);String[]e={"doce","una","dos","tres","quatro","cinco","ses","siete","ocho","nueve","diez","once","doce","trece","catorce","quarto","çseís","çsiete","çocho","çnueve","xe","xiuno","xidós","xitrés","xiquatro","xicinco","xiséis","xisiete","xiocho","xinueve","media"};for(int i=0;++i<30;e[i]=e[i].replace("ç","dieci"),e[i]=e[i].replace("x","vient"));s+=(h==1&m<30|h==12&m>30)?"Es la ":"Son las ";s+=(m<=30)?e[h]:(h==12&m>30)?e[1]:e[h+1];s+=(m==0)?" certas":(m<=30)?" y "+e[m]:" menos "+e[60-m];s+=(c.get(c.AM_PM)==0)?" de la mañana.":" de la tarde.";System.out.println(s);}}

언 골프 드 :

public class A {

    public static void main(String[] a) {
        java.util.Calendar c = java.util.Calendar.getInstance();
        int h, m;
        String s = "";
        h = c.get(c.HOUR);
        m = c.get(c.MINUTE);
        String[] e = {"doce", "una", "dos", "tres", "quatro", "cinco", "ses", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quarto", "çseís", "çsiete", "çocho", "çnueve", "xe", "xiuno", "xidós", "xitrés", "xiquatro", "xicinco", "xiséis", "xisiete", "xiocho", "xinueve", "media"};
        for (int i = 0; ++i < 30; e[i] = e[i].replace("ç", "dieci"), e[i] = e[i].replace("x", "vient"));
        s += (h == 1 & m < 30 | h == 12 & m > 30) ? "Es la " : "Son las ";
        s += (m <= 30) ? e[h] : (h == 12 & m > 30) ? e[1] : e[h + 1];
        s += (m == 0) ? " certas" : (m <= 30) ? " y " + e[m] : " menos " + e[60 - m];
        s += (c.get(c.AM_PM) == 0) ? " de la mañana." : " de la tarde.";
        System.out.println(s);
    }
}

와 거래 quartomedia의 AM / PM와 아무런 입력이 없습니다. 그래도 모든 보너스를 청구 할 수 있지만, 이러한 기능을 구현하지 않으면 점수가 훨씬 낮아집니다. 얼굴


6

파이썬 3 : 294 자-10 = 284

h,m=map(int,input().split(':'))
t="y"
d="yunoydosytresycuatroycincoyseisysieteyochoynueveydiezyonceydoceytreceycatorceycuarto".split(t)*2
if m>30:h=h%12+1;m=60-m;t="menos"
print(["Es la una","Son las "+d[h]][h>1],t,[d[m]or"cero",["dieci","veint"+'ei'[m>20],"media"][m//10-1]+d[m%10]][m>15]+".")

"cuarto"및 "media"사용시 10 포인트 보너스를받습니다.

우리는 시간과 분을 ints 로 읽습니다 . 분이 30을 초과하면 다음 시간으로 이동하여 60 분에서 분을 측정하고 연결을 "menos"로 변경합니다.

이 목록 d에는 최대 15 개의 스페인어 숫자가 번역되어 d[0]있습니다 ''. "diecicero"와 같은 것을 방지하기 위해 작성 되었습니다. 이것은 split(' ')초기 공간 으로 어색하게 호출 하여 수행됩니다 . 일반 split은 그것을 무시할 것입니다. 0 분의 경우는 나중에 처리됩니다.

15보다 큰 숫자를 얻기 위해 10 자리 문자열과 적절한 1 자리 문자열을 결합합니다. 15그리고 30무료로 "미디어"와 "쿠 아르토"로 기록됩니다.

Python 3은 Python 2에 하나의 char net을 저장합니다. input대신 -4 대신 -4 raw_input, 인쇄에서 parens는 +2, +1은 //.


그보다 더 복잡하다고 말하는 것이 슬프다. 시간은 여성이지만 분은 남성이기 때문에 01:21은 la veintiuno 이어야합니다 .
피터 테일러

@PeterTaylor 알겠습니다. uno / una 유일한 숫자가 영향을 받습니까?
xnor

그렇습니다. 수백 개의 숫자로 올라가면 다른 것이있을 것입니다.
피터 테일러

@PeterTaylor 5 자 고정.
xnor

@ edc65 으악, 나는의 실제 변화에 붙여 잊었 unauno지금 작동합니다.
xnor

5

PHP, 351 3360360-15 = 345 바이트

<?$a=split(~ß,~œšßŠ‘ß›Œß‹šŒßœŠž‹ßœ–‘œßŒš–ŒßŒ–š‹šßœ—ß‘Šš‰šß›–š…ß‘œšß›œšß‹šœšßœž‹œšßŽŠ–‘œšß›–šœ–߉š–‘‹–ß‹š–‘‹ž)?><?=preg_filter(~Ð×ÑÔÖÅ×ÑÔÖК,'(($h=($1-($k=$2<31))%12+1)>1?~¬‘ß“žŒß:~ºŒß“žß).$a[$h].($k?~߆ß:~ß’š‘Œß).(($m=$k?$2+0:60-$2)<16?$a[$m]:($m<20?$a[16].$a[$m%10]:($m<21?viente:($m<30?$a[17].$a[$m%10]:$a[18])))).~Ñ',$_GET[0]?:date(~·Å–));

이 프로그램은 명령 행이 아닙니다 : $ _GET [0]을 통해 입력을받습니다. php.ini에서 알림을 비활성화해야 할 수도 있습니다. 이제 Niet the Dark Absol 덕분에 입력이없는 자동 시간이 제공됩니다.

사용 된 트릭 :

~(...) PHP는 일반적으로 0x80에서 0xFF까지의 모든 ASCII를 문자열로 가정하므로 따옴표가 필요하지 않으므로 문자열을 비트 단위로 뒤집어 1 바이트를 절약합니다.

<?=preg_filter(...,...): <?=는 바로 가기입니다 <? echo. preg_filter()일반적으로 정규 표현식을 사용하여 문자열에 대체를 적용하지만 감가 상각 / e 수정자를 사용하여 결과 문자열을 PHP 코드로 평가할 수 있습니다. 따라서 입력 문자열을 두 개의 개별 변수로 나누지 않고 일치하는 입력 문자열에서 역 참조 ($ 1 및 $ 2)를 사용하여 많은 양의 바이트를 절약 할 수 있습니다.


2
$_GET[0]?:date(~·Å–)점수에서 3을 빼 려면 -15 보너스를 청구 할 수 있습니다 .
어둠의 절대자 니트

감사. 나는 그와 하나의 사소한 개선을 만들었습니다.
Tryth

5

C ++ : 474 ... 422 411 바이트

이 버전은 cuarto / media 보너스 (-10)를 사용합니다.

#include<cstdlib>
#include<cstdio>
int main(int u,char**v){char*b[]={"cero","una","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","cuarto","dieci","veinti","media",0,"veinte"};int h=atoi(v[1]),m=atoi(v[1]+2+(v[1][2]>57)),n=m>30,o;h=n?h%12+1:h;m=o=n?60-m:m;if(u=m>15&m!=20)o=m%10;printf("%s %s %s %s%s",h>1?"Son las":"Es la",b[h],n?"menos":"y",u?b[m/10+15]:"",b[o?o:m]);}

코드 골프에 대한 나의 첫 번째 시도! 이번 주말에 그것을 개선하려고 노력할 것입니다.

언 골프 드 :

#include<cstdlib>
#include<cstdio>
int main(int u,char**v)
{
char*b[]={"cero","una","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","cuarto","dieci","veinti","media",0,"veinte"};
int h=atoi(v[1]),m=atoi(v[1]+2+(v[1][2]>57)),n=m>30,o;
h=n?h%12+1:h;
m=o=n?60-m:m;
if(u=m>15&m!=20)o=m%10;
printf("%s %s %s %s%s",h>1?"Son las":"Es la",b[h],n?"menos":"y",u?b[m/10+15]:"",b[o?o:m]);
}

1
당신은 수 없습니다m%=10
Timtech

좋은 지적! 불행히도 새 개정판에서는 해당 값을 다른 변수에 할당해야하므로 할 수 없습니다.
BMac

좋아, 그냥 궁금해 :)
Timtech

4

루아, 450-10 (cuarto / media)-15 (manana / tarde) = 425

n={'uno','dos','tres','cuatro','cinco','seis','siete','ocho','nueve','diez','once','doce','trece','catorce','cuarto',[20]='veinte',[30]='media'}for i=1,9 do n[i+10]=n[i+10]or'dieci'..n[i]n[i+20]='veinti'..n[i]end H,M=io.read():match('(%d+):(%d+)')H,M=H+0,M+0 X,Y='tarde',' y 'if H<12 then X='manana'end if M>30 then H,M,Y=H+1,60-M,' menos 'end H=(H-1)%12+1 S=H==1 and'es la una'or'son las '..n[H]if M>0 then S=S..Y..n[M]end S=S..' de la '..X print(S)
  • 21-29의 생성기를 다시 작성하여 12 바이트를 삭제했습니다.
  • 교체함으로써 1보다 하락 H>=12H<12주변 종속 식 스위치.
  • 함수에서 전역 네임 스페이스를 오염시켜 4 가지를 더 떨어 뜨 렸습니다 (사악하지만 골프를 좋아합니다 :).
  • 정규식을 수정했습니다. 콜론을 잊었습니다. 그러나 바이트 수는 변경하지 않습니다.
  • 0 분의 경우를 수정하고 table.concat문자열 op로 교체 하고 @ edc65의 제안을 추가하여 궁극적으로 22 바이트를 추가했습니다.
  • 부끄러워 인상 function주 청크로 몸 밖으로 무려 길이가 감소 된 15 바이트 .

'una'를 몇 시간 동안, 'uno'를 몇 분 동안 사용해야합니다. 따라서 '01 : 01 '은 다음을 제공해야합니다Es la una y uno
edc65

3

D-484 바이트

import std.stdio,std.conv,std.string;void main(){auto n="cero una dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciséis diecisiete dieciocho diecinueve e iuno idos itres icuatro icinco iseis isiete iocho inueve treinta".split;auto p=stdin.readln()[0..$-1];int b=to!int(p[0..$-3]),a=to!int(p[$-2..$]);auto c=a;b=a>30?b+1:b;b%=12;a=a>30?60-a:a;writefln("%s %s %s %s", b==1||b==12?"Es la":"Son las",n[b],c>30?"menos":"y",(a/10==2?"vient":"")~n[a]);}

'una'를 몇 시간 동안, 'uno'를 몇 분 동안 사용해야합니다. 따라서 '01 : 01 '은 다음을 제공해야합니다Es la una y uno
edc65

3

파이썬 3, 409 바이트

d='cero uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciseis diecisiete dieciocho diecinueve veinte xuno xdos xtres xcuatro xcinco xseis xsiete xocho xnueve treinta';d=str(d.replace('x','veinti')).split();t=input().split(':');i=int(t[1]);j=int(t[0]);print(["Son las","Es la"][1<(2*j+i/30)%24<=3],[d[[j%12+1,j][i<31]],'una'][j==1],'y'if i<31 else'menos',d[min(i,60-i)])

다음과 같이 긴 문자열 목록을 단축 할 수 있습니다.'string1 string2 string3'.split()
xnor

@xnor 좋아, 고마워!
Hosch250

@ hosch250 또한 원래 게시물의 댓글을 다시 따르고 있는지 확인하십시오. 나는 약간의 규칙 변경을 많이 할 것입니다. 그리고 이것은 아마도 당신이 골프를 도울 것입니다.
mdc32

@ mdc32 지금 조정 중입니다. 어쨌든 약간의 오류가있었습니다.
Hosch250

2
을 (를) 단축 d[j]if i<31 else d[(j+1)%12]할 수 있습니다 d[(j+(i>30))%12]. 일반적으로 두 대안의 구조가 비슷한 경우 부울에 따라 각각의 것과 동일한 간단한 표현을 만들 수 있습니다.
xnor

3

루비, 313 (338-15-10)

이 솔루션은 입력이 제공되지 않은 현재 시간을 변환하고 "y cuarto", "y media"및 "menos cuarto"라는 세 구를 추가합니다.

require'time'
t,x,s=Time,$*[0],%w[cero una dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce cuarto]
1.upto(9){|i|i>5?s[10+i]="dieci"+s[i]:0;s[20+i]="veinti"+s[i]}
s[20]="veinte"
s<<"media"
c=x ?t.parse(x):t.new
h,m=c.hour%12,c.min
m<31?(a=" y "):(h,m,a=h+1,60-m," menos ")
$><<(h<2?"Es la ":"Son las ")+s[h]+a+s[m]

작동합니까? iideone으로 시도, 입력 '01 : 01 ', 현재 시간 20:09, 출력 :Son las ocho y diecioch
edc65

모든 테스트 사례가 로컬로 전달되었습니다. 숫자를 복사하는 데 문제가있는 것을 보았습니다. 그래서 해결할 것입니다.
britishtea

1
"seite"는 "siete"여야하고 "neuve"는 "nueve"이어야합니다
jmm

2

배쉬 423

(433-10 = 423, 분음 부호와 cuarto를 제거하면 381로 내려갈 수 있습니다)

IFS=: read h m
s=y
m=${m#0}
[ $m -gt 30 ]&&h=$(($h+1))&&s=menos
[ -z ${m%0} ]&&s=en&&m=punto
n[0]=0
o[0]=0
S=" séis siete ocho nueve"
n=(punto una dos trés cuatro cinco $S diez {on,do,tre,cator,quin}ce ${S// / dieci} veinte)
n=($(eval echo "${n[@]}" veinti\$\{n[{1..9}]\}))
n[3]=tres;n[6]=seis
n=(${n[@]} media\  $(tac -s' '<<<${n[@]}))
o=("${n[@]/q*/cuarto}")
a=Son\ las
[ $h = 1 ]&&a=Es\ la
echo $a ${n[$h]/p*/cero} $s ${o[$m]/%a/o}

이미 'una'를 몇 시간 동안, 'uno'를 몇 분 동안 사용합니다. 더 신중하게 살펴보십시오 :)
Ángel

죄송합니다. 한 눈에 명확하지 않으며 bash는 Windows에서 테스트하기가 어렵습니다. 그때 +1.
edc65

@ edc66에서 서수는 femenine에 있고 $ {o [$ m] / % a / o}는 후행 a를 o로 대체합니다.
Ángel

2

펄-297-10 + 1 = 288 ( p플래그를 세어 )

편집 : @guifa 덕분에 이제 보너스를 요청할 수 있습니다 :)

#!/usr/bin/perl -p
sub n{($_=shift)%10?(once,doce,trece,catorce,cuarto)[$_>9?$_-11:5]||('',dieci,veinti)[$_/10].(0,un.pop,dos,tres,cuatro,cinco,seis,siete,ocho,nueve)[$_%10]:(cero,diez,veinte,media)[$_/10]}/:/;$a=$`%12;$b=$';$c=$b>30?(++$a,$b=60-$b,menos):'y';$_=($a-1?'Son las ':'Es la ').n($a,a)." $c ".n($b,o).'.'

가독성을 위해 여러 줄로 된 동일한 코드는 다음과 같습니다.

sub n {
        ($_ = shift) % 10
            ? (once, doce, trece, catorce, cuarto)[$_ > 9 ? $_ -11 : 5]
                || ('', dieci, veinti)[$_ / 10]
                . (0, un.pop, dos, tres, cuatro, cinco, seis, siete, ocho, nueve)[$_ % 10]
            : (cero, diez, veinte, media)[$_ / 10]
}
/:/;
$a = $` % 12;
$b = $';
$c = $b > 30 ? (++$a, $b = 60 - $b, menos) : 'y';
$_ = ($a - 1 ? 'Son las ' : 'Es la ') . n($a, a) . " $c " . n($b, o) . '.'

'una'를 몇 시간 동안, 'uno'를 몇 분 동안 사용해야합니다. 그래서 '01 : 01 '–Es la una y uno
edc65

"quince"를 "cuarto"로, "treinta"를 "media"로 변경하면 -10 보너스가 부과됩니다.
user0721090601 1

@ edc65 지금은 괜찮 으시길 바랍니다 ...
core1024

0

스칼라 652 바이트-25

import java.util.Scanner
object S extends App{val s=new Scanner(System.in).useDelimiter("[:\n]")
var h=s.nextInt
var m=s.nextInt
if(m>30)m-=60 else h-=1
val n=m.abs
h%=24
val p=h%12
val l=List("una","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","cuarto")
val k=List("úno","dós","trés",l(3),l(4),"séis",l(6),"ócho",l(8))
println(s"""${if(p==0)"Es la"else"Son las"} ${l(p)} ${if(m>0)"y "else if(m<0)"menos "}${if(n==1)"uno"else if(n==0)""else if(n<=15)l(n-1) else if(n==30)"media"else if(n<20)"dieci"+k(n-11)else if(n==20)"veinte"else"veinti"+k(n-21)} de la ${if(h<12)"mañana"else"tarde"}.""")}

0

Pyth : 277 묶음 더 234-10 (cuarto / media bonus) = 224 bytes

이제 원본에서 50 바이트 이상 줄었습니다!

=H" y "ANkmsdcz\:Kc"cero uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce cuarto veinte"dI>k30=k-60k=H" menos "=N?1qN12+N1)++?+"Son las "@KN>N1"Es la una"H??eKqk20?@Kk<k16+?"dieci"<k21+PeK\i@K%kT<k30"media"

Pyth는 그리 오래 걸리지 않았지만 원시 데이터가 있기 때문입니다. 아마도 더 골프를 칠 수 있습니다. 작업을 시간, y / menos, 수십 분 및 1 분으로 나누는 명백한 기술을 사용하고 변환 배열을 사용하여 숫자를 변환하고 3 진 단위를 사용하여 다른 모든 것을 변환합니다.

=H" y "                 Set H to " y "
A                       Double Assignment
 Nk                     The variables N and k (hours and mins)
 m  cz\:                Map input split by ":"
  sd                    Make both int
Kc"..."d                Set K to string split by spaces
I>k30                   If k>30
     =k-60k             Set k to 60-k
     =H" menos "        Set k to menos instead of y
     =N                 Set N
      ?   qN12          If N=12
       1                Go back to one
       +N1              Increment N
)                       Close entire if block 
+                       Concat of hours and minutes
 +                      Concat hours and y/menos
  ?           >N1       If hour greater than one
   +                    Concat of son las and hour
    "Son las "          "Son las "
    @KN                 Index translation array for hour
   "Es la una"          Else es la una
  H                     " y " or " menos "
 ?               <k30   If minutes less than 30
  ?  qk20               If minutes is 20
   ek                   Last element of array (veinte)
   ?   <k16             Else check if minutes<16
    @Kk                 Get minutes directly from array
    +                   Else tens and ones sum
     ?       <k21       If minutes<21
      "dieci"           "dieci"
      +PeK\i            Else get veinti from veinte
     @K%kT              Ones digit of minutes
  "media"               Else get "media"

골프 역사

  • 10 바이트-보너스, 모과 및 삼 홍색은 번역 배열에서 대체 할 수 있으므로 번역 에세이와 같은 크기를 제외하고는 변경할 필요가 없습니다.
  • 6 바이트-삼항 재구성-불행히도 이것은 4 개의 연속 삼항 연산자를 제거했습니다.
  • 6 바이트-기타 다양한 골프
  • 6 바이트-골프 초기 시간 / 분 할당
  • +3 바이트-고정 uno / una
  • 3 바이트-veinte에서 생성 된 veinti, 하드 코딩되지 않음
  • 18 바이트-십대에서 추출 된 dieci <16
  • 2 바이트-이유없이 공백을 제거했습니다.
  • 2 바이트-하나의 문자 스트링에 사용

1 문자와 같은 문자열의 경우 ":""i", 사용 \:하고 \i대신.
isaacg

@isaacg oh cool 나는 당신이 그것을 할 수 있다는 것을
몰랐다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.