İspanyol Zamanı!


24

Kod aracılığıyla gerçekleştirmesi nispeten kolay olan basit bir görevim var. Amacınız , HH: MM formatında verilen zamana göre İspanyolca yazılmış zamanı gösteren bir program yazmaktır. Pek çok insan muhtemelen bunun nasıl yapıldığını bilmiyor , bu yüzden ayrıntılı olarak çalışacağım.

İspanyolcada zaman oldukça mantıklı. Genellikle "Es la / Son las (saat) y (dakika)" şeklini izler. Saatler 12 saat biçimindedir ve "Es la" sadece saat 1 ise (saat 1) kullanılıyorsa kullanılır . Dakikalar farklı bir hikaye. Dakika 30'dan azsa, yukarıda gösterildiği gibi gösterilir. Ancak dakika 30'un üzerindeyse, saat yukarı yuvarlanır ve dakika çıkarılır. Örneğin, 7:35 "8 saat eksi 25 dakika" değerine eşdeğerdir. Aşağıda bazı örnekler verilecektir. Gerekli olan İspanyol numaralarının listesini burada bulabilirsiniz . Bazı numaralarda aksanlar var, ancak bunlar gerekli değil.

Not: Kaynak "uno" diyor ancak gramersel olarak doğru olmak için "una" olmalı. Bu, şu ana kadarki cevapları etkilememelidir.

Not 2: Ayrıca, "cero" gerekli değildir. Programınız "Es la una" veya "Son las tres" çıktılarsa, bu benim için sorun değil. Bu kural değişiklikleri için özür dilerim.

kurallar

  • Giriş, STDIN veya kendi dilinizdeki eşdeğeri aracılığıyla sağlanacaktır.
  • Dış kütüphanelerden okuma yok.
  • Kodunuz geçersiz girişli her şeyi yapabilir.

Bonuslar

  • -10 Kodunuzda bu ilave ifadeleri eklerseniz - için "y cuarto": 15, "y media" için: 30 ve "menos cuarto" için: 45 (tamamlanmış).
  • -15 Eğer kodunuz AM ve PM ile başa çıkabiliyorsa, "de la mañana" ve "de la tarde" ile cevap verin.
  • -15 eğer giriş yapılmazsa kodunuz geçerli saati çevirebilirse.

puanlama

  • Bu bir kod golf mücadelesi ve karakter tarafından değil byte ile puanlanacak.

Örnekler

Giriş: 8:10 Çıkış:Son las ocho y diez.

Giriş: 6:45 Çıkış:Son las siete menos quince (or cuarto).

Giriş: 1:29 Çıkış:Es la una y veintinueve.

Giriş: 12:55 Çıkış:Es la una menos cinco.

Burada belirtilecek herhangi bir şey varsa bana bildirin. Bu benim ilk sorum, bu yüzden kesinlikle mükemmel değil.


Bilginize, sanal alana göndermeden önce geri bildirim alabilirsiniz .
Streç Maniac,

1
@Sparr Bundan şüpheliyim. Bunun gerçekleşmesi için kodlanması gereken muhtemelen yeterli sayıda vardır - en az 45 karakter, hatta kalıpları hesaba katar.
mdc32

1
@Dennis Hmm ... Sanırım ya iyi olurdu. Es la una y cerooldukça tekrarlayıcı, bu yüzden amacını anlıyorum. Bunu belirtmedim, o yüzden ikisinin de iyi olacağını düşünüyorum. Geri dönüşünüz için teşekkür ederiz.
mdc32

1
01:21Bir test örneği olarak eklemelisiniz , çünkü en az bir cevaplayıcı una vs uno hakkında söylediklerinizle karıştırıldı .
Peter Taylor

3
İkinci bonus (neredeyse?) Asla buna değmez çünkü "de la", "manana" ve "tarde" cümleleri zaten 16 bayta kadar saymaktadır.
britishtea

Yanıtlar:


9

JavaScript (ES6) 308 316

Edit2 hata düzeltme Düzenle Bonus talep etmeyi unuttum
Açılır pencereli I / O programlı olarak

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

Test edilebilir bir fonksiyon olarak

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 konsolunda test edin

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

Çıktı

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

Evet, dünyanın en kötü golf oyuncusu tarafından kodlanan bir golf yarışmasında görünmesi beklenen en az dil geri döndü!

Java - 676 ​​bayt (716-10-15-15)

golfed:

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

Ungolfed:

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

İle Fırsatlar quartove mediaAM / PM ile ve hiçbir girişine sahiptir. Bu yüzden, bütün bonusları talep edebilirim, yine de, bu özellikleri uygulamazsam daha da düşük bir puan alacağım, lol. facepalms


