Đồng hồ ASCII có dấu chấm thời gian và dấu phẩy


39

Giới thiệu

giải thích mã golf

Hãy tưởng tượng rằng dòng ký tự trên thực tế là hai hàng. Hàng trên - dấu chấm - đại diện cho giờ (hệ thống 24 giờ), trong khi thấp hơn - dấu phẩy - đại diện cho phút . Một nhân vật có thể đại diện cho giờ, phút hoặc cả hai - bất cứ khi nào có thể.

Lúc đầu, có lẽ bạn phải chuyển đổi phút từ nửa đêm sang giờ và phút .

Kết quả là chuỗi hiển thị thời gian hiện tại ở "định dạng dấu chấm". Số lượng chấm ( dấu nháy đơn được tính ở đây là một dấu chấm và sẽ được gọi như vậy! ) Là số giờ kể từ nửa đêm và số dấu phẩy là số phút. Tôi sẽ đưa ra một vài ví dụ để làm cho nó rõ ràng.

  • (Ghi chú) hh: mm - result
  • (Chỉ giờ) 05:00 - '''''
  • (Chỉ vài phút) 00:08 - ,,,,,,,,
  • (giờ <phút) 03:07 - ;;;,,,,
  • (giờ> phút) 08:02 - ;;''''''
  • (giờ = phút) 07:07 - ;;;;;;;
  • (đầu ngày) 00:00 - ( kết quả trống )

Lưu ý rằng ký tự "cả hai" có thể được sử dụng tối đa 23 lần - cho 23: xx, trong đó xx là 23 trở lên.

Biểu tượng

Nếu ký tự phải (xem quy tắc 5.) được thoát trong ngôn ngữ của bạn, bạn có thể thay đổi nó thành một trong những lựa chọn thay thế. Nếu các lựa chọn thay thế nói không đủ, bạn có thể sử dụng các biểu tượng khác - nhưng hãy giữ nó hợp lý. Tôi chỉ không muốn trốn thoát là một rào cản.

  • ;(dấu chấm phẩy) - điểm đánh dấu cho cả giờ và phút (alt ::)
  • '(dấu nháy đơn) - điểm đánh dấu trong nhiều giờ (alt '``°:)
  • ,(dấu phẩy) - điểm đánh dấu trong vài phút (alt .:)

Quy tắc bổ sung

  1. Mã có số lượng byte ít nhất sẽ thắng!
  2. Bạn phải sử dụng cả hai biểu tượng bất cứ khi nào có thể. Cho 02:04 kết quả không thể '',,,,, cũng không ;',,,. Nó phải là;;,,
  3. Đầu vào - có thể là tham số tập lệnh / ứng dụng, đầu vào của người dùng (như đường dẫn) hoặc biến bên trong mã
    3.1. Nếu biến bên trong mã được sử dụng, thì chiều dài của nó phải dài nhất có thể. Đó là 1439(23:59), vì vậy nó sẽ trông giống nhưt=1439
  4. Phần chung được ký hiệu bằng ký tự "cả hai" (12 trong 12:05, 3 trong 03:10) phải được đặt ở đầu chuỗi
  5. Các biểu tượng chỉ có thể được thay thế bằng các lựa chọn thay thế nếu chúng phải được thoát trong mã của bạn.
  6. Đầu vào được đưa ra trong vài phút sau 00:00 . Bạn có thể cho rằng đây là một số nguyên không âm.

Các trường hợp thử nghiệm

Input: 300
Output: '''''

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

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

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

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

Input: 0
Output:  (empty)

Cảm ơn bạn, Adnan đã chỉnh sửa bài viết của tôi! Bằng cách này, tôi sẽ học bằng cách so sánh golf của tôi, người mới chơi với bạn :)
Krzysiu

3
Không vấn đề gì! Đây là một bài đăng đầu tiên rất hay và một thử thách thú vị :)
Adnan

1
điều này có vẻ rất tốt chỉ với dấu chấm phẩy và dấu phẩy, nhưng dấu nháy đơn làm hỏng tất cả :(
Sparr

Thực tế 1439là có 23:59và không 1339. (23 x 60 + 59).
insertusernamehere

Cảm ơn tất cả các bạn cho những lời tốt đẹp! :) @Sparr, yeah, đó là điểm xấu :( Có bạn ý tưởng làm thế nào nó có thể được thay thế insertusernamehere, tất nhiên đó là đúng cố định :)?!
Krzysiu

Câu trả lời:


10

Bình thường, 19 byte

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

Bộ kiểm tra

:.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

Lấy đầu vào từ STDIN:

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

Kiểm tra nó ở đây.

Giải trình

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.
}

