Vẽ một dòng thời gian


23

Đưa ra đầu vào của danh sách các số nguyên biểu thị ngày, xuất ra dòng thời gian nghệ thuật ASCII như sau:

<----------------------------->
  A     B  C           D    E

Dòng thời gian trên là đầu ra cho đầu vào [1990, 1996, 1999, 2011, 2016]. Lưu ý một số điều về dòng thời gian:

  • Dòng đầu ra đầu tiên là ít hơn dấu ( <), một số dấu gạch ngang bằng dateOfLastEvent - dateOfFirstEvent + 3(vì phải thêm một để bao gồm ngày cuối cùng, và sau đó thêm hai dấu nữa cho phần đệm), và sau đó lớn hơn dấu ( >).

  • Trong dòng đầu ra thứ hai, mỗi sự kiện được đặt ở vị trí dateOfEvent - dateOfFirstEvent + 2(giả sử không có chỉ mục). Do đó, sự kiện đầu tiên được đặt ở vị trí 2, hai ký tự bên phải <và sự kiện cuối cùng tương tự hai ký tự ở bên trái của >.

  • Mỗi sự kiện được đại diện bởi một chữ cái. Sự kiện 1 là A, sự kiện 2 là B, v.v. Sẽ không bao giờ có quá 26 sự kiện. Bạn có thể sử dụng chữ cái viết thường nếu bạn muốn.

  • Không có khoảng trắng ở cuối. Khoảng trắng bổ sung duy nhất được phép là một dòng mới ở cuối chương trình.

Hơn nữa,

  • Các sự kiện không nhất thiết phải được đưa ra theo thứ tự. Ngày vẫn được dán nhãn theo vị trí của họ trong mảng. Ví dụ: đầu vào [2, 3, 1, 5, 4]phải xuất

    <------->
      CABED
    
  • Bạn có thể được cung cấp một hoặc nhiều sự kiện làm đầu vào. Ví dụ: đầu vào [12345]phải xuất

    <--->
      A
    
  • Bạn có thể cho rằng đầu vào sẽ không bao giờ chứa ngày trùng lặp.

Đầu vào có thể được cung cấp dưới dạng một mảng / danh sách các số nguyên / chuỗi hoặc một chuỗi đơn được phân tách bằng bất kỳ ký tự không số nào. Phạm vi ngày cho phép sẽ được cung cấp làm đầu vào là 1 ≤ x ≤ 32767.

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

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

32767 32715 32716 32750 32730 32729 32722 32766 32740 32762
<------------------------------------------------------->
  BC     G      FE         I         D           J   HA
2015 2014
<---->
  BA
1990 1996 1999 2011 2016
<----------------------------->
  A     B  C           D    E
2 3 1 5 4
<------->
  CABED
12345
<--->
  A

Câu trả lời:


5

Pyth, 37 36 35 34 byte

:*dlp++\<*\-+3-eJSQhJ">
"mhh-dhJQG

Giải thích: (vì điều này, dòng mới sẽ được thay thế bằng cách \nđơn giản)

:*dlp++\<*\-+3-eJSQhJ">\n"mhh-dhJQG

                                    - autoassign Q = eval(input())
                                    - G = "abcdefghijklmnopqrstuvwxyz"

    p++\<*\-+3-eJSQhJ">\n"          -    print out the first line

            +3-eJSQhJ               -        Get the number of dashes
                 SQ                 -            sorted(Q)
                J                   -           autoassign J = ^
               e                    -          ^[-1]
              -                     -         ^-V
                   hJ               -          J[0]
            +3                      -        ^+3

         *\-                        -       ^*"-"
      +\<                           -      "<"+^
     +               ">\n"          -     ^+"-->\n"
    p                               -    print(^)

 *dl                                -  work out the number of spaces to print
   l                                -   len(^)
 *d                                 -  ^*" "
:                                 G - For i in V: ^[i] = G[i]
                          mhh-dhJQ  -  Work out the positions of the characters
                          m      Q  -  [V for d in Q]
                               hJ   -     J[0]
                             -d     -    d-^
                           hh       -   ^+2

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


5

PowerShell, 120 108 byte

param($a)$n,$m=($a|sort)[0,-1];"<$('-'*($b=$m-$n+3))>";$o=,' '*$b;$i=97;$a|%{$o[$_-$n+2]=[char]$i++};-join$o

Lấy đầu vào $asau đó đặt $n$mcác giá trị tối thiểu và tối đa tương ứng. Chúng tôi xuất dòng thời gian với phần tiếp theo, bằng cách thực thi một khối mã $(...)bên trong chuỗi để tạo số lượng -ký tự phù hợp . Sau đó, chúng tôi tạo ra một mảng có cùng độ dài chỉ chứa khoảng trắng và đặt ký tự đầu ra của chúng tôi thành $i.

