Jam ASCII dengan penanda titik & koma


39

pengantar

penjelasan kode golf

Bayangkan bahwa barisan karakter sebenarnya adalah dua baris. Baris atas - titik - mewakili jam (sistem 24 jam), sedangkan koma rendah - mewakili menit . Satu karakter dapat mewakili jam, menit, atau keduanya - kapan pun memungkinkan.

Pada awalnya mungkin Anda harus mengonversi menit sejak tengah malam menjadi jam dan menit .

Hasilnya adalah string yang menunjukkan waktu saat ini dalam "format dot". Hitungan titik ( apostrof dihitung di sini sebagai titik dan akan dinamakan demikian! ) Adalah hitungan jam sejak tengah malam dan hitungan koma adalah hitungan menit. Saya akan menunjukkan beberapa contoh untuk membuatnya jelas.

  • (Keterangan) jj: mm - result
  • (Hanya jam) 05:00 - '''''
  • (Hanya beberapa menit) 00:08 - ,,,,,,,,
  • (jam <menit) 03:07 - ;;;,,,,
  • (jam> menit) 08:02 - ;;''''''
  • (jam = menit) 07:07 - ;;;;;;;
  • (awal hari) 00:00 - ( hasil kosong )

Perhatikan bahwa karakter "keduanya" dapat digunakan maks 23 kali - untuk 23: xx, di mana xx adalah 23 atau lebih.

Simbol

Jika karakter harus (lihat aturan 5.) lolos dalam bahasa Anda, Anda dapat mengubahnya menjadi salah satu alternatif. Jika kata alternatif tidak cukup, Anda dapat menggunakan simbol lain - tetapi tetap masuk akal. Aku hanya tidak ingin melarikan diri menjadi penghalang.

  • ;(titik koma) - penanda untuk kedua jam dan menit (alt: :)
  • '(apostrof) - penanda untuk jam (alt: '``°)
  • ,(koma) - penanda untuk menit (alt: .)

Aturan tambahan

  1. Kode dengan jumlah byte terkecil menang!
  2. Anda harus menggunakan kedua simbol kapan pun memungkinkan. Untuk 02:04 hasilnya tidak bisa '',,,,, juga ;',,,. Itu harus;;,,
  3. Input - dapat berupa parameter skrip / aplikasi, input pengguna (seperti readline) atau variabel di dalam kode
    3.1. Jika variabel di dalam kode digunakan, maka panjangnya harus paling lama mungkin. Ini 1439(23:59), jadi akan terlihat sepertit=1439
  4. Bagian umum yang dilambangkan dengan karakter "keduanya" (12 dalam 12:05, 3 dalam 03:10) harus diletakkan di awal string
  5. Simbol dapat diganti menjadi alternatif hanya jika mereka harus lolos dalam kode Anda.
  6. Masukan diberikan dalam hitungan menit setelah pukul 00:00 . Anda dapat mengasumsikan bahwa ini adalah bilangan bulat non-negatif.

Uji kasus

Input: 300
Output: '''''

Input: 8
Output: ,,,,,,,,

Input: 187
Output: ;;;,,,,

Input: 482
Output: ;;''''''

Input: 427
Output: ;;;;;;;

Input: 0
Output:  (empty)

Terima kasih, Adnan telah mengedit posting saya! Dengan cara ini saya akan belajar dengan perbandingan golf pemula saya dengan milik Anda :)
Krzysiu

3
Tidak masalah! Ini adalah posting pertama yang sangat bagus dan tantangan yang bagus :)
Adnan

1
ini terlihat sangat bagus hanya dengan titik koma dan koma, tetapi apostrof mengacaukan semuanya :(
Sparr

Sebenarnya 1439ini 23:59dan tidak 1339. (23 x 60 + 59).
insertusernamehere

Terima kasih semuanya atas kata-kata yang baik! :) @Sparr, yeah, itu poin buruknya :( Sudahkah Anda tahu bagaimana ini bisa diganti? Masukkanusername di sini, tentu saja itu benar! Tetap :)
Krzysiu

Jawaban:


10

Pyth, 19 byte

:.iF*V.DQ60J"',"J\;

Suite uji

