ตัวเลขขนาดเท่าไหร่


13

ตัวเลข 7 ส่วนสามารถแสดงใน ASCII โดยใช้_|ตัวอักษร นี่คือ1ตัวเลขขนาด:

   _  _       _   _   _   _   _   _ 
|  _| _| |_| |_  |_    | |_| |_| | |
| |_  _|   |  _| |_|   | |_|  _| |_|

ขนาดที่ใหญ่กว่านั้นเกิดขึ้นจากการทำให้แต่ละส่วนยาวขึ้นตามสัดส่วน นี่คือตัวเลข 3 หลัก

 ___    ___    ___    ___    ___    ___    ___ 
|   |  |          |  |          |  |   |  |   |
|   |  |          |  |          |  |   |  |   |
|___|  |___       |  |___    ___|  |   |  |___|
|   |  |   |      |      |      |  |   |      |
|   |  |   |      |      |      |  |   |      |
|___|  |___|      |   ___|   ___|  |___|   ___|

เป้าหมาย

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

นี่คือโค้ดกอล์ฟซึ่งมีจำนวนไบต์น้อยที่สุดเป็นผู้ชนะ

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นซึ่งสามารถรับตัวเลขไม่ว่าจะเป็น STDIN หรืออาร์กิวเมนต์และพิมพ์ / คืนค่า

ตัวเลขจะถูกจัดเป็นสตริงแบบหลายบรรทัดซึ่งมีพื้นที่ว่างตามท้ายจำนวนน้อยที่สุดเพื่อให้เป็นสี่เหลี่ยมผืนผ้าที่สมบูรณ์แบบ ขึ้นบรรทัดใหม่เป็นส่วนเสริมของอินพุต จะไม่มีช่องว่างนำหน้าที่ไม่จำเป็น

เมื่อตัวเลขที่ไม่ใช่ตัวเลขถูกส่งผ่านก็จะยังคงประกอบด้วย_|ตัวอักษรเบาะสี่เหลี่ยมและไม่มีช่องว่างนำที่ไม่จำเป็น จะไม่มีบรรทัดว่างเปล่า คุณไม่ต้องจัดการกับอินพุตว่าง

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

Nนี่เป็นคำแนะนำที่มีประโยชน์สำหรับความกว้างและความสูงของแต่ละบาทสำหรับขนาดที่กำหนด

Digit  Height  Width (not counting newlines)
1      2N      1
2      2N+1    N+2
3      2N+1    N+1
4      2N      N+2
5      2N+1    N+2
6      2N+1    N+2
7      2N+1    N+1
8      2N+1    N+2
9      2N+1    N+2
0      2N+1    N+2

ตัวอย่าง I / O

ใน:

__ 
  |
__|
  |
__|

ออก:

2

ใน:

|
|
|

ออก:

0  //because it is of an invalid height.  Either 1 char too short or tall.

ใน:

|    |
|    |
|    |
|____|
     |
     |
     |
     |

ออก:

4

ใน:

 ___ 
|    
|___ 
|   |
|___|

ออก:

0 //1 char too wide

ใน:

 _ 
|_|
| |

ออก:

0 //it's not a digit

ใน:

 __ 
|   
|__ 
   |
 __|

ออก:

2

ใน:

 _  _ 
 _| _|
|_  _|

ออก:

0  //both would be valid individually, but input should be a *single* digit

ใน:

 _ 
|_|
|_|

ออก:

1

ใน:

|
|

ออก:

1

ใน:

__|_
 |  
 _ |
  _ 
|__ 

ออก:

0

นี่เป็นค่าประมาณการผกผันของการแปลงตัวเลขเป็นรูปแบบการแสดงผล 7 ส่วนจาก 3 ปีย้อนหลัง


@ สตีฟเวอร์ริลล์มีขนาดไม่ใหญ่จริง ๆ0ใช่ไหม? ถ้าคุณไม่ได้คิดวิธีการวาด
PhiNotPi

