ASCIIルーラーの生成


11

課題は、ASCII文字カウントルーラーを次の形式で生成することです。

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

ルーラーの長さは、10の倍数までスケーラブルでなければなりません。

ルール:

  • 定規は水平でなければなりません。
  • 物事を簡単にするために、ルーラーは、1000マーク、すべての数字が左揃え、最後の数字の1スペース後まで動作する必要があるとしましょう。
  • 長さゼロの定規を要求すると、NaRが出力されます。
  • 負の数は、逆のルーラー(-90、-80、-70、...)を右揃えの数で、上記とまったく同じ形式で印刷する必要があります

そして、コンソールに印刷するだけでいい

準備完了、ゴルフ!


プログラムは、ルーラーを作成する時間をどのように知っていますか?STDINの番号として提供されていますか?
PhiNotPi

はい、いつものように!
user2398029

1
定規は水平または垂直でなければなりませんか?水平方向の場合、最大80文字を想定できますか、それとも、ラップを回避するためにこれをファイルに出力しますか?または、stdoutに書き込むときにコンソール/端末のサイズを変更する必要がありますか?
ブレイザー

5
code-golfの主なポイントの1つは、問題を100%明確に指定する必要があることです(faqを参照)。創造性はコード自体にあるため、実際の出力には創造性の余地がほとんどありません。将来的には、質問を投稿する前にこれらの可能性のあるすべてのケースを検討してみてください。しかし、あなたが新しいので、私たちはあなたを助けています:)
mellamokb

3
コメントで指定されたルールを含めるようにチャレンジを編集してください。
-flesk

回答:


8

パイソン-227 232

仕様全体をサポート

編集:ジェネレータ式を改善しました。

右揃えの負の数値をサポートすると、驚くほどの量のコードが追加されます。

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]

サンプル出力:

-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

今日は動的言語に勝るものではありませんが、とにかく...

ハスケル、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

実際のASCII文字を、見栄えの良いユニコードボックス描画文字と交換する自由を取りました。

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

2
ルーラーは非常に素敵に見えます。
user2398029

3

Python 2.7、342 266 260文字

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

各行の文字列のタプルを返します。これを印刷またはファイルに保存できます(コンソールがjsutで折り返されているように見えるので、長さが70を超える場合は後者をお勧めします)

前提とyなるように文字列(raw_input()Nパイソン、またはsys.argvの[1]は、呼び出しを介してCMDしたい場合) 3.xの整数(例えば、2.xまたはINTに入力()と(入力()) )

これをより柔軟にするための関数にしました

編集:266文字に削減されました。タプルを返すのではなく、代わりに文字列を返します。引数として文字列ではなく整数を取ります

edit2:260文字に削減、単一行関数

注:負の数を処理しますが、正当化は行いません(とにかく正当化があまりにも重要であると本当に考えていません)


または、改行しないコンソール(Terminatorなど)を使用します。
counterclockwis回すのをやめ

@leftaroundaboutそのようなものが存在するかどうかはわかりませんでした
ブレイザー

かかわらず、単に(ファイルへの書き込みなど)をより普遍的である、として、誰もが使用できることを戻り値を作成定規seemsprettyの無意味、作るために別々のプラットフォームをインストールすること
ブレザー

@Blazer、シェルにはパイプとリダイレクトがありませんか?
ピーターテイラー

1

PowerShellの256の 253 233 225 222バイト

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]

オンラインでお試しください!

少ないゴルフ:

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

Python、291241文字

非常にシンプルなアプローチ。かなり改善できると確信しています。
コメントのガイドラインに従うことを試みましたが、負の数はサポートしていません(冗談でした、願っています)。
これはプログラムであり、定規を標準出力に出力します。画面が十分に広い場合、かなり長いルーラーをサポートする必要があります。

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"

あなたはこのオフのゴルフいくつかのより多くの文字をすることができ、私はここに12個の文字を削り取る
ゴードン・ベイリー

@GordonBaileyに感謝しますが、とにかくすでに勝者がいます。これは私のコードよりも短く、完全な仕様をサポートしています。
ugoren

0

C ++、392

これは、Windowsコンソールを使用してプログラムされているため、最大ルーラーサイズを70に選択しただけです。それよりも大きい場合はクラッシュします。負の数(最大-70)と0は正しく処理されます。

#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

パイソン-208

(右揃えの負数はサポートしていません)

 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"

私の好きなトリックは、必要以上に長い文字列を生成し、それらを切り捨てることだと思います、例えば:

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

左揃えにもっと簡潔な文字列書式設定オプションがあればいいのにと思っています(知らないものがない限り)


0

Perlの5.14、198の 224文字

おそらくさらに短くすることができますが、最初の 2番目の試みは次のとおりです(読みやすくするために改行が挿入されています)。

$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

編集:入力が「NaR」で死ぬように編集され、0負の範囲をサポートします。

EDIT2:私はこれに取り組む機会がありませんでしたが、負の数の規則に右揃えされていることに気付いただけです、私のコードはサポートしていませんので、締め切りに達しました。


@louism:私の答えはすべてのルールに適合していません。可能であれば、別の答えを選択する必要があります。
-flesk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.