Çubuk sayma; çubuklarını say


9

Bazı arka plan

Sayma çubukları , birçok Asya kültüründen matematikçiler tarafından 2000 yılı aşkın bir süredir herhangi bir tam sayı veya kesiri temsil etmek için kullanılan küçük çubuklardır (3-14 cm uzunluğunda). (Bu meydan okumada imzasız tamsayılara odaklanacağız) Çubuk rakamları adı verilen yazılı bir versiyon da vardı.

Şöyle çalışır:

(Herhangi bir noktada kafanız karışırsa, her basamağın ascii temsilini ve altta eklediğim bazı örnekleri inceleyin)

Çubuk rakamları, 1-9 için rakamlar ve 0 için boş olan gerçek bir konumsal sayısal sistemdir. Rakamlar yatay ve dikey çizgilerden oluşur; daha fazla satır, basamak o kadar yüksek olur. Beşi geçtikten sonra, aşağıdaki satır sayısına 5 eklemek için üstüne yatay bir çizgi koyarsınız. Bir dikey çizgi 1, iki dikey çizgi 2, beş dikey çizgi 5, bir yatay çizgi üstte bir dikey çizgi 6, yatay bir çizgi üstte dört dikey çizgi 9'dur (en yüksek basamak).

Dikey 3 basamaklı:

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

Bununla birlikte, okuma çubuğu sayılarını kolaylaştırmak için, her bir alternatif basamak için farklı gösterimler kullandılar. İkinci gösterim yatay ve dikey çizgilerin rolünü değiştirir. böylece 3, üç yatay çizgi ve 8 x üç yatay çizgi ile üstte dikey bir çizgiyle temsil edilir.

Yatay 8 basamaklı:

  |  
  |  
__|__
_____
_____

Daha önce de belirtildiği gibi hangi notasyonu kullanmanın kolay olduğunu bilerek, dönüşümlü olarak kullanılır ve Sun Tzu "biri dikey, on yataydır" yazdı. Yani en sağdaki rakam dikeydir ve biz oradan sırayla geçeriz.

Meydan okuma

Bu çubuklar negatif sayıları ve kesirleri temsil etmek için kullanıldı ( wikipedia makalesinde açıklandığı gibi . Bu zorluğun amacı için sadece pozitif tamsayılara odaklanacağız. Amaç basit:

Herhangi bir şekilde bir tamsayı değeri girdi olarak alan ve bu tamsayının çubuk sayısal gösterimini STDOUT'a yazdıran bir işlev veya tam program yazın (daha iyi sonuç verirse bir dosyaya da yazabilirsiniz). Bayt cinsinden en kısa kod kazanır.

Her rakam 5x5 ascii karakteriyle temsil edilecek ve 5 boşluklu iki kolla ayrılacaktır. Her basamak için kullanacağınız tam gösterim aşağıdaki gibidir:

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

Rakamlar yan yana yazdırılacaktır. Son basamağın sınırlayıcı kutusunun ötesindeki sondaki boşluklara izin verilmez. Son basamak (lar) ın sınırlayıcı kutusunu tamamlamak için arka boşluklar gereklidir. Çıktıyı tek bir satırsonu ile sonlandırmalısınız. İlk rakamın sınırlayıcı kutusuna ait olmayan boşluklar da yasaktır.

Standart boşluklar geçerlidir.

Örnek çıktı

İle başlayan satırlar >girdi olarak yorumlanmalıdır.

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

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

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

"sondaki boşluklar" ile mi, sadece son basamağın sınırlayıcı kutusunu geçmiş olanları mı yoksa son basamağın sonunda olanları mı kastediyorsunuz?
John Dvorak

@ JanDvorak sadece son basamağın sınırlayıcı kutusunu geçmiş olanlar. Bir basamağın tüm sınırlayıcı kutusunu temsil etmek için trailig boşluklarına ihtiyaç duyulursa, bunlar gereklidir.
overactor

Örneklere bakıldığında, önde gelen alanlar da yasaktır. Öyle mi?
edc65

@ edc65 evet, belirttiğiniz için teşekkürler.
overactor

Yanıtlar:


3

Python 2-216

İlk atışım, çıkarılması gereken şeyler olabilir, ama beynim ağrıyor, bu yüzden şimdilik yeterince iyi

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

Sayısal parametre ile fonksiyon, konsola çıktı. Not: Girdi parametresi bir dize olabilirse, kod 5 karakterden daha kısa ve JS sayılarının 17 anlamlı basamağı sınırı olmadan olur.

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

Ölçek

Firefox konsolunda test edin.

F(12)

Çıktı

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Çıktı

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

F(950)

Çıktı

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

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 bayt

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

Çevrimiçi deneyin!

Bu dizenin rakamları gösterdiği yer:

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

dikey çubuklar:

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

yatay çubuklar:

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

Kaydedilmemiş komut dosyası:

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


Kuraldaki 'herhangi bir yol' nedir Herhangi bir şekilde tamsayı değerini girdi olarak alan bir işlev veya tam program yazın ? 'Bir tamsayıyı' bir dize olarak yorumlamaya cesaret edemedim. :)
mazzy

Evet, biraz belirsiz ve muhtemelen OP amaçlanan değil ama kolay golf işaret olacağını düşündüm.
Veskah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.