Thật may mắn khi mọi thứ phối hợp tốt ở đây, đặc biệt là việc gán giờ 'và phút để ,thứ tự giờ và phút trên ngăn xếp khớp với biểu diễn chuỗi của nhân vật.

Đây là khối 3 byte duy nhất tôi tìm thấy cho đến nay. Có hàng tấn giải pháp gồm 4 ký tự:

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

6

GNU Sed, 37

Điểm bao gồm +1 cho -Etùy chọn để sed.

Tôi không đặc biệt ấn tượng với tính golf của câu trả lời bash của mình , vì vậy tôi nghĩ tôi sẽ thử với sed cho vui.

Đầu vào là đơn nhất, theo câu trả lời meta này .

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

Dùng thử trực tuyến


nhãn không tên ??
mikeerv


@manatwork - Tôi nghĩ đó phải là một lỗi GNU.
mikeserv

@mikeerv - nhưng sử dụng lỗi cũng không sao, phải không? Tôi không yêu cầu chế giễu bạn, tôi chỉ không biết :)
Krzysiu

@Krzysiu - ok? hmm trên trang web này tôi nghĩ rằng nó sẽ là một dấu ấn xuất sắc. mặt khác, gần như chắc chắn là không khi các lập trình viên đi lạc khỏi API và sử dụng các chương trình chi tiết triển khai trở thành phụ thuộc phiên bản / triển khai - đó là một điều tồi tệ.
mikeerv

6

Python 2, 56 byte

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

Một chức năng in (một char ngắn hơn t=input();).

Phương pháp này tương tự như của Loovjo . Số lượng ,là khác nhau giữa phút và giờ, với mức tối thiểu ngầm là 0. Đối với ', đó là sự phủ định. Đối với ;, tính toán minngầm bằng cách mất nhiều ;giờ, sau đó cắt ngắn đến số phút.

Nó tiết kiệm ký tự để tiết kiệm d, nhưng không phải số giờ và phút ở đây. Sự tương tự với lambda là hai ký tự dài hơn (58), vì vậy các bài tập biến có giá trị.

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

Xử lý đầu vào trực tiếp cũng không lưu ký tự (58):

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

Một chiến lược khác với cắt lát, dài hơn nhiều (64):

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


3

Pure Bash (không có tiện ích bên ngoài), 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]

Cảm ơn @ F.Hauri vì đã lưu 2 byte.


Tốt đẹp! Nhưng bạn có thể tiết kiệm 2 chars bằng cách trao đổi $1$2trong p()và viết p , $ctại dòng 3.
F. Hauri

Có, nhưng vì nó chỉ được sử dụng trong một printf "%s", cnên trống sẽ hoạt động tốt (trong khi không được sử dụng lại)
F. Hauri

@ F.Hauri Bây giờ tôi hiểu rồi - cảm ơn!
Chấn thương kỹ thuật số

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

Chi tiết

// 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
Sử dụng putchar& số nguyên bằng chữ làm ký tự tiết kiệm một byte, kéo dấu chấm phẩy bên trong macro sẽ tiết kiệm thêm hai ký tự :)
Quentin

@Quentin lưu ý, đã lưu 5 byte
Khaled.K

Bạn có thể mất dung lượng trước whilemacro #define của bạn. -1 byte
Albert Renshaw

1
Bạn cũng có thể lưu thêm một số byte bằng cách chỉ tạo p (a, b) thành hàm thay vì macro. (Và rắc thêm một vài dấu chấm phẩy vào chức năng chính của bạn)
Albert Renshaw

3

Haskell, 68 66 byte

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

Ví dụ sử dụng:

(g.(`divMod`60)) 482

Một chút thông minh ở đây là replicatesẽ trả về chuỗi trống nếu độ dài cho là âm hoặc bằng 0 để tôi có thể áp dụng nó cho cả hai sự khác biệt và chỉ có chuỗi tích cực mới hiển thị. Phần đầu tiên là dễ dàng, vì số lượng dấu chấm phẩy chỉ là tối thiểu của hai. Sau đó zipWitháp dụng chức năng cho các mục tương ứng.

EDIT: Nhận ra tôi đã sử dụng char sai trong vài phút

EDIT 2: Đã lưu 2 byte nhờ @Laikoni


Bạn có thể lưu hai byte bằng cách thay thế concat$bằng 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)

Sử dụng phương pháp của Loovjo , đây là cách thực hiện quyền hạn của tôi.

vô dụng

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)

Đã lưu 14 byte nhờ vào admBorkBork


Bạn có thể lưu bằng cách sử dụng một giả ba cho cái đầu tiên, di chuyển $m$hkhai báo vào đó, sau đó sử dụng phép nhân Boolean. Giống như vậy -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))

Có lẽ không phải là câu trả lời tốt nhất, nhưng nó rất nhiều niềm vui!


