Czas na hiszpański!

24

Mam proste zadanie, które powinno być stosunkowo łatwe do realizacji za pomocą kodu. Twoim celem jest napisanie programu, który wyświetli czas napisany w języku hiszpańskim, biorąc pod uwagę czas w formacie GG: MM. Wiele osób prawdopodobnie nie wie, jak to zrobić, więc rozwinę się.

Czas w języku hiszpańskim jest dość logiczny. Zwykle jest zgodny ze wzorem „Es la / Son las (godzina) y (minuty)”. Godziny są w formacie 12-godzinnym, a „Es la” jest używane tylko, jeśli godzina to 1 (tj. Godzina pierwsza). Protokoły to inna historia. Jeśli minuta jest mniejsza niż 30, jest ona reprezentowana jak pokazano powyżej. Jeśli minuta przekroczy 30, wówczas godzina jest zaokrąglana w górę, a minuta jest odejmowana. Na przykład 7:35 jest tłumaczone na „8 godzin minus 25 minut”. Więcej przykładów podano poniżej. Lista potrzebnych hiszpańskich numerów znajduje się tutaj . Na niektórych numerach są akcenty, ale nie są one konieczne.

Uwaga: źródło mówi „uno”, ale aby być poprawnym gramatycznie, powinno to być „una”. Jak dotąd nie powinno to wpłynąć na żadne odpowiedzi.

Uwaga 2: „Cero” nie jest konieczne. Jeśli twój program wypisuje „Es la una” lub „Son las tres”, nie mam nic przeciwko. Przepraszamy za te zmiany zasad.

Zasady

  • Dane wejściowe będą dostarczane przez STDIN lub równoważny w twoim języku.
  • Brak odczytu z bibliotek zewnętrznych.
  • Twój kod może zrobić wszystko z nieprawidłowymi danymi wejściowymi.

Bonusy

  • -10, jeśli twój kod dodaje te dodatkowe frazy - „y cuarto” dla: 15, „y media” dla: 30 i „menos cuarto” dla: 45 (w zaokrągleniu w górę).
  • -15, jeśli twój kod może obsługiwać AM i PM, odpowiadając odpowiednio „de la mañana” i „de la tarde”.
  • -15, jeśli Twój kod może przetłumaczyć aktualny czas, jeśli nie podano żadnych danych wejściowych.

Punktacja

  • Jest to wyzwanie polegające na grze w golfa i będzie oceniane według bajtów, a nie znaków.

Przykłady

Wejście: 8:10 Wyjście:Son las ocho y diez.

Wejście: 6:45 Wyjście:Son las siete menos quince (or cuarto).

Wejście: 1:29 Wyjście:Es la una y veintinueve.

Wejście: 12:55 Wyjście:Es la una menos cinco.

Daj mi znać, jeśli jest tu coś do określenia. To moje pierwsze pytanie, więc zdecydowanie nie jest idealne.

mdc32
źródło
Dla Twojej informacji możesz uzyskać informację zwrotną przed opublikowaniem w piaskownicy .
Stretch Maniac
1
@Sparr Wątpię w to. Prawdopodobnie jest wystarczająco dużo liczb, które muszą być zakodowane, aby tak się stało - co najmniej 45 znaków, nawet uwzględniając wzorce.
mdc32,
1
@Dennis Hmm ... Myślę, że jedno byłoby w porządku. Es la una y cerojest dość powtarzalny, więc rozumiem twój punkt widzenia. Nie sprecyzowałem tego, więc chyba jedno z nich będzie w porządku. Dzięki za opinie.
mdc32,
1
Powinieneś dodać 01:21jako przypadek testowy, ponieważ co najmniej jeden odpowiadający był zdezorientowany tym, co powiedziałeś o una vs. uno .
Peter Taylor,
3
Drugi bonus (prawie?) Nigdy nie jest tego wart, ponieważ same zwroty „de la”, „manana” i „tarde” liczą już do 16 bajtów.
britishtea

Odpowiedzi:

9

JavaScript (ES6) 308 316

Błąd edycji Edit2 Edytuj zapomniałem ubiegać się o bonus
Jako program z I / O poprzez wyskakujące okienko

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):''))

Jako funkcja do przetestowania

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):'')
)

Testuj w konsoli 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)))
}

Wydajność

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
edc65
źródło
8

Tak, powraca najmniej oczekiwany język na zawodach golfowych, kodowany przez najgorszego golfistę na świecie!

Java - 676 ​​bajtów (716-10-15-15)

Gra w golfa:

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);}}

Nie golfowany:

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);
    }
}

Zajmuje się quartoi media, z AM / PM i nie ma wkładu. Więc mogę ubiegać się o wszystkie bonusy, nawet jeśli gdybym nie wdrożył tych funkcji, miałbym jeszcze niższy wynik, lol. maseczki

