นับแท่ง; นับไม้เท้าของคุณ


9

พื้นหลังบางส่วน

แท่งนับเป็นแท่งขนาดเล็ก (ยาว 3-14 ซม.) ที่นักคณิตศาสตร์ใช้ในวัฒนธรรมเอเชียมานานกว่า 2000 ปีเพื่อใช้แทนจำนวนหรือเศษส่วนทั้งหมด (ใน chqllenge นี้เราจะมุ่งเน้นไปที่จำนวนเต็มไม่ได้ลงนาม) นอกจากนี้ยังมีรุ่นที่เป็นลายลักษณ์อักษรที่เรียกว่าเลขก้าน

นี่คือวิธีการทำงาน:

(ถ้า ณ จุดใดก็ตามที่คุณสับสนให้ไปที่ตัวแทน ASCII ของแต่ละหลักและตัวอย่างบางส่วนที่ฉันได้รวมไว้ที่ด้านล่าง)

เลข Rod เป็นระบบตัวเลขตำแหน่งจริงโดยมีตัวเลขสำหรับ 1-9 และว่างเปล่าสำหรับ 0 ตัวเลขประกอบด้วยเส้นแนวนอนและแนวตั้ง ยิ่งบรรทัดมีจำนวนมากเท่าใด เมื่อคุณได้รับห้าที่ผ่านมาคุณวางเส้นแนวนอนด้านบนเพื่อเพิ่ม 5 ถึงจำนวนบรรทัดด้านล่าง เส้นแนวตั้งหนึ่งเส้นคือ 1 เส้นแนวตั้งสองเส้น 2 เส้นแนวตั้งห้าเส้นคือ 5 เส้นแนวตั้งหนึ่งเส้นที่มีเส้นแนวนอนด้านบนคือ 6 เส้นแนวตั้งสี่เส้นที่มีเส้นแนวนอนด้านบนคือ 9 (ตัวเลขสูงสุด)

แนวตั้ง 3 หลัก:

 ||| 
 ||| 
 ||| 
 ||| 
 ||| 

เพื่อให้การอ่านเลขแท่งง่ายขึ้นพวกเขาใช้เครื่องหมายที่แตกต่างกันสำหรับแต่ละหลักที่สลับกัน สัญกรณ์ที่สองสลับบทบาทของเส้นแนวนอนและแนวตั้ง ดังนั้น 3 จะถูกแสดงด้วยเส้นแนวนอนสามเส้นและ 8 โดยสามเส้นแนวนอนที่มีเส้นแนวตั้งอยู่ด้านบน

แนวนอน 8 หลัก:

  |  
  |  
__|__
_____
_____

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

ความท้าทาย

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

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

ทุกหลักจะถูกแทนด้วยตัวอักษร 5x5 ascii และคั่นด้วยสอง collumns จาก 5 ช่องว่าง การแสดงที่แน่นอนที่คุณจะใช้สำหรับแต่ละหลักมีดังนี้:

space between two digits (two colums):





0 digit, both vertical and horizontal (five columns):






1 digit, vertical:
  |  
  |  
  |  
  |  
  |  

2 digit, vertical:  
 | | 
 | | 
 | | 
 | | 
 | | 

3 digit, vertical:
 ||| 
 ||| 
 ||| 
 ||| 
 ||| 

4 digit, vertical:
|| ||
|| ||
|| ||
|| ||
|| ||

5 digit, vertical:
|||||
|||||
|||||
|||||
|||||

6 digit, vertical:
_____
  |  
  |  
  |  
  |  

7 digit, vertical:
_____
 | | 
 | | 
 | | 
 | | 

8 digit, vertical:
_____
 ||| 
 ||| 
 ||| 
 ||| 

9 digit, vertical:
_____
|| ||
|| ||
|| ||
|| ||

1 digit, horizontal:




_____

2 digit, horizontal:



_____
_____

3 digit, horizontal:


_____
_____
_____

4 digit, horizontal:

_____
_____
_____
_____

5 digit, horizontal:
_____
_____
_____
_____
_____

6 digit, horizontal:
  |  
  |  
  |  
  |  
__|__

7 digit, horizontal:
  |  
  |  
  |  
__|__
_____

8 digit, horizontal:
  |  
  |  
__|__
_____
_____

9 digit, horizontal:
  |  
__|__
_____
_____
_____

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

ช่องโหว่มาตรฐานใช้

ตัวอย่างผลลัพธ์

บรรทัดที่ขึ้นต้นด้วย>จะถูกตีความเป็นอินพุต

>12
        | | 
        | | 
        | | 
        | | 
_____   | | 

>8037
  |                  _____
  |                   | | 
__|__         _____   | | 
_____         _____   | | 
_____         _____   | | 

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       

โดย "ช่องว่างต่อท้าย" คุณหมายถึงเฉพาะผู้ที่ผ่านมาที่กล่องขอบเขตของหลักสุดท้ายหรือท้ายที่สุดของหลักสุดท้ายหรือไม่
John Dvorak