Sau đó, chúng tôi lặp qua đầu vào $avới |%{...}. Mỗi vòng lặp, chúng tôi đặt $ogiá trị thích hợp . Cuối cùng, chúng tôi -join $ocùng nhau tạo thành một chuỗi. Vì đó là trái trên đường ống, đầu ra là ẩn.

Được chỉnh sửa để loại bỏ .TrimEnd()lệnh, vì ký tự cuối cùng $oluôn được đảm bảo là một chữ cái.

Thí dụ

PS C:\Tools\Scripts\golfing> .\draw-a-timeline.ps1 2015,2014,2000
<------------------>
  c             ba

4

C - 294 287 220 191 184 178 174 byte

Sau khi nhìn chằm chằm với một mã hơi điên rồ, ít nhất tôi đã nhận được nó một chút ...

Lưu ý: Vòng lặp đầu tiên có yêu cầu rằng việc thực hiện nhị phân cho 0 là kết quả từ atoi()ngày argv[0]. Nếu không, điều này sẽ dẫn đến việc nhị phân (tên) được đưa vào như một sự kiện. Ví dụ không hợp lệ:

$ 42/program 1 2 3
# 42/program gives 42 from argv[0], fail.

$ 1program 3 2 9
# 1program gives 1 from argv[0], fail.

$ 842 3 2 9
# 842 gives 842 from argv[0], fail.

Không chắc chắn nếu đây là một yêu cầu hợp lệ.

char y[32769];n,m;main(i,a)char**a;{for(;n=atoi(a[--i]);y[n>m?m=n:n]=64+i);for(;!y[++i];);printf("<");for(n=i;i<=m;i+=printf("-"))!y[i]?y[i]=' ':0;printf("-->\n  %s\n",y+n);}

Chạy:

./cabed 32767 32715 32716 32750 32730 32729 32722 32766 32740 32762
<------------------------------------------------------->
  BC     G      FE         I         D           J   HA

./cabed 2 1 3 5 4
<------->
  BACED

./cabed 2016
<--->
  A

./cabed 130 155 133 142 139 149 148 121 124 127 136
<------------------------------------->
  H  I  J  A  C  K  E  D     GF     B

Ung dung:

#include <stdio.h>
#include <stdlib.h>

char y[32769]; /* Zero filled as it is in global scope. */
int n, m;

int main(i, a) 
    char**a; 
{
    /* Loop argv and set y[argv[i] as int] = Letter, (Event name).
     * Set m = Max value and thus last data element in y. */
    for ( ; n = atoi(a[--i]); y[n > m ? m = n : n] = 64 + i)
        ;

    /* i = 0. Find first element in y that has a value. (Min value.) */
    for (; !y[++i]; )
        ;

    printf("<");

    /* Save min value / y-index where data starts to n.
     * Print dashes until y-index = max 
     * Build rest of event string by filling in spaces where no letters.*/
    for (n = i; i <= m; i += printf("-"))
        !y[i] ? y[i] = ' ' : 0;

    printf("-->\n  %s\n", y + n);

    return 0;
}

3

MATL , 40 41 byte

