ร้อยสี่เหลี่ยม!


10

กลับไปสู่พื้นฐาน ...

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

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

ความท้าทาย

เอาท์พุทสี่เหลี่ยมจตุรัสถึง stdout หรือเทียบเท่าโดยใช้รหัส ansi-escapeเพื่อแรเงาเป็นตัวเลขซึ่งเป็นทวีคูณของอินพุต

  • เอาท์พุทกริด 10x10 ที่มีตัวเลข 1-100
    • ไม่สำคัญว่าจะมีการจัดตำแหน่งตัวเลข 2 หลักในแต่ละช่องตราบใดที่สอดคล้องกัน
    • สำหรับตัวเลข 1 หลักคุณสามารถเลื่อนเป็น 2 หลักและใช้การจัดรูปแบบเดียวกับตัวเลข 2 หลักหรืออยู่กึ่งกลางของกล่อง
  • หากตัวเลขในกล่องเป็นค่าที่ป้อนหลายค่าให้ใส่สีแดงทั้งช่อง
    • นี่หมายความว่าทั้งกล่องไม่ใช่แค่ส่วนที่เป็นตัวเลข

ตัวอย่างเช่นเมื่อได้รับการป้อนข้อมูล3ให้พิมพ์ร้อยตารางที่กำหนด

ร้อยตาราง 3

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


2
เราสามารถพิมพ์ 01 แทน 1 02 สำหรับ 2 เป็นต้นและอื่น ๆ ได้
ไหม

1
ดังนั้นฉันไม่สามารถใช้<table>เช่น
nicael

1
สีของตัวเลขมีความสำคัญหรือไม่? ก็สามารถwhiteหรือgrey?
Bassdrop Cumberwubwubwub

1
@Keatinge ฉันยังไม่ได้ตัดสินใจ - ฉันเข้าหาใช่ @ nicael ไม่ต้องใช้ ansi-escapes หรือคำตอบจะไม่อยู่ในสนามเด็กเล่นเดียวกัน @BassdropCumberwubwubwub คุณอาจใช้สีที่แตกต่างกัน กำลังใช้cursesมันไม่สำคัญ - สีแดงสั้นอยู่แล้ว
บลู

@Keatinge ใช่คุณอาจใช้ช่องว่างภายใน - แต่มีเลขศูนย์และตัวเลขหนึ่งหลักเท่านั้นเท่านั้น
Blue

คำตอบ:


8

Python 2, 166 ไบต์

R=range;n=input()
for y in R(21):print''.join('♥[%dm%s♥[m'%(any(5>x-k%10*4>-1<y-k/10*2<3for k in R(n-1,100,n))*41,('+---|%2d '%(x/4+y*5-4))[y%2*4+x%4])for x in R(41))

แทนที่ด้วยเลขฐานแปด033(ตัวอักษร ANSI ยกเว้น)

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย

เราปฏิบัติต่อผลลัพธ์เป็น41×21กริดและคำนวณอักขระและสีโดยตรงในแต่ละจุด

นั่นคือโครงสร้างของรหัสคือ:

n = input()
for y in range(21):
    print ''.join(F(x, y) for x in range(41))

Fสำหรับฟังก์ชั่นบางอย่าง

ผลลัพธ์ของFฟอร์มต่อไปนี้เสมอ:

เราใช้สตริงรูปแบบ'\33[%dm%s\33[m'โดยที่ตัวแรก%dคือ 0 หรือ 41 และ%sตัวอักษรที่เราต้องการพิมพ์


สำหรับสีเรามีสูตรดังต่อไปนี้:

any(5>x-k%10*4>-1<y-k/10*2<3for k in R(n-1,100,n))*41

ฉันจะไม่อธิบายเรื่องนี้อย่างเต็มที่ แต่โดยทั่วไปแล้วมันจะวนซ้ำไปมาทุกรูปสี่เหลี่ยมที่ควรจะเป็นสีแดงและตรวจสอบว่า(x, y)อยู่ในรูปใด

หมายเหตุการใช้ของผู้ประกอบการผูกมัด: ผมเขียนลงใน-1<A<5 and -1<B<35>A>-1<B<3


สำหรับตัวละครเรามีสูตรดังต่อไปนี้:

('+---|%2d '%(x/4+y*5-4))[y%2*4+x%4]

ถ้าy % 2 == 0เป็นx = 0, 1, …เช่นนี้จะสร้าง+---+---+---…

ถ้าy % 2 == 1เป็นx = 0, 1, …เช่นนี้จะสร้าง| p |p+1|p+2…


2
วันหนึ่งมีความท้าทายที่คุณจำเป็นต้องใช้ตัวอักษร♥ในรหัสและทุกคนจะสับสน;)
FryAmTheEggman

ชอบที่จะเห็นคำอธิบาย
shaunakde

@ Shaunakde ฉันเขียนอะไรบางอย่างขึ้นมา (แต่บันทึกบางไบต์ในกระบวนการดังนั้นบางทีมันอาจจะยากขึ้นเล็กน้อยในการติดตาม… ^^)
ลินน์

1
@Lynn ขอบคุณมากที่สละเวลาและพลังงานเพื่ออธิบายรหัสนี้ ฉันขอบคุณมากสำหรับคำอธิบายนี้ มันช่วยให้ฉันเรียนรู้มากมาย!
shaunakde

1
คุณยินดีอย่างมาก! :)
ลินน์

4

Julia, 219 182 169 167 ไบต์

!n=(~j=j%n<1;k(v=j->"---",c=+,s="$c\e[m";l=~)=println([(l(j)?"\e[;;41m$c":s)v(j)for j=10i+(1:10)]...,s);i=0;k();for i=0:9 k(j->lpad(j,3),|);k(l=j->~j|~(j+10(i<9)))end)

ใช้แบบนี้: !7

Ungolfed:

function !(n::Integer)
     for j=(1:10)     #This loop generates the top of the box
       if (j%n==0)
         print("\e[;;41m+---") #"\e[;;41m" is the ANSI escape code
                               #for red background colour in Julia
       else
         print("+\e[m---")     #"\e[m" resets to original colours
       end
     end
     println("+\e[m")
     for i=0:9
       for j=10i+(1:10)  #This loop generates the rows with the numbers
         if (j%n==0)
           print("\e[;;41m|",lpad(j,3))
         else
           print("|\e[m",lpad(j,3))
         end
       end
       println("|\e[m")
       for j=10i+(1:10)  #This loop generates the other rows
         if (j%n==0)||((j+10)%n==0&&i<9)
           print("\e[;;41m+---")
         else
           print("+\e[m---")
         end
       end
       println("+\e[m")
     end
   end

โปรดทราบว่านี่เป็นสิ่งที่ไม่ดีมากสำหรับการอ่านสูงสุด


0

HTML + Javascript, 379

HTML:

<input id=a value=3><pre id=z>

javascript:

for(i=0,s=`\n|`,o='+';i++<109;x=i<10?` ${i} `:i-100?' '+i:i,s+=x+'|',o+=x='---+',i%10||(o+=s+'\n+',s=`\n|`));z.innerHTML=[...o+x].map((x,i)=>`<span id=i${i}>${x}</span>`).join``;f=m=>window['i'+m].style.background='red';for(j=k=+a.value;j<=100;j+=k){p=(j/10|0)*84+((m=j%10)?(m-1)*4:-48);'000102030442434445468485868788'.match(/../g).map(x=>f(+x+p))}

jsfiddle

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