Thế hệ người cai trị ASCII


11

Thách thức là tạo ra một thước đo đếm ký tự ASCII theo định dạng sau:

+-------------------------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |    |    |    |    |  |
|0         10        20        30        40        50        60        70 |
|                                                                         |
+-------------------------------------------------------------------------+

Độ dài của thước nên có thể mở rộng theo bất kỳ bội số nào của 10.

Quy tắc:

  • Thước phải nằm ngang.
  • Giả sử, để đơn giản hơn, thước đo phải hoạt động cho đến 1000 điểm, tất cả các số được căn trái, một khoảng trắng sau số cuối cùng .
  • Yêu cầu thước có độ dài bằng 0 nên in NaR
  • Các số âm nên in một thước kẻ đảo ngược (-90, -80, -70, ...) với các số được căn phải, theo định dạng chính xác như ở trên

Và, chỉ cần in ra bàn điều khiển là ổn

Sẵn sàng, thiết lập, golf!


Làm thế nào để chương trình biết làm cho người cai trị bao lâu? Được cung cấp dưới dạng số trên STDIN?
PhiNotPi

Vâng, như thường lệ tôi đoán!
user2398029

1
Thước có phải là ngang hay dọc? Nếu nó nằm ngang, chúng ta có thể giả sử tối đa 80 ký tự hay chúng ta xuất dữ liệu này thành một tệp để tránh gói thay thế? hoặc chúng ta phải thay đổi kích thước bàn điều khiển / thiết bị đầu cuối khi ghi vào thiết bị xuất chuẩn?
Blazer

5
Một trong những điểm chính của môn đánh gôn là vấn đề phải được xác định rõ ràng 100% (xem faq ). Có rất ít chỗ cho sự sáng tạo trong đầu ra thực tế, bởi vì sự sáng tạo nằm trong chính mã. Trong tương lai, vui lòng thử suy nghĩ về tất cả các trường hợp có thể này trước khi đăng câu hỏi, nhưng vì bạn là người mới nên chúng tôi sẽ giúp bạn :)
mellamokb

3
Bạn có thể vui lòng chỉnh sửa các thách thức để bao gồm các quy tắc được chỉ định trong các ý kiến?
flesk

Câu trả lời:


8

Con trăn - 227 232

Hỗ trợ toàn bộ đặc điểm kỹ thuật

chỉnh sửa: cải thiện biểu thức máy phát điện.

Hỗ trợ các số âm được căn chỉnh đúng sẽ thêm một lượng mã đáng ngạc nhiên.

b,p,d,w,='|+- '
g=input
s=''.join(('%'+d[:i>0]+'10s')%i+['',9*w][i==0] for i in range(g(),g()+1,10)).strip()+w
m,n=s[0]==d and s.find(w)-1,len(s)
t=p+n*d+p
print['\n'.join([t,b+(w*m+'|    '*n)[:n]+b,b+s+b,b+n*w+b,t]),'NaR'][n<9]

Đầu ra mẫu:

-30 30

+-----------------------------------------------------------------+
|  |    |    |    |    |    |    |    |    |    |    |    |    |  |
|-30       -20       -10         0         10        20        30 |
|                                                                 |
+-----------------------------------------------------------------+

-30 -30

NaR

100 150

+------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |   |
|100       110       120       130       140       150 |
|                                                      |
+------------------------------------------------------+

-1000 -950

+--------------------------------------------------------+
|    |    |    |    |    |    |    |    |    |    |    | |
|-1000      -990      -980      -970      -960      -950 |
|                                                        |
+--------------------------------------------------------+

10

Sẽ không đánh bại các ngôn ngữ năng động ngày hôm nay, nhưng dù sao ...

Haskell, 341

import Data.List
main=interact$unlines.m.map read.words
m[l,r]|r>l=ᴛ.("┌│││└":).(++["┬   ─","┐│││┘"]).ʀ.t.ʀ.t.takeWhile((>4).length).ᴛ$[c"┬",c"│    ",[l,l+10..r]>>=h.show,c" ",c"─"]|True=["NaR"]
h s=p s$length s;p s@('-':_)l=r(6-l)ꜱ++s++r 4ꜱ;p s l=r 5ꜱ++s++r(5-l)ꜱ
ᴛ=transpose;ʀ=reverse;r=replicate;c=cycle
ꜱ=' ';t l@(c:o)|c!!2==ꜱ=t o|True=l