0lY2in:)GtX<-I+(t~32w(ctn45lbX"60hP62hcw

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

0          % array initiallized to 0
lY2        % string 'ABC...Z'
in:)       % input array. Take as many letters as its length
GtX<-I+    % push input again. Duplicate, subtract minimum and add 3
(          % assign selected letter to those positions. Rest entries are 0
t~32w(     % replace 0 by 32 (space)
c          % convert to char
tn45lbX"   % duplicate, get length. Generate array of 45 ('-') repeated that many times
60hP62h    % prepend 60 ('<'), postpend 62 ('>')
c          % convert to char
w          % swap. Implicit display

2

Ruby, 83 ký tự

->a{n,m=a.minmax
s=' '*(d=m-n+3)
l=?@
a.map{|i|s[i-n+2]=l.next!}
puts ?<+?-*d+?>,s}

Chạy mẫu:

irb(main):001:0> ->a{n,m=a.minmax;s=' '*(d=m-n+3);l=?@;a.map{|i|s[i-n+2]=l.next!};puts ?<+?-*d+?>,s}[[32767,32715,32716,32750,32730,32729,32722,32766,32740,32762]]
<------------------------------------------------------->
  BC     G      FE         I         D           J   HA

2

JavaScript (ES6), 124

l=>(l.map(v=>r[v-Math.min(...l)]=(++i).toString(36),r=[],i=9),`<-${'-'.repeat(r.length)}->
  `+[...r].map(x=>x||' ').join``)

KIỂM TRA

F=
l=>(l.map(v=>r[v-Math.min(...l)]=(++i).toString(36),r=[],i=9),`<-${'-'.repeat(r.length)}->
  `+[...r].map(x=>x||' ').join``)

console.log=x=>O.textContent+=x+'\n'

test= [[32767,32715,32716,32750,32730,32729,32722,32766,32740,32762],
[2015,2014],[1990,1996,1999,2011,2016],[2,3,1,5,4],[12345]]

test.forEach(x=>console.log(x+'\n'+F(x)+'\n'))
<pre id=O></pre>


2

PHP, 129 126 125 121 117 115 byte

Sử dụng mã hóa ISO 8859-1.

$l=min([$h=max($z=$argv)]+$z)-3;echo~str_pad(Ã,$h-$l,Ò).~ÒÁõ;for(;$l<$h;)echo chr((array_search(++$l,$z)-1^32)+65);

Chạy như thế này (chỉ -dthêm tính thẩm mỹ):

php -r '$l=min([$h=max($z=$argv)]+$z)-3;echo~str_pad(Ã,$h-$l,Ò).~ÒÁõ;for(;$l<$h;)echo chr((array_search(++$l,$z)-1^32)+65);' 1990 1996 1999 2016 2011 2>/dev/null;echo

Phiên bản bị đánh cắp:

// Get the highest input value.
$h = max($z = $argv);

// Get the lowest value, setting the first argument (script name) to the highest
// so it is ignored.
$l = min([$h] + $z);

// Output the first line.
echo "<".str_repeat("-",$h - $l + 3).">\n  ";

// Iterate from $l to $h.
for(;$l <= $h;)
    // Find the index of the current iteration. If found, convert the numeric
    // index to a char. If not found, print a space.
    echo ($s = array_search($l++, $z)) ? chr($s+64) : " ";
  • Đã lưu 3 byte bằng cách in các khoảng trắng hàng đầu từ vòng lặp và thay đổi <=thành <.
  • Đã lưu một byte bằng cách sử dụng str_pad thay vì str_repeat.
  • Đã lưu 4 byte bằng cách sử dụng logic bitwise để chuyển đổi 0 (false ) thành 32 và mọi thứ từ 0 đến 97 trở đi. Sau đó chuyển đổi số đó thành char.
  • Lưu 4 byte bằng cách sử dụng phủ nhận ASCII mở rộng cho năng suất <,- , >và xuống dòng
  • Đã lưu 2 byte bằng cách phủ định chuỗi sau khi đệm thay vì trước

1

Perl, 109 byte

bao gồm +1 cho -p

$l=A;s/\d+/$h{$&}=$l++/ge;($a,$z)=(sort keys%h)[0,-1];$o.=$h{$_}//$"for$a..$z;$_='<'.'-'x($z-$a+3).">$/  $o"

Yêu cầu đầu vào trên stdin: không gian tách số. Thí dụ:

$ echo 2016 2012 2013 | perl -p file.pl
<------->
  BC  A

Một chút có thể đọc được:

$l=A;                                   # Intialize $l with the letter A
s/\d+/$h{$&}=$l++/ge;                   # construct %h hash with number->letter
($a,$z) = (sort keys %h)[0,-1];         # grab min/max numbers
$o .= $h{$_} // $" for $a..$z;          # construct 2nd line: letter or space
$_= '<' . '-' x ($z-$a+3) . ">$/  $o"   # construct 1st line, merge both lines to $_ output

1

Con trăn 2 173 172 182 byte

Vì Python bị thiếu, đây là bài viết đầu tiên của tôi:

import sys
d=dict([(int(v),chr(65+i))for(i,v)in enumerate(sys.argv[1:])])
k=sorted(d.keys())
f=k[0]
s=k[-1]-f+3
o=list(" "*s)
for i in k:o[i-f+2]=d[i]
print "<"+"-"*s+">\n"+"".join(o)

hình dạng ban đầu như sau:

import sys

dates = dict([(int(v), chr(65+i)) for (i,v) in enumerate(sys.argv[1:])])
keys = sorted(dates.keys())
first = keys[0]
out_size = keys[-1] - first + 3
out = list(" " * out_size)
for date in keys: out[date - first + 2] = dates[date]
print "<" + "-" * out_size + ">\n" + "".join(out)

1
Bạn cần import systrong phiên bản golf của bạn.
Mego

ok, tôi sẽ, nhưng tôi chưa bao giờ thấy bất kỳ nhập khẩu nào trong các phiên bản golf, vì vậy tôi chỉ để nó ra
BloodyD

0

Groovy, 106 99 ký tự

{n=it.min()
o=[l="A"]
it.each{o[it-n]=l++}
"<${"-"*(it.max()-n+3)}>\n  "+o.collect{it?:" "}.join()}

Chạy mẫu:

groovy:000> print(({n=it.min();o=[l="A"];it.each{o[it-n]=l++};"<${"-"*(it.max()-n+3)}>\n  "+o.collect{it?:" "}.join()})([32767,32715,32716,32750,32730,32729,32722,32766,32740,32762]))
<------------------------------------------------------->
  BC     G      FE         I         D           J   HA
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.