:.iF*V.DQ60J"',"J\;
      .DQ60            Divmod the input by 60, giving [hours, minutes].
           J"',"       Set J equal to the string "',".
    *V                 Perform vectorized multiplication, giving H "'" and M ','.
 .iF                   Interleave the two lists into a single string.
:               J\;    Perform a substitution, replacing J with ';'.

8

CJam, 22 20 19 byte

Mengambil input dari STDIN:

ri60md]',`.*:.{;K+}

Uji di sini.

Penjelasan

ri     e# Read input and convert to integer.
60md   e# Divmod 60, pushes hours H and minutes M on the stack.
]      e# Wrap in an array.
',`    e# Push the string representation of the comma character which is "',".
.*     e# Repeat apostrophe H times and comma M times.
:.{    e# Apply this block between every pair of characters. This will only applied to
       e# first N characters where N = min(hours,minutes). The others will remain
       e# untouched. So we want the block to turn that pair into a semicolon...
  ;    e#   Discard the comma.
  K+   e#   Add 20 to the apostrophe to turn it into a semicolon.
}

Sungguh beruntung betapa baiknya hal-hal bekerja bersama di sini, khususnya penugasan jam ke 'dan menit ,sedemikian rupa sehingga urutan jam dan menit pada tumpukan cocok dengan representasi string karakter.

Ini adalah satu-satunya blok 3-byte yang saya temukan sejauh ini. Ada banyak solusi 4 karakter:

{;;';}
{';\?}
{^'0+}
{^'F-}
{-'@+}
{-'6-}
...

6

GNU Sed, 37

Skor termasuk +1 untuk -Eopsi sed.

Saya tidak terlalu terkesan dengan golfiness jawaban bash saya , jadi saya pikir saya akan mencoba sed untuk bersenang-senang.

Input tidak digunakan, sesuai meta-answer ini .

y/1/,/          # Convert unary 1's to commas (minutes)
s/,{60}/'/g     # divmod by 60.  "'" are hours
:               # unnamed label
s/(.*)',/;\1/   # replace an apostrophe and comma with a semicolon
t               # jump back to unnamed label until no more replacements

Cobalah online


label tanpa nama ??
mikeserv


@manatwork - saya pikir itu pasti bug GNU.
mikeserv

@ mikeserv - tetapi menggunakan bug juga tidak apa-apa, kan? Saya tidak meminta untuk mengejek Anda, saya hanya tidak tahu :)
Krzysiu

@ Krzysiu - ok? hmm di situs ini saya pikir itu akan menjadi tanda keunggulan. kalau tidak, hampir pasti tidak. ketika programmer menyimpang dari API dan menggunakan detail implementasi program menjadi tergantung versi / implementasi - yang merupakan hal yang buruk.
mikeserv

6

Python 2, 56 byte

def g(t):d=t%60-t/60;print(t/60*";")[:t%60]+","*d+"'"*-d

Fungsi yang mencetak (satu karakter lebih pendek dari t=input();).

Metode ini mirip dengan Loovjo . Jumlahnya ,berbeda antara menit dan jam, dengan minimalim implisit 0. Untuk ', itu negasi. Sebab ;, menghitung minsecara implisit dengan mengambil sebanyak ;jam, lalu memotong ke jumlah menit.

Menghemat karakter untuk menghemat d, tetapi bukan jumlah jam dan menit di sini. Analog dengan lambda adalah dua karakter lebih panjang (58), sehingga tugas variabel sepadan.

lambda t:(t%60*";")[:t/60]+","*(t%60-t/60)+"'"*(t/60-t%60)

Memproses input secara langsung juga tidak menyimpan karakter (58):

h,m=divmod(input(),60);d=m-h;print(";"*m)[:h]+","*d+"'"*-d

Strategi lain dengan mengiris, lebih lama (64):

def g(t):m=t%60;h=t/60;return(";"*m)[:h]+(","*m)[h:]+("'"*h)[m:]


3

Bash Murni (tanpa utilitas eksternal), 103

p()(printf -vt %$2s;printf "${t// /$1}")
p \; $[h=$1/60,m=$1%60,m>h?c=m-h,h:m]
p , $c
p \' $[m<h?h-m:0]

Terima kasih kepada @ F. Hauri untuk menghemat 2 byte.


Bagus! Tetapi Anda dapat menyimpan 2 karakter dengan menukar $1dan $2masuk p()dan menulis p , $cdi baris 3.
F. Hauri

Ya, tetapi karena ini hanya digunakan dalam printf "%s", memiliki ckosong akan berfungsi dengan baik (meskipun tidak digunakan kembali)
F. Hauri

@ F. Hauri Sekarang saya mengerti - terima kasih!
Digital Trauma

3

C, 119 byte

#define p(a,b) while(a--)putchar(b);
main(h,m,n){scanf("%d",&m);h=m/60;m%=60;n=h<m?h:m;h-=n;m-=n;p(n,59)p(h,39)p(m,44)}

Terperinci

// macro: print b, a times
#define p(a,b) while(a--)putchar(b)

int main(void)
{
    int h,m,n;
    scanf("%d",&m);  // read input

    h=m/60;m%=60;    // get hours:minutes
    n=h<m?h:m;       // get common count
    h-=n;m-=n;       // get remaining hours:minutes

    p(n,59);        // print common
    p(h,39);        // print remaining hours
    p(m,44);        // print remaining minutes

    return 0;
}

1
Menggunakan putchar& integer literals sebagai karakter menghemat satu byte, menarik titik koma di dalam makro menyimpan dua lagi :)
Quentin

@Quentin note diambil, disimpan 5 byte
Khaled.K

Anda dapat kehilangan ruang sebelum whiledi #define macro Anda. -1 byte
Albert Renshaw

1
Anda juga dapat menyimpan lebih banyak byte hanya dengan membuat p (a, b) fungsi alih-alih makro. (Dan menaburkan beberapa semi-titik dua ke fungsi utama Anda)
Albert Renshaw

3

Haskell, 68 66 Bytes

g(h,m)=id=<<zipWith replicate[min h m,h-m,m-h]";',"
g.(`divMod`60)

Contoh penggunaan:

(g.(`divMod`60)) 482

Bit pintar di sini adalah yang replicateakan mengembalikan string kosong jika panjang yang diberikan negatif atau nol sehingga saya bisa menerapkannya pada kedua perbedaan dan hanya yang positif yang akan muncul. Bagian pertama mudah, karena jumlah titik koma adalah minimum dari keduanya. KemudianzipWith menerapkan fungsi ke item yang sesuai.

EDIT: Menyadari saya menggunakan arang yang salah selama beberapa menit

EDIT 2: Disimpan 2 byte berkat @Laikoni


Anda dapat menyimpan dua byte dengan menggantinya concat$dengan id=<<.
Laikoni

2

JavaScript (ES6) 69

m=>";".repeat((h=m/60|0)>(m%=60)?m:h)+",'"[h>m|0].repeat(h>m?h-m:m-h)

2

Powershell, 99 85 byte

param($n)";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+"'"*(($h-$m)*!$b)+","*(($m-$h)*$b)

Menggunakan metode Loovjo , ini adalah implementasi PowerShell saya.

ungolfed

param($n) 
# set the number of minutes and hours, and a boolean which one is bigger
# and also output the correct number of ;s
";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+ 
# add the difference between h and m as 's but only if h > m
"'"*(($h-$m)*!$b)+
# add the difference between m and h as ,s but only if m > h
","*(($m-$h)*$b)

Disimpan 14 byte berkat AdmBorkBork


Anda dapat menyimpan dengan menggunakan pseudo-ternary untuk yang pertama, memindahkan $mdan $hmendeklarasikannya, lalu menggunakan perkalian Boolean. Seperti begitu -param($n)';'*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+'°'*(($h-$m)*!$b)+','*(($m-$h)*$b)
AdmBorkBork

1

Python 3, 98 byte

d=int(input());m=d%60;h=int((d-m)/60)
if m>=h:print(";"*h+","*(m-h))
else:print(";"*(m)+"'"*(h-m))

Mungkin bukan jawaban terbaik, tapi itu sangat menyenangkan!


1

Python 2, 61 byte

t=input();m,h=t%60,t/60
print";"*min(h,m)+","*(m-h)+"'"*(h-m)

Penjelasan:

t=input();              # Read input
          m,  t%60,     # Do a divmod, h = div, m = mod
            h=     t/60

print";"*min(h,m)+                    # Print the minimum of the h and m, but in ";"s
                  ","*(m-h)+          # Print (m-h) ","s (if m-h is negative, print nothing)
                            "'"*(h-m) # Print (h-m) "'"s (if h-m is negative, print nothing)

1

PHP, 81 byte

Saya mencari input variabel karena lebih pendek daripada membaca dari STDINatau mengambil argumen baris perintah.

for($_=1439;$i<max($h=0|$_/60,$m=$_%60);++$i)echo$i<$h?$i<min($h,$m)?';':"'":",";

Saya pikir saya mengenal PHP dengan cukup baik, tetapi saya melihat | untuk pertama kalinya. Saya pikir saya akan menggunakannya untuk berolahraga sedikit - saya akan menganalisisnya :)
Krzysiu

Gagal untuk 240. Coba $i>=min($h,$m)?$h<$m?",":"'":";"(+1 byte). Atau gunakan for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76 byte). Btw: kutipan tunggal membuat -rtidak mungkin; jadi Anda harus menggunakan backtick selama berjam-jam jika dalam string atau °mandiri (tidak perlu tanda kutip -> -1 byte).
Titus

1

JavaScript (ES6), 77 71 byte

x=>';'[r='repeat'](y=Math.min(h=x/60|0,m=x%60))+"'"[r](h-y)+','[r](m-y)

Penggunaan tugas dalam argumen akses / fungsi atribut. +1
Cyoce

1

Perl 6, 103 101 98 97 69 byte

$_=get;say ";"x min($!=($_-$_%60)/60,$_=$_%60)~"'"x $!-$_~","x $_-$!;

Output beberapa array, tapi persetan, selamat menikmati. Seperti biasa, setiap peluang bermain golf diaplikasikan.

Sunting: -2 byte: berani dan menghapus beberapa gips.

Sunting2: -3 byte dengan menghapus array.

Sunting3: -1 byte untuk mencetak dalam format yang benar, menggunakan "lambdas" dan menghapus paranthes.

Sunting4: (maaf guys) menyalahgunakan jam - menit harus mengembalikan 0 dan sebaliknya. Pernyataan if dihapus. Kemudian melepas tanda kurung, kemudian menyadari bahwa saya tidak membutuhkan lambda sama sekali. -28 byte :)

Woah aku semakin baik dalam hal ini.


0

C, 141 byte

main(h,m){scanf("%d",&m);h=(m/60)%24;m%=60;while(h||m){if(h&&m){printf(";");h--;m--;}else if(h&&!m){printf("'");h--;}else{printf(",");m--;}}}

Saya pikir Anda bisa menghemat beberapa byte dengan menggunakan h>0||m>0. Maka Anda h--;m--;hanya perlu sekali dalam setiap iterasi dan {}untuk itu if/elseakan menjadi usang.
insertusernamehere

Anda juga dapat menyimpan beberapa byte pada kondisi kedua: alih-alih else if(h&&!m)hanyaelse if(h)
Hellion

Dan akhirnya mencoba menggunakan operator ternary, itu akan menyelamatkan Anda dari menggunakan kata "panjang" seperti ifdan else.
insertusernamehere

Pertimbangkan refactoring sebagai fungsi yang mengambil input sebagai parameter int - yang setidaknya harus menyelamatkan Anda scanf().
Trauma Digital

Saya tidak berpikir %24itu perlu - input maks adalah 23:59.
Trauma Digital

0

Gema, 119 karakter

<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};'}@repeat{@sub{$m;$h};,}