Tôi đã tự do trao đổi các ký tự ASCII thực tế với các ký tự vẽ hộp unicode trông đẹp hơn.

$ echo "-50 30" | runhaskell  def0.hs
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│  │    │    │    │    │    │    │    │    │    │    │    │    │    │    │    │    │  │
│-50       -40       -30       -20       -10         0         10        20        30 │
│                                                                                     │
└─────────────────────────────────────────────────────────────────────────────────────┘

2
Cái thước kẻ trông rất, rất đẹp.
user2398029

3

Python 2.7, 342 266 260 ký tự

a,b,c,d,m='+|- \n'
def f(y):x=map(str,(range(0,y+1,10)if y>0 else range(y,1,10)));h,g=len(x[-1])+1,len(x)-1;u=a+(c*10)*g+c*h+a;return'NaR'if y==0 else u+m+b+(b+d*4)*2*g+b+d*(h-1)+b+m+b+''.join(i.ljust(10)for i in x[:-1])+x[-1].ljust(h)+b+m+b+(d*10)*g+d*h+b+m+u

trả về một tuple của mỗi chuỗi dòng , sau đó bạn có thể in hoặc lưu vào một tệp (tôi thích cái sau dài hơn 70 bởi vì giao diện điều khiển sẽ làm cho nó trông rối tung khi gói)

Giả sử ymột chuỗi (raw_input () n python hoặc sys.argv [1] nếu bạn muốn gọi qua cmd) một số nguyên (ví dụ: với input () trong 2.x hoặc int (input ()) trong 3.x )

Tôi đã thực hiện điều này một chức năng để linh hoạt hơn

chỉnh sửa: giảm xuống còn 266 ký tự. không còn trả về một tuple, mà thay vào đó là một chuỗi. Bây giờ lấy một số nguyên thay vì một chuỗi làm đối số

chỉnh sửa2: giảm xuống 260 ký tự, chức năng dòng đơn

lưu ý: không xử lý số âm, nhưng không chính đáng (tôi thực sự không hiểu rằng biện minh là quá quan trọng


Hoặc chỉ sử dụng bảng điều khiển không ngắt dòng (ví dụ Terminator ).
đã ngừng quay ngược chiều

@leftaroundabout Tôi không chắc có một thứ như vậy tồn tại
Blazer

bất kể, việc phải cài đặt một nền tảng riêng chỉ để làm cho một người cai trị dường như vô nghĩa, trong đó việc tạo ra một giá trị trả về mà bất kỳ ai cũng có thể sử dụng (ghi vào tệp, v.v.) là phổ biến hơn
Blazer

@Blazer, vỏ của bạn không có đường ống và chuyển hướng?
Peter Taylor

1

PowerShell , 256 253 233 225 222 byte

param($a,$b)('NaR',$($d=@{}
$a..$b|%{$d.$_=' ';0..($l=($s="$($_-$_%10)").Length-1)|%{$d[$_+$s-$l*(0-gt$s)]=$s[$_]}}
$d.Keys|sort|%{$e+='-';$p+='|    '[$_%5];$r+=$d.$_;$w+=' '}
@"
+$e-+
|$p |
|$r |
|$w |
+$e-+
"@))[$a-lt$b]

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

Ít chơi gôn hơn:

param($a,$b)
(
    'NaR',
    $(
        # {key, value} := {position, digit|minus|space}
        $d=@{}
        $a..$b|%{
            $d.$_=' '

            # draw a nearest left number
            $n=$_-$_%10
            $s="$n"
            $l=$s.Length-1
            0..$l|%{
                $d[$_+$s-$l*(0-gt$s)]=$s[$_]
            }
        }

        # edge, points, ruler, whitespaces
        $d.Keys|sort|%{
            $e+='-'
            $p+='|    '[$_%5]
            $r+=$d.$_
            $w+=' '
        }

        # output the multiline string
@"
+$e-+
|$p |
|$r |
|$w |
+$e-+
"@
    )
)[$a-lt$b]

0

Con trăn, 291 241 ký tự

Một cách tiếp cận khá đơn giản. Tôi chắc chắn rằng nó có thể được cải thiện khá nhiều.
Tôi đã cố gắng làm theo các hướng dẫn trong các bình luận, nhưng tôi không ủng hộ các số âm (đó là một trò đùa, tôi hy vọng).
Đây là một chương trình, in thước đo thành đầu ra tiêu chuẩn. Nếu màn hình của bạn đủ rộng, nó sẽ hỗ trợ các thước kẻ khá dài.

import sys
def p(b,a="|"):print a+b+a
j="".join
l=int(sys.argv[1])//10*10
if l:
    d=j(["%-10d"%n for n in range(0,l,10)])+"%d "%l
    L=len(d)
    h="-"*L
    p(h,"+")
    p(j(["|    "[n%5] for n in range(L)]))
    p(d)
    p(" "*L)
    p(h,"+")
else: print "NaR"

Bạn có thể chơi thêm một vài nhân vật nữa trong số này. Tôi đã loại bỏ 12 nhân vật ở đây
Gordon Bailey

Cảm ơn @GordonBailey, nhưng dù sao cũng đã có người chiến thắng, nó ngắn hơn mã của tôi và hỗ trợ đặc điểm kỹ thuật đầy đủ.
ugoren

0

C ++, 392

Điều này được lập trình bằng bảng điều khiển windows, do đó tôi chỉ chọn kích thước thước tối đa là 70, nó sẽ bị sập cho bất cứ thứ gì lớn hơn. Số âm (tối đa -70) và 0 được xử lý chính xác.

#include<ios>
#define q s[2][i
#define v ,memset(&s
char g,o,i,n,s[5][80];int main(int a,char**b){a=atoi(b[1])v,32,400);n=0<a;for(a=abs(a)v[0][1],45,a+3)v[4][1],45,a+3);i<a+4;++i)o=i-n,!(o%5)?s[1][n?i:i+3]='|',(o%2-1?(n?q]=i/10+48,i>9?q+1]=48:0:((a-i)>9?q+2]=(a-i)/10+48,q+1]=45:0,q+3]=48)):0):0;for(;g-5;g++)for(s[g][a+4]=s[g][i=0]=g&g-4?'|':43;i-80;i++)printf(a?"%c":g+i?"":"NaR",s[g][i]);}