Rodolfo Dias
źródło
6

Znaki Pythona 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]+".")

Otrzymuje to dziesięć punktów premii za użycie „cuarto” i „media”

Godziny i minuty czytamy jako ints. Jeśli minuty są powyżej 30, przechodzimy do następnej godziny, odmierzamy minuty od 60 i zmieniamy koniunkcję na „menos”.

Lista dzawiera przekłady hiszpańskich numerach do 15. Dokładamy d[0]być '', aby zapobiec takie rzeczy jak „diecicero”. Odbywa się to przez niezręczne wywoływanie split(' ')z początkową spacją; zwykły splitpo prostu zignoruje to. Sprawa zero minut jest obsługiwana później.

Aby uzyskać liczby powyżej 15, łączymy dziesięciocyfrowy ciąg z odpowiednim ciągiem jednocyfrowym. 15i 30są napisane jako „media” i „cuarto” bez żadnych kosztów.

Python 3 zapisuje jedną sieć znaków w Pythonie 2: -4 inputzamiast raw_input, +2 dla parens w druku, +1 dla //.

xnor
źródło
Z przykrością stwierdzam, że to bardziej skomplikowane. 01:21 powinno być la una y veintiuno, ponieważ godziny są żeńskie, a minuty męskie.
Peter Taylor,
@PeterTaylor Rozumiem. Czy dotyczy to tylko numeru uno / una?
xnor
Tak, chociaż gdyby liczba ta wzrosła do setek, byłyby inne.
Peter Taylor
@PeterTaylor Naprawiono, dla 5 znaków.
xnor
@ edc65 Ups, zapomniałem wkleić faktyczną zmianę unana uno, powinno działać teraz.
xnor
5

PHP, 351 349 360 - 15 = 345 bajtów

<?$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(~·Å–));

Ten program nie jest wierszem poleceń: pobiera dane przez $ _GET [0]. Może być konieczne wyłączenie powiadomień w pliku php.ini. Teraz jest wyposażony w automatyczny czas bez wprowadzania danych, dzięki Niet the Dark Absol.

Zastosowane sztuczki:

~(...) zapisuje jeden bajt poprzez bitowe odwracanie łańcucha, ponieważ nie potrzebujesz znaków cudzysłowu, ponieważ PHP zwykle zakłada, że ​​wszystkie ASCII od 0x80 do 0xFF jest łańcuchem.

<?=preg_filter(...,...): To <?=skrót do pisania <? echo. preg_filter()zwykle stosuje zamiany na łańcuchach za pomocą wyrażenia regularnego, ale możemy użyć amortyzacji / e modyfikator do oceny wynikowego łańcucha jako kodu PHP. Dlatego zamiast rozdzielać łańcuch wejściowy na dwie osobne zmienne, możemy użyć odwołań wstecznych (1 $ i 2 $) na dopasowanym łańcuchu wejściowym, oszczędzając duże ilości bajtów.

Tryth
źródło
2
Możesz ubiegać się o premię -15, jeśli $_GET[0]?:date(~·Å–)odejmiesz 3 od swojego wyniku.
Niet the Dark Absol
Dzięki. Dokonałem tego i jeszcze jednej drobnej poprawy.
Tryth,
5

C ++: 474 ... 422 411 bajtów

Ta wersja wykorzystuje bonus 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]);}

Moja pierwsza próba gry w golfa kodem! Spróbuję to poprawić w ten weekend.

Nie golfowany:

#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]);
}
BMac
źródło
1
Nie mogłeśm%=10
Timtech
Słuszna uwaga! Niestety w mojej nowej wersji muszę przypisać tę wartość do innej zmiennej, więc nie mogę.
BMac,
Ok, tylko się zastanawiam :)
Timtech
4

Lua, 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)
  • Usunięto 12 bajtów, przepisując generator na 21-29.
  • Wypada 1, zastępując H>=12w H<12iw¹czeniu ekspresji zależnego się.
  • Upuściłem jeszcze 4, zanieczyszczając globalną przestrzeń nazw od funkcji (zło, ale w interesie gry w golfa :).
  • Naprawiono regex, zapomniałem dwukropka. Nie zmienia jednak liczby bajtów.
  • Naprawiono przypadek zero minut, zamieniono table.concatna ciągi znaków i dodano sugestię @ edc65, ostatecznie dodając 22 bajty.
  • Wstyd mi Wyciągnięcie functionciała do głównej części zmniejszyło jego długość aż o 15 bajtów .
cryptych stoi z Moniką
źródło
Powinien używać „una” na godziny, „uno” na minuty. Więc „01: 01” powinien daćEs la una y uno
edc65
3