Contoh dijalankan:

bash-4.3$ gema '<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};`}@repeat{@sub{$m;$h};,}' <<< '252'
;;;;,,,,,,,,

0

Matlab: 89 byte

i=input('');m=mod(i,60);h=(i-m)/60;[repmat(';',1,min(h,m)),repmat(39+5*(m>h),1,abs(h-m))]

Uji:

310
ans =
;;;;;,,,,,

0

SmileBASIC, 59 byte

INPUT M
H%=M/60M=M-H%*60?";"*MIN(H%,M);",'"[M<H%]*ABS(H%-M)

Dijelaskan:

INPUT MINUTES 'input
HOURS=MINUTES DIV 60 'separate the hours and minutes
MINUTES=MINUTES MOD 60
PRINT ";"*MIN(HOURS,MINUTES); 'print ;s for all positions with both
PRINT ",'"[MINUTES<HOURS]*ABS(HOURS-MINUTES) 'print extra ' or ,

Hal ini terlihat cukup mengerikan, karena bagian bawah ;bahkan tidak sama dengan ,di huruf SmileBASIC ini


0

PHP, 81 byte

beberapa solusi lagi:

echo($r=str_repeat)(";",min($h=$argn/60,$m=$argn%60)),$r(",`"[$h>$m],abs($h-$m));
// or
echo($p=str_pad)($p("",min($h=$argn/60,$m=$argn%60),";"),max($h,$m),",`"[$h>$m]);

