การสร้างไม้บรรทัด ASCII


11

ความท้าทายคือการสร้างไม้บรรทัดนับอักขระ ASCII ในรูปแบบต่อไปนี้:

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

ความยาวของไม้บรรทัดควรปรับได้ตามความหลากหลายของ 10

กฎ:

  • ไม้บรรทัดต้องเป็นแนวนอน
  • สมมติว่าเพื่อให้สิ่งที่เรียบง่ายว่าการทำงานของผู้ปกครองต้องจนกว่าเครื่องหมาย 1000 ตัวเลขทั้งหมดซ้ายชิดพื้นที่หนึ่งหลังจากตัวเลขสุดท้าย
  • การขอไม้บรรทัดที่มีความยาวเป็นศูนย์ควรพิมพ์ NaR
  • ตัวเลขติดลบควรพิมพ์ไม้บรรทัดที่กลับด้าน (-90, -80, -70, ... ) ด้วยตัวเลขที่จัดชิดขวาในรูปแบบเดียวกับที่อยู่ด้านบน

และเพียงพิมพ์ไปที่คอนโซลก็โอเค

พร้อมตั้งกอล์ฟ!


โปรแกรมรู้ระยะเวลาในการสร้างไม้บรรทัดอย่างไร มันให้เป็นตัวเลขใน STDIN หรือไม่?
PhiNotPi

ใช่ตามปกติฉันเดา!
2398029

1
ไม้บรรทัดต้องเป็นแนวนอนหรือแนวตั้งหรือไม่? หากเป็นแนวนอนเราสามารถสมมติได้สูงสุด 80 อักขระหรือไม่หรือเราจะเอาท์พุทนี้ไปที่ไฟล์เพื่อหลีกเลี่ยงการตัดคำแทน? หรือเราต้องปรับขนาดคอนโซล / เทอร์มินัลเมื่อเขียนถึง stdout?
Blazer

5
หนึ่งในประเด็นหลักของ code-golf คือปัญหาจะต้องระบุอย่างไม่น่าสงสัย 100% (ดูคำถามที่พบบ่อย ) มีห้องเล็ก ๆ สำหรับความคิดสร้างสรรค์ในผลลัพธ์จริงเพราะความคิดสร้างสรรค์อยู่ในโค้ด ในอนาคตโปรดลองพิจารณาทุกกรณีที่เป็นไปได้ก่อนที่จะโพสต์คำถาม แต่เนื่องจากคุณใหม่เราจึงช่วยเหลือคุณ :)
mellamokb

3
คุณช่วยแก้ไขการท้าทายให้รวมกฎที่ระบุในความคิดเห็นได้หรือไม่?
flesk

คำตอบ:


8

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

วันนี้จะไม่เอาชนะภาษาแบบไดนามิก แต่อย่างไรก็ตาม ...

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

ฉันใช้เสรีภาพในการแลกเปลี่ยนอักขระ 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

ส่งกลับtuple ของสตริงแต่ละบรรทัดซึ่งคุณสามารถพิมพ์หรือบันทึกลงในไฟล์ได้ (ฉันชอบหลังที่มีความยาวมากกว่า 70 เพราะคอนโซลจะ jsut ทำให้ดูยุ่งเหยิงด้วยการตัดคำ)

สมมติyว่าเป็นสตริง (raw_input () n python หรือ sys.argv [1] หากคุณต้องการเรียกใช้ผ่าน cmd)จำนวนเต็ม (เช่นด้วยอินพุต () ใน 2.x หรือ int (input ()) ใน 3.x )

ฉันทำให้ฟังก์ชั่นนี้มีความยืดหยุ่นมากขึ้น

แก้ไข: ลดเหลือ 266 ตัวอักษร ไม่ส่งคืน tuple อีกต่อไป แต่เป็นสตริงแทน ตอนนี้ใช้จำนวนเต็มแทนสตริงเป็นอาร์กิวเมนต์

edit2: ลดเหลือ 260 ตัวอักษร, ฟังก์ชั่นบรรทัดเดียว

หมายเหตุ: จัดการกับจำนวนลบ แต่ไม่ถูกต้อง (ฉันไม่ได้คิดว่าการให้เหตุผลนั้นสำคัญเกินไป


หรือเพียงแค่ใช้คอนโซลที่ไม่ใช่การแบ่งบรรทัด (เช่นTerminator )
หยุดที่จะเปลี่ยนรหัสลับเมื่อ

@leftaroundabout ฉันไม่แน่ใจว่าสิ่งนั้นมีอยู่จริง
Blazer

ไม่ว่าจะต้องติดตั้งแพลตฟอร์มแยกต่างหากเพื่อให้ไม้บรรทัดดูไร้ประโยชน์โดยที่การสร้างค่าตอบแทนที่ทุกคนสามารถใช้ (เขียนไฟล์ ฯลฯ ) นั้นเป็นสากลมากขึ้น
Blazer

@Blazer เปลือกของคุณไม่มีท่อและเปลี่ยนเส้นทางหรือไม่?
Peter Taylor

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 291 241 ตัวอักษร

วิธีการที่ง่ายสวย ฉันแน่ใจว่ามันสามารถปรับปรุงได้ค่อนข้างมาก
ฉันพยายามทำตามคำแนะนำในความคิดเห็น แต่ฉันไม่สนับสนุนจำนวนลบ (มันเป็นเรื่องตลกฉันหวังว่า)
นี่คือโปรแกรมพิมพ์ไม้บรรทัดไปยังเอาต์พุตมาตรฐาน หากหน้าจอของคุณกว้างพอสมควรก็ควรรองรับไม้บรรทัดที่ยาวพอสมควร

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 ตัว
Gordon Bailey

ขอบคุณ @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

Python - 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 ตัวอักษร

อาจสั้นลงได้อีกมาก แต่นี่เป็นความพยายามครั้งที่สองครั้งแรก (โดยมีตัวแบ่งบรรทัดสำหรับการอ่าน):

$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และเพื่อสนับสนุนช่วงลบ

แก้ไข 2:ฉันไม่ได้มีโอกาสได้ทำงานมากขึ้นเกี่ยวกับเรื่องนี้และฉันเพิ่งสังเกตเห็นว่าถูกต้องสอดคล้องกับกฎจำนวนลบซึ่งรหัสของฉันไม่สนับสนุนดังนั้นฉันคิดว่าวิธีการแก้ปัญหาอื่นควรทำเครื่องหมายเป็นคำตอบถ้า ถึงกำหนดเวลาแล้ว


@louism: คำตอบของฉันไม่เป็นไปตามกฎทั้งหมด ควรเลือกคำตอบอื่นถ้าเป็นไปได้
flesk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.