@JanDvorak เฉพาะผู้ที่ผ่านกล่องขอบเขตของหลักสุดท้าย หากจำเป็นต้องใช้ช่องว่าง trailig เพื่อแสดงขอบเขตทั้งหมดของตัวเลขพวกเขาจำเป็นต้องใช้
overactor

เมื่อดูตัวอย่างแล้วห้ามเว้นวรรคนำหน้าด้วย ที่พวกเขา?
edc65

@ edc65 ใช่ขอบคุณสำหรับการชี้ให้เห็นว่า
overactor

คำตอบ:


3

Python 2 - 216

นัดแรกของฉันอาจมีบางอย่างที่จะนำออกมา แต่สมองของฉันเจ็บปวดดังนั้นจึงดีพอสำหรับตอนนี้

x=raw_input()
for l in range(5):print'  '.join((' '*7+'|   | |  ||| || '+'|'*7+'__|'+'_'*7)[[7*(4-l<n%6+n/6)+(n>5)*(l<10-n)-(l==10-n),n%6+n/6+(l<1)*(n>5)*(12-n)][(len(x)-i)%2]*5:][:5]for i,n in enumerate(map(int,x)))

2

JavaScript (ES6) 223

ฟังก์ชั่นที่มีพารามิเตอร์ตัวเลขส่งออกไปยังคอนโซล NB หากพารามิเตอร์อินพุตอาจเป็นสตริงรหัสจะสั้นลง 5 อักขระและไม่มีการ จำกัด จำนวน 17 หลักที่สำคัญของตัวเลข JS

F=n=>{
  for(r=s='',n+=s;r<5;r++,s+=q)
    for(f=q='\n',p=n.length;f=!f,p--;q=(p?'  ':'')+'     1  |  1 | | 1 ||| 1|| ||1|||||1_____1__|__'.split(1)[d]+q)
      if(d=~~n[p])e=d+r,d=d>5?f?e<10?1:e>10?6:7:r?d-5:6:f?e>4?6:0:d;
  console.log(s)
}

ทดสอบ

ทดสอบในคอนโซล Firefox

F(12)

เอาท์พุต

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

เอาท์พุต

  |                  _____
  |                   | | 
__|__         _____   | | 
_____         _____   | | 
_____         _____   | | 

F(950)

เอาท์พุต

_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       

Ungolfed

F=n=>{
  z='     1  |  1 | | 1 ||| 1|| ||1|||||1_____1__|__'.split(1);
  s='';
  n+=s;

  for (r = 0; r < 5; r++)
  {
    for(q='\n',f=1,p=n.length;f=!f,p--;)
    {
      d = ~~n[p];
      if (d)
      {
        e=d+r;
        if (d > 5)
        {
          if (f)
          {
            d = e < 10 ? 1 : e >10 ? 6 : 7;
          }
          else
          {
            d = r ? d-5 : 6;
          }
        }
        else
        {
          if (f)
            d = e > 4 ? 6 : 0;
        }
      }
      q = (p ? '  ' : '') + z[d] + q;
    }
    s+=q
  }

  console.log(s)
}

1

PowerShellขนาด 229 ไบต์

$n="$args"
0..4|%{$l=$_;$h=$n.Length%2
($n|% t*y|%{(' '*7+'|   | |  ||| || '+'|'*7+'_'*7+'|__')|% S*g(5*(('0123456666'+'0123451234'*4+'00000611110000661117000666117600666617660666667666')[50*($h=!$h)+10*$l+"$_"]-48))5})-join'  '}

ลองออนไลน์!

ที่สตริงนี้มีตัวเลขหลัก:

# 0       1       2       3       4       5       6       7
# '     '.'  |  ',' | | ',' ||| ','|| ||','|||||','_____','__|__'

แท่งแนวตั้ง:

"       |   | |  ||| || |||||||____________________"+   # 0123456666
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"    # 0123451234

แท่งแนวนอน:

"                         _____  |    |    |    |  "+   # 0000061111
"                    __________  |    |    |  __|__"+   # 0000661117
"               _______________  |    |  __|_______"+   # 0006661176
"          ____________________  |  __|____________"+   # 0066661766
"     ___________________________|_________________"    # 0666667666

สคริปต์ที่ไม่ได้ควบคุม:

$digits=' '*7+'|   | |  ||| || '+'|'*7+'_'*7+'|__'
$positions = '0123456666'+'0123451234'*4+'00000611110000661117000666117600666617660666667666'

$n="$args"
0..4|%{
    $line=$_
    $horizontal=$n.Length%2
    $chunks=$n|% toCharArray|%{
        $horizontal=!$horizontal
        $startFrom = 5*($positions[50*$horizontal+10*$line+"$_"]-48)
        $digits|% Substring $startFrom 5
    }
    $chunks-join'  '
}


อะไรคือ 'วิธีใด' ในกฎการเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบที่ใช้ค่าจำนวนเต็มเป็นอินพุตในทางใดทางหนึ่ง ? ฉันไม่กล้าตีความ 'จำนวนเต็ม' เป็น 'สตริง' :)
mazzy

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