1

Python 2, 61 byte

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

Giải thích:

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

Tôi đã chọn đầu vào biến vì nó ngắn hơn đọc từ STDINhoặc lấy các đối số dòng lệnh.

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

Tôi nghĩ rằng tôi biết PHP khá rõ, nhưng tôi thấy | lần đầu tiên Tôi nghĩ rằng tôi sẽ sử dụng nó để tập thể dục một chút - Tôi sẽ phân tích nó :)
Krzysiu

Thất bại cho 240. Hãy thử $i>=min($h,$m)?$h<$m?",":"'":";"(+1 byte). Hoặc sử dụng for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76 byte). Btw: trích dẫn duy nhất làm cho -rkhông thể; vì vậy bạn nên sử dụng backtick trong nhiều giờ nếu trong một chuỗi hoặc °độc lập (không cần dấu ngoặc kép -> -1 byte).
Tít

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)

Sử dụng tuyệt vời các bài tập trong các đối số truy cập thuộc tính / hàm. +1
Cyoce

1

Perl 6, 103 101 98 97 69 byte

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

Đầu ra một số mảng, nhưng đụ nó, thưởng thức. Như thường lệ, bất kỳ cơ hội chơi golf nào cũng được áp dụng.

Chỉnh sửa: -2 byte: đã dũng cảm và loại bỏ một số phôi.

Edit2: -3 byte bằng cách loại bỏ các mảng.

Edit3: -1 byte để in ở định dạng đúng, sử dụng "lambdas" và loại bỏ các thông số.

Edit4: (xin lỗi các bạn) lạm dụng số giờ đó - phút sẽ trả về 0 và ngược lại. Loại bỏ nếu báo cáo. Sau đó loại bỏ dấu ngoặc, sau đó nhận ra tôi không cần lambda chút nào. -28 byte :)

Woah tôi đang trở nên tốt hơn về điều này.


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

Tôi nghĩ bạn có thể tiết kiệm một vài byte bằng cách sử dụng h>0||m>0. Sau đó, bạn h--;m--;chỉ cần một lần trong mỗi lần lặp và {}for if/elsesẽ bị lỗi thời.
insertusernamehere

Bạn cũng có thể lưu một vài byte vào điều kiện thứ hai của mình: thay vì else if(h&&!m)bạn chỉ có thể cóelse if(h)
Hellion

Và cuối cùng hãy thử sử dụng toán tử ternary, nó sẽ giúp bạn không sử dụng các từ "dài" như ifelse.
insertusernamehere

Xem xét tái cấu trúc như là một hàm lấy đầu vào làm tham số int - ít nhất sẽ giúp bạn tiết kiệm scanf().
Chấn thương kỹ thuật số

Tôi không nghĩ rằng điều đó %24là cần thiết - đầu vào tối đa là 23:59.
Chấn thương kỹ thuật số

0

Gema, 119 ký tự

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

Chạy mẫu:

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

Kiểm tra:

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

0

SmileBASIC, 59 byte

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

Giải thích:

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 ,

Nó trông khá khủng khiếp, vì phần dưới cùng ;thậm chí không giống như ,trong phông chữ của SmileBASIC


0

PHP, 81 byte

một số giải pháp khác:

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

Chạy với 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]);

Thay thế 1439bằng đầu vào, lưu vào tập tin, chạy.


0

Ruby, 50 ký tự

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

Nhờ vào:

  • GB cho
    • nhắc nhở tôi rằng tôi không thể lấy nhiều ký tự từ một chuỗi hơn số ký tự đó (-1 ký tự)
    • sắp xếp lại tính toán của tôi (-1 ký tự)

Chờ đợi quá lâu để sử dụng Numeric.divmod, chỉ để nhận ra rằng nó dài khủng khiếp.

Chạy mẫu:

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

1
Lưu 1 ký tự bằng cách cắt bớt chuỗi thay vì sử dụng min:(?;*h=t/60)[0,m=t%60]
GB

1
Và một byte khác bằng cách trừ h từ m:",',"[0<=>m-=h]*m.abs
GB

0

05AB1E , 25 byte

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

Hãy thử trực tuyến!

60‰vy„'.Nè×}Tôi chắc chắn có thể rút ngắn lại, tôi không thể tìm ra nó và nghi ngờ rằng tôi có thể loại bỏ 7 byte để giành chiến thắng với phương pháp này trừ khi có phiên bản véc tơ ×.


Ví dụ (Với đầu vào bằng 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 là phiên bản gốc của tôi, nhưng nó thậm chí còn đắt hơn cả divmod.

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ một phương pháp khác tôi đã thử ...



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

Giải trình:

Hãy thử nó ở đây.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.