Jalankan dengan echo <time> | php -R '<code>'.

<?=($r=str_repeat)(";",min($h=($_=1439)/60,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=($r=str_repeat)(";",min($h=.1/6*$_=1439,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=str_pad(str_pad("",min($h=($_=1439)/60,$m=$_%60),";"),max($h,$m),",`"[$h>$m]);

Ganti 1439dengan input, simpan ke file, jalankan.


0

Ruby, 50 karakter

->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}

Terimakasih untuk:

  • GB untuk
    • mengingatkan saya bahwa saya tidak dapat mengambil lebih banyak karakter dari string (-1 karakter)
    • mengatur ulang perhitungan saya (-1 karakter)

Menunggu begitu lama untuk digunakan Numeric.divmod, hanya untuk menyadari bahwa itu sangat panjang.

Contoh dijalankan:

2.1.5 :001 > puts ->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}[252]
;;;;,,,,,,,,

1
Simpan 1 karakter dengan memotong string alih-alih menggunakan min:(?;*h=t/60)[0,m=t%60]
GB

1
Dan byte lain dengan mengurangi h dari m:",',"[0<=>m-=h]*m.abs
GB

0

05AB1E , 25 byte

60‰vy„'.Nè×}‚.BøJ„'.';:ðK

Cobalah online!

60‰vy„'.Nè×}pasti dapat dipersingkat, saya hanya tidak bisa mengetahuinya, dan ragu saya akan dapat mencukur 7 byte untuk menang dengan pendekatan ini kecuali ada versi vektor ×.


Contoh (Dengan input sama dengan 63):

60‰                       # Divmod by 60.
                          # STACK: [[1,3]]
   vy      }              # For each element (probably don't need the loop)...
                          # STACK: []
     „'.Nè×               # Push n apostrophe's for hours, periods for minutes.
                          # STACK: ["'","..."]
            ‚             # Group a and b.
                          # STACK: [["'","..."]]
             .B           # Boxify.
                          # STACK: [["'  ","..."]]
               ø          # Zip it (Transpose).
                          # STACK: [["'."," ."," ."]
                J         # Join stack.
                          # STACK: ["'. . ."]
                 „'.';:   # Replace runs of "'." with ";".
                          # STACK: ["; . ."]
                       ðK # Remove all spaces.
                          # OUTPUT: ;..

D60÷''×s60%'.ׂ.BøJ„'.';:ðK adalah versi asli saya, tapi itu LEBIH mahal daripada divmod.

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ namun metode lain yang saya coba ...



0

Java 8, 101 99 86 byte

n->{String r="";for(int m=n%60,h=n/60;h>0|m>0;r+=h--*m-->0?";":h<0?",":"'");return r;}

Penjelasan:

Coba di sini.

n->{                      // Method with integer parameter and String return-type
  String r="";            //  Result-String (starting empty)
  for(int m=n%60,h=n/60;  //   Get the minutes and hours from the input integer
      h>0|m>0;            //   Loop as long as either the hours or minutes is above 0
    r+=                   //   Append the result-String with:
       h--*m-->0?         //    If both hours and minutes are above 0
                          //    (and decrease both after this check):
        ";"               //     Use ";"
       :h<0?              //    Else-if only minutes is above 0 (hours is below 0)
        ","               //     Use ","
       :                  //    Else:
        "'"               //     Use "'"
  );                      //  End loop
  return r;               //  Return the result
}                         // End of method
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.