Menghitung batang; hitung batangmu


9

Beberapa latar belakang

Batang penghitung adalah batang kecil (panjang 3-14 cm) yang digunakan oleh matematikawan dari banyak budaya Asia selama lebih dari 2000 tahun untuk mewakili bilangan atau fraksi utuh. (Dalam chqllenge ini kita akan fokus pada bilangan bulat yang tidak ditandai) Ada juga versi tertulis, yang disebut angka batang.

Begini cara kerjanya:

(Jika suatu saat Anda bingung, periksalah representasi ascii dari setiap digit dan beberapa contoh yang saya sertakan di bagian bawah)

Angka batang adalah sistem angka posisi yang benar dengan digit untuk 1-9 dan kosong untuk 0. Digit terdiri dari garis horizontal dan vertikal; semakin banyak garis, semakin tinggi angkanya. Setelah Anda melewati lima, Anda meletakkan garis horizontal di atas untuk menambahkan 5 ke jumlah baris di bawah ini. Satu garis vertikal adalah 1, dua garis vertikal 2, lima garis vertikal 5, satu garis vertikal dengan garis horizontal di atas adalah 6, empat garis vertikal dengan garis horizontal di atas adalah 9 (angka tertinggi).

3 digit vertikal:

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

Untuk membuat angka batang baca lebih mudah, mereka menggunakan notasi yang berbeda untuk setiap digit bolak-balik. Notasi kedua menukar peran garis horizontal dan vertikal. sehingga 3 diwakili oleh tiga garis horizontal dan 8 oleh tiga garis horizontal dengan garis vertikal di atas.

8 digit horizontal:

  |  
  |  
__|__
_____
_____

Mengetahui notasi mana yang digunakan adalah mudah, seperti yang dikatakan sebelumnya, tehy digunakan secara bergantian dan Sun Tzu menulis bahwa "satu adalah vertikal, sepuluh adalah horisontal". Jadi digit paling kanan adalah vertikal dan kami berganti dari sana.

Tantangan

Batang ini digunakan untuk mewakili bilangan dan fraksi negatif (seperti yang dijelaskan dalam artikel wikipedia tentang mereka . Untuk tujuan tantangan ini kita hanya akan fokus pada bilangan bulat positif. Tujuannya sederhana:

Tulis fungsi atau program lengkap yang mengambil nilai integer sebagai input dengan cara apa pun dan mencetak representasi bilangan batang dari integer ini ke STDOUT (Anda juga dapat menulis ke file jika itu berfungsi lebih baik). Kode terpendek dalam byte menang.

Setiap digit akan diwakili oleh karakter ascii 5x5 dan dipisahkan oleh dua kolom 5 ruang. Representasi persis yang akan Anda gunakan untuk setiap digit adalah sebagai berikut:

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:
  |  
__|__
_____
_____
_____

Angka-angka harus dicetak bersebelahan. Spasi di luar kotak pembatas dari digit terakhir tidak diperbolehkan. Dibutuhkan spasi tambahan untuk melengkapi kotak pembatas dari digit terakhir. Anda harus mengakhiri output dengan satu baris baru. Ruang terkemuka yang bukan milik kotak pembatas dari digit pertama juga dilarang.

Celah standar berlaku.

Contoh output

Baris yang dimulai dengan >harus ditafsirkan sebagai input.

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

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

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

dengan "spasi tambahan", maksud Anda hanya yang melewati kotak pembatas dari digit terakhir, atau juga yang di akhir digit terakhir?
John Dvorak

@JanDvorak hanya yang melewati kotak pembatas dari digit terakhir. Jika ruang jejak diperlukan untuk mewakili seluruh kotak pembatas digit, mereka diperlukan.
overactor

Melihat contoh-contoh, ruang terkemuka juga dilarang. Apakah mereka?
edc65

@ edc65 ya, terima kasih sudah menunjukkannya.
overactor

Jawaban:


3

Python 2 - 216

Tembakan pertamaku, mungkin beberapa hal untuk diambil, tapi otakku sakit, jadi itu cukup baik untuk saat ini

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

Berfungsi dengan parameter numerik, keluaran ke konsol. NB Jika parameter input bisa berupa string, kode akan lebih pendek 5 karakter dan tanpa batas 17 digit angka JS yang signifikan.

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)
}

Uji

Tes di konsol Firefox.

F(12)

Keluaran

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Keluaran

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

F(950)

Keluaran

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

Tidak disatukan

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 byte

$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'  '}

Cobalah online!

Di mana string ini menampilkan digit:

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

batang vertikal:

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

batang horisontal:

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

Skrip yang belum dibuka:

$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'  '
}


Apa 'cara apa pun' dalam aturan Tulis fungsi atau program lengkap yang mengambil nilai integer sebagai input dengan cara apa pun ? Saya tidak berani menafsirkan 'bilangan bulat' sebagai 'string'. :)
mazzy

Ya, ini agak kabur dan mungkin bukan yang dimaksudkan OP tetapi saya pikir saya akan menunjukkan golf yang mudah.
Veskah
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.