8
มันจะง่ายอย่างไม่น่าเชื่อถ้าไม่ใช่เพราะกฎนั้นจะต้องเป็นตัวเลขที่ถูกต้อง ...
ETHproductions

@ ETHproductions ฉันรู้
PhiNotPi

@ETHproductions หากไม่มีข้อกำหนดดังกล่าวก็คงจะเป็นรหัสซ้ำของcodegolf.stackexchange.com/q/19548/15599
Level River St

คำตอบ:


1

ทับทิม, 250

->x{d=y=0
x.size.downto(0){|n|y=n
a=["|
"*2*n]
"XNRDqpm@A".bytes{|z|p=[?|,' ','']
h=s=""
(n*2).times{|i|
i%n<1&&(d=z>>i/n*3&7)&&h=[?_,' '][d/3%2]*n
s=p[d%3]+h+p[d/6]+"
"+s
h=' '*n}
z!=68&&s=' '*(1-d%3/2)+?_*n+" 
"+s
a<<s};puts a
a.index(x)&&break}
y}

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

ฉันสร้างตัวเลขแต่ละหลักขึ้นจากล่างขึ้นบนใน 2 แบ่งเท่า ๆ กันบวกบรรทัดบนสุด แม้ว่าจะมี 12 ความเป็นไปได้ (พิจารณาว่าส่วนด้านซ้ายสามารถจะอยู่นอกหรือในกรณีของ3และ7ขาดอย่างสมบูรณ์) เพียง 7 เป็นจริงในปัจจุบันและทางเลือกอย่างระมัดระวังของการเข้ารหัสช่วยให้ข้อมูลทั้งหมด (ยกเว้นบรรทัดด้านบน) ที่จะเข้ารหัสเป็น ตัวอักษรเดียว

ตัวเลข1ไม่ตรงกับรูปแบบและจัดการแยกต่างหากถูกใช้เพื่อเริ่มต้นอาร์เรย์

Ungolfed ในโปรแกรมทดสอบ

รุ่นนี้ใช้.แทนช่องว่างด้วยเหตุผลการวินิจฉัย

#Encoding used for half-digits (radix 3,2,2 most significant digit at right)

#000    |_|  0

#100    ._|  1  . = space

#200    X_|  2  X = no space (for digits 3 and 7)  

#010    |.|  3

#110    ..|  4

#210    X.|  5

#001    |_.  6


f=->x{d=y=0                                        #d and y required to be intialized for scoping reasons
  x.size.downto(0){|n|y=n                          #Assume max possible size of character = length of input and iterate down through all possible sizes n   
    a=["|\n"*2*n]                                  #Make an array containing the digit 1 (different shape to others)
    "XNRDqpm@A".bytes{|z|                          #Each character encodes the pattern for a digit. Iterate through them
      p=['|','.','']                               #Possible components for left and right of digit
      h=s=""                                       #h initialized for scoping reasons. s will contain the digit string 
      (n*2).times{|i|                              #For each row
        i%n<1&&                                    #If i%n==1 we are at the bottom of a half digit
        (d=z>>i/n*3&7)&&                           #so extract info from z and store in d
        h=[?_,'.'][d/3%2]*n                        #h is the horizontal part of the half digit, either _ or spaces 
        s=p[d%3]+h+p[d/6]+"\n"+s                   #Build one row of digit, working upwards: left,middle,right
        h='.'*n                                    #If row i%n!=0 (not bottom row of half digit)the middle section must contain spaces
      }                                            #We now have both halves of the digit, only the top segment missing 
      z!=68&&s='.'*(1-d%3/2)+?_*n+".\n"+s          #If z!=68 (digit 4) add a top to the digit, with appropriate leading and trailing spaces        
      a<<s                                         #Add the completed digit of size n to a
    }
    #puts a                                        #Diagnostic: uncomment to print all the strings checked
    a.index(x)&&break                              #If string x is in a, break

  }
y                                                  #and return last value of n 
}


# digit 7, size 2. Trailing newline required. Outputs 2
puts f[
"__.
..|
..|
..|
..|
"]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.