Generasi penguasa ASCII

11

Tantangannya adalah untuk menghasilkan penggaris penghitung karakter ASCII dalam format berikut:

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

Panjang penggaris harus scalable ke kelipatan 10.

Aturan:

  • Penguasa harus horizontal.
  • Katakanlah, untuk menjaga hal-hal lebih sederhana, bahwa penguasa harus bekerja hingga tanda 1000, semua angka dibariskan kiri, satu spasi setelah angka terakhir .
  • Meminta penggaris dengan panjang nol harus mencetak NaR
  • Angka negatif harus mencetak penggaris terbalik (-90, -80, -70, ...) dengan angka rata kanan, dalam format yang sama persis dengan yang di atas jika tidak

Dan, hanya mencetak ke konsol baik-baik saja

Siap, siap, golf!

pengguna2398029
sumber
Bagaimana program tahu berapa lama untuk membuat penggaris? Apakah ini diberikan sebagai nomor di STDIN?
PhiNotPi
Ya, seperti biasa saya kira!
user2398029
1
Apakah penggaris harus horizontal atau vertikal? jika horisontal, dapatkah kita mengasumsikan maksimal 80 karakter, atau apakah kita menampilkan ini ke file untuk menghindari pembungkus? atau apakah kita harus mengubah ukuran konsol / terminal saat menulis ke stdout?
Blazer
5
Salah satu poin utama dari kode-golf adalah bahwa masalahnya harus 100% ditentukan (lihat faq ). Ada sedikit ruang untuk kreativitas dalam output aktual, karena kreativitas ada dalam kode itu sendiri. Di masa mendatang, cobalah untuk memikirkan semua kasus yang mungkin terjadi sebelum memposting pertanyaan, tetapi karena Anda baru, kami membantu Anda :)
mellamokb
3
Bisakah Anda mengedit tantangan untuk memasukkan aturan yang ditentukan dalam komentar?
flesk

Jawaban:

8

Python - 227 232

Mendukung seluruh spesifikasi

sunting: ekspresi generator ditingkatkan.

Mendukung angka negatif yang disejajarkan dengan benar menambah jumlah kode yang mengejutkan.

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]

Output sampel:

-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 |
|                                                        |
+--------------------------------------------------------+
Steven Rumbalski
sumber
10

Tidak akan mengalahkan bahasa dinamis hari ini, tapi bagaimanapun ...

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

Saya mengambil kebebasan untuk bertukar karakter ASCII yang sebenarnya dengan karakter kotak gambar unicode yang terlihat lebih baik.

$ echo "-50 30" | runhaskell  def0.hs
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│  │    │    │    │    │    │    │    │    │    │    │    │    │    │    │    │    │  │
│-50       -40       -30       -20       -10         0         10        20        30 │
│                                                                                     │
└─────────────────────────────────────────────────────────────────────────────────────┘
tidak lagi mengaktifkan counterclockwis
sumber
2
Penguasa terlihat sangat, sangat baik.
user2398029
3

Python 2.7, 342 266 260 karakter

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

mengembalikan tuple dari setiap string baris , yang kemudian dapat Anda cetak atau simpan ke file (saya lebih suka yang terakhir lebih panjang dari 70 karena konsol akan hanya membuatnya terlihat berantakan dengan pembungkus)

Diasumsikan ysebagai string (raw_input () n python, atau sys.argv [1] jika Anda ingin memanggil melalui cmd) integer (misalnya dengan input () dalam 2.x atau int (input ()) dalam 3.x )

Saya membuat fungsi ini menjadi lebih fleksibel

sunting: dikurangi menjadi 266 karakter. tidak lagi mengembalikan tupel, tetapi string sebagai gantinya. Sekarang ambil integer alih-alih string sebagai argumen

sunting2: dikurangi menjadi 260 karakter, fungsi satu baris

catatan: memang menangani angka negatif, tetapi tidak membenarkan benar (saya tidak benar-benar menganggap pembenaran terlalu penting

Jaket
sumber
Atau cukup gunakan konsol non-linebreaking (mis. Terminator ).
Berhenti menghidupkan counterclock
@ Leftaroundabout Saya tidak yakin hal seperti itu ada
Blazer
bagaimanapun, harus menginstal platform terpisah hanya untuk membuat penggaris tampaknya tidak ada gunanya, di mana-seperti menciptakan nilai pengembalian yang dapat digunakan siapa pun (menulis ke file, dll) lebih universal
Blazer
@ Blazer, apakah cangkang Anda tidak memiliki pipa dan pengalihan?
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]

Cobalah online!

Kurang golf:

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]
mazzy
sumber
0

Python, 291 241 karakter

Pendekatan yang cukup sederhana. Saya yakin itu bisa ditingkatkan cukup banyak.
Saya mencoba mengikuti pedoman dalam komentar, tetapi saya tidak mendukung angka negatif (itu hanya lelucon, saya harap).
Ini adalah program, mencetak penggaris ke output standar. Jika layar Anda cukup lebar, seharusnya mendukung penggaris yang cukup panjang.

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"
ugoren
sumber
Anda dapat bermain golf beberapa karakter lagi dari ini saya mencukur 12 karakter di sini
Gordon Bailey
Terima kasih @GordonBailey, tetapi sudah ada pemenangnya, yang lebih pendek dari kode saya dan mendukung spesifikasi lengkap.
ugoren
0

C ++, 392

Ini diprogram menggunakan konsol windows, oleh karena itu saya hanya memilih ukuran penggaris maksimum adalah 70, itu hanya akan crash untuk sesuatu yang lebih besar. Angka negatif (hingga -70) dan 0 ditangani dengan benar.

#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]);}
Scott Logan
sumber
0

Python - 208

(tidak mendukung angka negatif yang disejajarkan dengan benar)

 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"

Saya pikir trik favorit saya adalah untuk menghasilkan string yang jauh lebih lama dari yang diperlukan dan kemudian memotongnya, misalnya:

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

Saya hanya berharap ada opsi pemformatan string yang lebih ringkas untuk perataan-kiri (kecuali ada satu yang tidak saya ketahui)

Gordon Bailey
sumber
0

Perl 5.14, 198 224 karakter

Mungkin dapat dipersingkat lebih jauh, tapi inilah upaya kedua pertama (dengan jeda baris dimasukkan untuk dibaca):

$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: Diedit untuk mati dengan "NaR" ketika input 0dan untuk mendukung rentang negatif.

EDIT2: Saya belum punya kesempatan untuk bekerja lebih lanjut tentang ini, dan saya baru saja memperhatikan hak yang disejajarkan untuk aturan angka negatif, yang kode saya tidak mendukung, jadi saya pikir solusi lain harus ditandai sebagai jawaban jika tenggat waktu telah tercapai.

flesk
sumber
@ louism: Jawaban saya tidak sesuai dengan semua aturan. Jawaban lain harus dipilih jika memungkinkan.
flesk