D - 484 bajty

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]);}
Hackerpilot
źródło
Powinien używać „una” na godziny, „uno” na minuty. Więc „01: 01” powinien daćEs la una y uno
edc65
3

Python 3, 409 bajtów

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)])
Hosch250
źródło
Długą listę ciągów znaków można skrócić, np.'string1 string2 string3'.split()
xnor
@xnor W porządku, dzięki!
Hosch250,
@ hosch250 Upewnij się także, że ponownie śledzisz komentarze w oryginalnym poście. Prawdopodobnie wprowadzę wiele drobnych zmian zasad, które prawdopodobnie pomogą ci w grze w golfa.
mdc32,
@ mdc32 Dostosowywanie teraz. I tak miałem błędy.
Hosch250,
2
Możesz skrócić d[j]if i<31 else d[(j+1)%12]do d[(j+(i>30))%12]. Ogólnie rzecz biorąc, jeśli dwie alternatywy mają podobną strukturę, często można wykonać proste wyrażenie, które równa się każdemu z nich w zależności od wartości logicznej.
xnor
3

Rubin, 313 (338–15–10)

To rozwiązanie tłumaczy aktualny czas, w którym nie podano danych wejściowych, i dodaje trzy frazy „y cuarto”, „y media” i „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]
Britishtea
źródło
Czy to działa? Próbowałem w ideone, wejście '01: 01 ', aktualny czas 20:09, wyjście:Son las ocho y diecioch
edc65
Wszystkie przypadki testowe zostały przekazane mi lokalnie. Widzę, że coś poszło nie tak podczas kopiowania liczb, więc naprawię to.
britishtea
1
„seite” powinno być „siete”, a „neuve” powinno być „nueve”
jmm
2

Bash 423

(433 - 10 = 423, usuwając znaki diakrytyczne i cuarto, możemy obniżyć do 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}
Anioł
źródło
Używa już „una” od godzin, a „uno” od minut. Spójrz uważniej :)
Ángel
Niestety, na pierwszy rzut oka nie jest to jasne, a bash jest trudny do przetestowania w systemie Windows. +1 wtedy.
edc65
@ edc66, porządki są żeńskie, a następnie $ {o [$ m] /% a / o} zastępuje końcowe a przez o przez minuty.
Ángel
2

Perl - 297 - 10 + 1 = 288 (liczenie pflagi)

Edycja: dzięki @guifa mogę teraz odebrać bonus :)

#!/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).'.'

Oto ten sam kod w wielu wierszach dla czytelności:

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) . '.'
rdzeń 1024
źródło
Powinien używać „una” na godziny, „uno” na minuty. Więc „01: 01” - powinno daćEs la una y uno
edc65
Jeśli zmienisz po prostu „pigwa” na „cuarto” i „treinta” na „media”, zyskasz premię -10.
user0721090601,
@ edc65 Mam nadzieję, że teraz jest OK ...
core1024
0

Scala 652 bajtów - 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"}.""")}
bb94
źródło
0

Pyth : 277 kilka więcej 234 - 10 (cuarto / bonus za media) = 224 bajty

Teraz zmniejszono ponad 50 bajtów z oryginału!

=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"

Szaleńczo tęskni za Pyth, ale to dlatego, że są pewne surowe dane. Prawdopodobnie można grać w golfa jeszcze dalej. Używa oczywistej techniki dzielenia zadania na godziny, y / menos, dziesiątkę cyfry minut i jedną cyfrę minut, a następnie tłumaczy liczby za pomocą tablicy translacji i wszystkiego innego za pomocą bzdurnych trójek.

=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"

Historia golfa

  • 10 bajtów - bonus, pigwa i trienta można po prostu zastąpić w tablicy tłumaczeń, więc nie są wymagane żadne zmiany, z wyjątkiem eseju tłumaczeniowego i tego samego rozmiaru.
  • 6 bajtów - zreorganizowane trójskładniki - niestety usunęło to 4 kolejnych operatorów trójskładnikowych :(
  • 6 bajtów - inne różne gry w golfa
  • 6 bajtów - początkowa godzina gry w golfa / min
  • +3 bajty - naprawiono uno / una
  • 3 bajty - zbudowany veinti z veinte, nie zakodowany na stałe
  • 18 bajtów - wyodrębniono dieci od nastolatków <16
  • 2 bajty - usunęliśmy niektóre spacje bez żadnego powodu
  • 2 bajty - używane \ dla jednego łańcucha znaków
Maltysen
źródło
Dla 1 ciągów znaków, takich jak ":"i "i", użyj \:i \izamiast.
isaacg
@isaacg oh cool Nie wiedziałem, że możesz to zrobić, aktualizacja
Maltysen