6

Python 3: 294 karakter - 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]+".")

Bu "cuarto" ve "media" kullandığınız için on puanlık bonus alır.

Saat ve dakikayı ints olarak okuruz . Dakikalar 30'un üzerindeyse, bir sonraki saate taşınır, dakikaları 60'dan uzakta ölçer ve bağlantıyı "menos" olarak değiştiririz.

Liste dBiz yapmak 15'e kadar İspanyol sayıların çevirisi var d[0]olmak ''"diecicero" gibi şeyler engellemek için. Bu, beceriksizce split(' ')bir ilk boşlukla çağırarak yapılır ; Düzenli splitbunu görmezden gelirdi. Sıfır dakikalık durum daha sonra ele alınır.

15'in üzerindeki sayıları almak için onlarca basamaklı dizeyi uygun tek basamaklı dizeyle birleştiririz. 15ve 30hiçbir ücret ödemeden "medya" ve "cuarto" olarak yazılır.

Python 3, bir karakter netini Python 2: -4 inputyerine, raw_inputyazdırılan parenler için +2, için +1 için kaydeder //.


Bundan daha karmaşık olduğunu söylediğim için üzgünüm. 01:21 la una un y veintiuno olmalı, çünkü saatler kadınsıdır ancak dakikalar erildir.
Peter Taylor

@ PeterTaylor görüyorum. Etkilenen tek sayı uno / una mı?
xnor

Evet, her ne kadar yüzlerce rakam çıksa başkaları da olabilirdi.
Peter Taylor

@PeterTaylor 5 karakter için düzeltildi.
xnor

@ edc65 Whoops, fiili değişim yapıştırmak için unuttum unaiçin uno, şimdi çalışmalıdır.
Xnor

5

PHP, 351 349 360 - 15 = 345 Bayt

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

Bu program komut satırı değil: $ _GET [0] ile girdi alıyor. Php.ini'nizdeki bildirimleri devre dışı bırakmanız gerekebilir. Şimdi, girişin olmadığı otomatik zamanla geliyor, Dark Absol Niet sayesinde.

Kullanılan püf noktaları:

~(...) PHP bir PHP ile tüm ASCII değerlerinin 0x80'den 0xFF'ye düştüğünü varsaydığından alıntı işaretlerine ihtiyacınız olmadığından, bir dizgiyi bitsel ters çevirerek bir bayt kazandırır.

<?=preg_filter(...,...): <?=Yazma kısayolu <? echo. preg_filter()genellikle bir regex kullanarak bir dize yerine uygulanır, ancak sonuçta elde edilen dizeyi PHP kodu olarak değerlendirmek için amortismanlı / e değiştiricisini kullanabiliriz. Bu nedenle, giriş dizesini iki ayrı değişkene bölmek yerine, eşleşen giriş dizesinde geri referansları ($ 1 ve $ 2) kullanabiliriz, böylece büyük miktarda bayt tasarrufu yapabiliriz.


2
$_GET[0]?:date(~·Å–)Puanınızı 3 çıkarmak için kullanırsanız -15 bonus talep edebilirsiniz.
Karanlık Mutlak Niet,

Teşekkürler. Bunu ve bir başka küçük iyileştirme yaptım.
1’de Tryth

5

C ++: 474 ... 422 411 bayt

Bu sürüm cuarto / media bonusunu kullanıyor (-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]);}

İlk golf kod girişimi! Bu haftasonu geliştirmeye çalışacağım.

Ungolfed:

#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
Sen olamaz mısınm%=10
Timtech

İyi bir nokta! Maalesef yeni revizyonumda bu değeri farklı bir değişkene atamam gerekiyor, bu yüzden yapamam.
BMac

Tamam, sadece merak ediyorum :)
Timtech

4

Lua, 450 - 10 (cuarto / ortam) - 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)
  • Jeneratörü 21-29 için yeniden yazarak 12 bayt düştü.
  • Etrafındaki bağımlı ifadeyi değiştirip değiştirerek H>=12, 1 tane daha düştü H<12.
  • Küresel isim alanını bir işlevden (kötülükten, ancak golf oynamak için :) kirleterek 4 kişi daha düştü.
  • Regex düzeltildi, kolonu unuttum. Ancak, bayt sayısını değiştirmez.
  • Sıfır dakika davası düzeltildi, takas edildi table.concat karakter dizileri için ve sonuç olarak 22 bayt ekleyerek @ edc65'in önerisini ekledi.
  • Utandım. Çekme functionana yığın içine gövdeyi bir kuyruklu tarafından uzunluğu azaltılmış 15 bayt .

