ASCII 눈금자 생성


11

다음과 같은 형식으로 ASCII 문자 수 눈금자를 생성해야합니다.

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

눈금자의 길이는 10의 배수로 확장 가능해야합니다.

규칙 :

  • 눈금자는 수평이어야합니다.
  • 보다 간단하게하기 위해, 눈금자가 1000 표시까지 모든 숫자가 왼쪽 정렬 되고 마지막 숫자 다음에 한 칸 띄워 져야합니다 .
  • 길이가 0 인 눈금자를 요청하면 NaR이 인쇄됩니다.
  • 음수는 위와 정확히 같은 형식으로 오른쪽 정렬 된 숫자를 가진 반전 된 눈금자 (-90, -80, -70, ...)를 인쇄해야합니다.

그리고 콘솔로 인쇄하는 것만으로도 좋습니다

준비, 설정, 골프!


프로그램은 통치자를 얼마나 오래 만들 수 있는지 어떻게 알 수 있습니까? STDIN에 숫자로 제공됩니까?
PhiNotPi

예, 평소처럼 생각합니다!
user2398029 2019

1
눈금자가 수평 또는 수직이어야합니까? 가로이면 최대 80자를 사용할 수 있습니까? 대신 줄 바꿈을 피하기 위해 파일로 출력합니까? 또는 stdout에 쓸 때 콘솔 / 터미널의 크기를 조정해야합니까?
Blazer

5
code-golf의 주요 요점 중 하나는 문제를 100 % 명확하게 지정해야한다는 것입니다 ( faq 참조 ). 창의성은 코드 자체에 있기 때문에 실제 결과물에는 창의성을위한 여지가 거의 없습니다. 앞으로 질문을 게시하기 전에 가능한 모든 사례에 대해 생각해보십시오. 그러나 새로운
소식이 있으므로

3
의견에 지정된 규칙을 포함하도록 챌린지를 편집 할 수 있습니까?
flesk

답변:


8

파이썬 -227232

전체 사양 지원

편집 : 향상된 발전기 표현.

올바르게 정렬 된 음수를 지원하면 놀라운 양의 코드가 추가됩니다.

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

100150

+------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |   |
|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

파이썬 2.7, 342266260 문자

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

각 줄 문자열 의 튜플을 반환합니다.이 문자열을 인쇄하거나 파일로 저장할 수 있습니다 (콘솔이 줄 바꿈으로 엉망이되어 버릴 것이므로 길이가 70보다 길면 후자를 선호합니다)

가정 y문자열 (raw_input을 () N 파이썬 또는 sys.argv에 [1]을 통해 호출을 cmd 싶다면) 3.X 정수 (예 2.x 또는 INT의 입력 ()와 (입력 ()) )

이 기능을보다 유연하게 만들었습니다.

편집 : 266 자로 줄었습니다. 더 이상 튜플을 반환하지 않고 대신 문자열을 반환합니다. 이제 문자열 대신 정수를 인수로 사용합니다.

edit2 : 260 자로 줄었다, 한 줄 기능

참고 : 음수를 처리하지만 올바르게 정당화하지는 않습니다 (어쨌든 정당화가 너무 중요하지는 않습니다.


또는 줄 바꿈하지 않는 콘솔 (예 : Terminator )을 사용하십시오.
반 시계 회전을 중단

@leftaroundabout 나는 그런 것이 존재하는지 확신하지 못했습니다
Blazer

상관없이, 통치자를 만들기 위해 별도의 플랫폼을 설치해야하는 것은 무의미 해 보이지만, 누구나 사용할 수있는 반환 값 (파일에 쓰기 등)을 만드는 것이 더 보편적입니다.
Blazer

@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

펄 5.14, 198224 문자

아마도 훨씬 더 단축 될 수 있지만 다음은 번째 시도입니다 (가독성을 위해 줄 바꿈이 삽입 됨).

$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

편집 : 입력이 0음수 범위를 지원할 때 "NaR"로 죽도록 편집되었습니다 .

EDIT2 : 나는 이것에 대해 더 많은 일을 할 기회가 없었으며, 지금은 코드가 지원하지 않는 음수 규칙에 올바르게 정렬 된 것을 보았으므로 다른 해결책이 대답으로 표시되어야한다고 생각합니다. 마감일에 도달했습니다.


@louism : 내 대답이 모든 규칙을 준수하지는 않습니다. 가능하면 다른 답변을 선택해야합니다.
flesk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.