0

Con trăn - 208

(không hỗ trợ các số âm được căn phải)

 l,u=map(int,raw_input().split())
 n=u-l
 q="+%s+\n"
 q=q+"|%s|\n"*3+q
 print q%('-'*n,(''.join("|    "for i in range(n)))[:n],(''.join("{:<10d}".format(i)for i in range(l,u,10)))[:n],' '*n,'-'*n)if n>0 else"NaR"

Tôi nghĩ thủ thuật yêu thích của tôi là tạo ra các chuỗi dài hơn mức cần thiết và sau đó cắt ngắn chúng, ví dụ:

 ''.join("|    "for i in range(n)))[:n]

Tôi chỉ muốn có một tùy chọn định dạng chuỗi ngắn gọn hơn cho căn lề trái (trừ khi có một tùy chọn mà tôi không biết)


0

Perl 5.14, 198 224 ký tự

Có thể rút ngắn hơn nữa, nhưng đây là lần thử thứ hai đầu tiên (có ngắt dòng được chèn để dễ đọc):

$l=shift||die"NaR\n";
@n=grep!($_%10),$l>0?0..$l:$l..0;
$l=9-length$n[$#n];
@f=('-'x10,'|    'x2,'@'.'<'x9,' 'x10);
@f=map$_ x@n,@f;
map$_=~s/.{$l}$//,@f;
eval"format=\n+$f[0]+\n|$f[1]|\n|$f[2]|\n\@n\n|$f[3]|\n+$f[0]+\n.\n";
write

EDIT: Được chỉnh sửa để chết với "NaR" khi đầu vào là 0và để hỗ trợ phạm vi âm.

EDIT2: Tôi chưa có cơ hội làm việc nhiều hơn về vấn đề này và tôi chỉ mới nhận thấy đúng quy tắc số âm, mà mã của tôi không hỗ trợ, vì vậy tôi nghĩ một giải pháp khác nên được đánh dấu là câu trả lời nếu thời hạn đã đạt được.


@louism: Câu trả lời của tôi không phù hợp với tất cả các quy tắc. Một câu trả lời khác nên được chọn nếu có thể.
flesk
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.