Saatlerce 'una', dakikalarca 'uno' kullanmalısınız. Öyleyse '01: 01 'vermeliEs la una y uno
edc65

3

D - 484 bayt

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

Saatlerce 'una', dakikalarca 'uno' kullanmalısınız. Öyleyse '01: 01 'vermeliEs la una y uno
edc65

3

Python 3, 409 bayt

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)])

Uzun bir dizge listesi gibi kısaltılabilir'string1 string2 string3'.split()
xnor

@ xnor Tamam, teşekkürler!
Hosch250

@ hosch250 Ayrıca, orijinal gönderideki yorumları tekrar izlediğinizden emin olun. Muhtemelen birçok küçük kural değişikliği yapacağım ve bunlar muhtemelen golf oynamanıza yardımcı olacak.
mdc32

@ mdc32 Şu an ayarlanıyor. Zaten bazı hatalar yaptım.
Hosch250

2
Sen kısaltabilir d[j]if i<31 else d[(j+1)%12]için d[(j+(i>30))%12]. Genel olarak, eğer iki alternatifiniz de benzer bir yapıya sahipse, genellikle Boole bağlı olarak her birine tekabül eden basit bir ifade yapabilirsiniz.
xnor

3

Ruby, 313 (338 - 15 - 10)

Bu çözüm, giriş yapılmadan önceki zamanı çevirir ve "y cuarto", "y media" ve "menos cuarto" olmak üzere üç kelime öbeği ekler.

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]

Çalışıyor mu? İdeone denendi, giriş '01: 01 ', şimdiki saat 20:09, çıkış:Son las ocho y diecioch
edc65

Tüm test vakaları yerel olarak benim için geçti. Numaraları kopyalamakta bir sorun oluştu, bu yüzden bunu düzelteceğim.
britishtea

1
"seite" "siete" olmalı ve "neuve" "nueve" olmalı
jmm

2

Bash 423

(433 - 10 = 423, aksan ve cuartoları kaldırarak 381'e indirebiliriz)

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}

Zaten saatlerce 'una' ve dakikalarca 'uno' kullanıyor. Daha dikkatli görün :)
Ángel

Üzgünüz, bir bakışta net değil ve bash pencerelerinde test etmek zordur. +1 sonra.
edc65

@ edc66, sıradakiler femeninedir, ardından $ {o [$ m] /% a / o} izini dakikalar boyunca a ile o ile değiştirir.
Ángel

2

Perl - 297 - 10 + 1 = 288 ( pbayrağın sayılması )

Düzenleme: @guifa sayesinde, şimdi bir bonus talep edebilir :)

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

İşte okunabilirlik için birden fazla satırda aynı kod:

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

Saatlerce 'una', dakikalarca 'uno' kullanmalısınız. Öyleyse '01: 01 '- vermeliEs la una y uno
edc65

Eğer sadece "ayva" yı "cuarto" olarak ve "treinta" yı "medya" olarak değiştirirseniz, bir -10 bonus kazanırsınız.
user0721090601

@ edc65 Umarım şimdi
tamamdır

0

Scala 652 bayt - 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 demet daha 234 - 10 (cuarto / media bonusu) = 224 bayt

Şimdi orijinalden 50 bayttan daha az!

=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 için delicesine uzun ama bunun nedeni ham verilerin olması. Muhtemelen daha da golf oynayabilir. Görevi saatlere, y / menülere, onlarca dakika hanesine, dakikalara rakamlara bölüp açık bir teknik kullanır ve ardından çeviri dizisini ve sayıları bir ton ton terneri kullanarak sayıları çevirir.

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

Golf Tarihi

  • 10 bayt - bonus, ayva ve trienta sadece çeviri dizisinde değiştirilebilir, böylece çeviri denemesi ve aynı ebat dışında hiçbir değişiklik gerekmez.
  • 6 bayt - yeniden yapılandırılmış üçlüler - ne yazık ki bu 4 ardışık üçlü işleçleri kaldırdı :(
  • 6 bayt - diğer çeşitli golf
  • 6 bayt - golflü ilk saat / dakika ödevi
  • +3 bayt - sabit uno / una
  • 3 bayt - veinte kaynaklı damarlar, kodlanmış değil
  • 18 bayt - gençlerden çıkarılan dieci <16
  • 2 bayt - sebepsiz yere orada bazı boşluklar kaldırıldı
  • 2 bayt - bir karakter dizgisi için kullanılır \

1 karakter gibi dizeleri için ":"ve "i"kullanım \:ve \iyerine.
isaacg,

@isaacg oh cool Bunu yapabileceğini bilmiyordum, güncelleme
Maltysen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.