Bir çetele sergileyin (değişen bazlarda)


16

Tallies, temel 5'te çalışan basit bir sayma sistemidir. Dünyada kullanılan çeşitli farklı tally sistemleri vardır, ancak İngilizce konuşulan ülkelerin çoğunda kullanılan, dikey çizgileri işaretleyerek belki de en basit sayım birimleridir. her 5. işaret, önceki dört koleksiyondan yatay bir çizgi koydu. Bu, çetele işaretlerini 5 kişilik gruplar halinde kümeler (ve hızlı sayılmasını kolaylaştırır).

Belirli bir değere kadar çetele işaretleri görüntüleyen bir program yazacaksınız. Ancak, sadece 5. bazda konuşmak sıkıcıdır! Bu nedenle, programınız aynı zamanda farklı bazlarda taksitleri gösterebilmelidir.

Giriş

Giriş, virgülle ayrılmış bir veya iki negatif olmayan tamsayı değeri olacaktır (örn. 9Veya 8,4). İlk sayı çetelenin göstermesi gereken değerdir. İkinci değer taksitin temelidir. İkinci değer verilmezse, temel 5'i kullanın .

Çıktı

Çıktı ASCII art tally işaretleri olarak temsil edilen girilen değer olacaktır. İşte programınızı karşı test edebileceğiniz bazı örnekler - çıktılarınız bunlarla tam olarak eşleşmelidir!

Giriş: 12veya12,5

 | | | |   | | | |   | |
-+-+-+-+- -+-+-+-+-  | |
 | | | |   | | | |   | |

Giriş: 7,3

 | |   | |   |
-+-+- -+-+-  |
 | |   | |   |

Giriş: 4,2

 |   |
-+- -+-
 |   |

Girdi: 6,1veya 6,10(önde gelen boşluklara dikkat edin)

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

Ayrıca taban 1'in tutarsız olarak tasarlandığına dikkat edin - yalnızca dikey çizgiler kullanılmalıdır.

Girilen değerlerden herhangi biri 0 ise, hiçbir çıkış olmamalıdır (ve programınız düzgün bir şekilde sona ermelidir).

kurallar

  • Bu , bu yüzden (bayt cinsinden) en kısa doğru uygulama kazanır.
  • Giriş / çıkış herhangi bir uygun ortamda olabilir (örneğin stdin / stdout, dosya ...).
  • Girdi, hedef diliniz için daha uygunsa, birden çok komut satırı bağımsız değişkeni biçiminde olabilir veya boşluklarla ayrılmış olabilir.
  • Çıktıda sondaki satırsonlarına izin verilir. Sondaki boşluklar değildir. Bu kural yalnızca bir çıktı olduğunda geçerlidir (yani girilen değer 0 olduğunda geçerli değildir).
  • Herhangi bir baz girişi olmadığında kodunuzun varsayılan olarak base 5 olması gerekir.

3
6,1Görünüşün çıktısı daha çok benzememeli -+- -+- -+- -+- -+- -+-mi?
Peter Taylor

3
"Girdi, virgülle ayrılmış bir veya iki pozitif tamsayı değeri olacaktır (örneğin 9 veya 8,4). o zaman bunu verilen şekilde alabilmeli ve "Programınız sağlam olmalı - girdiyi doğrulamalısınız ..." hakkında endişelenmenize gerek yok.
AndoDaan

1
@PeterTaylor ikiyi -+-temsil eder, çünkü dikey bir çizgi ve yatay bir puan vardır. Temel 1'de yalnızca dikey çizgiler bulunur. @AndoDaan değiştirildi.
Sean Latham

Tamam --- --- --- --- --- ---o zaman. Diğer üslerle tutarlılık için b-1dikey çizgilerden yatay bir vuruş yapmalısınız . Tutarsız olması amaçlanıyorsa bunu açıkça belirtmelisiniz.
Peter Taylor

Onu yaptım. Üzgünüm, ima edildiđini düţünmüţtüm.
Sean Latham

Yanıtlar:


4

CJam 103 85 72 karakter

Http://cjam.aditsu.net/ adresinden deneyin .

orijinal

q","/(i:A\_,{~i}{;5}?:B_@*{(_{" |"*S"l"++AB/*AB%}{;MA}?\:J" |l""-+ "er\" |"*N+_J\+@2$+@J\+++"l"Ser}{;}?

Boşluk bırakması gereken boşluklar için boşluklar, çizgiler ve l ile bir takım sayılar tanımlayarak çalışır. Sonra ikinci satırı yapmak için er (transliteration) fonksiyonundan yararlanır. En verimsiz kısım 1 ve 0 özel durumları ele almaktadır. Geliştirdiğim gibi düzenleyeceğim. İpucu Gerçekleştirmek için çok uzun sürdüm: ikinci girişin 1 olması sonsuzluk veya birinci giriş +1 ile aynı olduğundan, 1'e eşit olduğunda yeniden tanımlamak çok fazla iş tasarrufu sağlar.

en çok virgülle ayrılmış olarak geliştirildi

l",":G/(i:A\_5a?~i:B_@*{(_" |":K*\{SG++AB/*AB%}{A}?\_KG+"-+ "er[\GSer_@@M]\K*N+*}{;}?

şimdiye kadar en çok alan sınırlamalı girdi ile geliştirildi

Doğal olarak CJam gerçekten yer sınırlamalı girdi için tasarlanmıştır. Girişin 20,3 yerine 20 3'e yerleştirilmesi çok büyük bir avantajdır.

ri:Aq_5s?S-i(_)A)?:B*{B(" |":K*STs++ABmd@@*_K"-+"er[\_@@M]\K*N+*TsSer}M?

5

Python 2-111010911414414140136135 134 - Deneyin

Tamam, bir deneyelim:

i=input()
n,b=[(i,5),i][i>[]]
o=b-1
a=[n,n%b][b>1]*' |'
m=(b>1)*n/b
s=(' |'*o+'  ')*m+a
print(s+'\n'+('-+'*o+'- ')*m+a+'\n'+s)*(b*n>0)

Düzenleme: Ben n==0veya çıktı olmaması gerektiğini göz ardı ettim b==0. Bu bana 11 karakter. :(

Düzenleme: Tamam, yorumlarda belirtilen ikinci sorunu düzelttikten sonra benim çözüm temelde BeetDemGuise birine dönüştürdü.


Bu, girişlerden (veya her ikisinin) biri sıfır olduğunda zorlanmayacaktır, bu da zorluğa göre istenmeyen bir durumdur. Ayrıca, programa yalnızca bir sayı girilirse ne olur?
BeetDemGuise

1
İkinci değer atlandığında bu başarısız olur ( bbu durumda 5 olmalıdır). Soruda daha açık hale getireceğim. Düzenleme: oh, boş ver, bu yorumu yaptığım gibi düzelttin!
Sean Latham

Bu hangi Python?
Beta Çürüğü

Python 2.7.8. - Ah, sonunda küçük bir hata oldu ...
Falko

1
Python 2.x ise, n/byerine kullanarak bir karakter daha kaydedemez misiniz n//b?
Emil

5

Bash, 239228199189 188

İşte benim girişimim, çok fazla golf olabilir.

Not: İkinci satır 2 ila 5 çıkarma yapmaz, bir ayarlar varsayılan değeri ise $2boş!

n=$1
b=${2-5}
((n<1&b<1))&&exit
while ((n>b&b>1));do
n=$[n-b]
x+=\
y+=-
for i in `seq $[b-1]`;{
x+='| '
y+=+-
}
x+=\
y+=\
done
for j in `seq $n`;{
x+=' |'
y+=' |'
}
echo -e "$x\n$y\n$x"

{1..$n}Bunun yerine çalışıyor mu `seq $n`?
FUZxxl

@FUZxxl ne yazık ki h=8;echo {1..$h}çıktılar{1..8}

Bu iyi değil.
FUZxxl

3

Python - 171 143

i=input();t,b=i if[0]<i else(i,5);b=[b,t+1][b==1];l,d,m,o=' |',t/b,t%b,b-1;r=(l*o+'  ')*d+l*m
if t*b>0:print r,'\n',('-+'*o+'- ')*d+l*m,'\n',r

Program oldukça basittir:

  • Girdiyi alın ve içine açmayı deneyin t,b. Bu başarısız olursa, doğru değerleri atamanız yeterlidir.
  • Taban öyleyse 1, değerini tüm dikey çizgileri kolayca işleyebilecek bir değere değiştirin ( t+1).
  • Bazı değişkenler ayarlayın ve hesapların alt ve üst bölümlerini oluşturun.
  • Her ikisi de tve bsıfır değilse, taksitli çıktılar .

DÜZENLEME 1: Kullanım inputyerine işlev raw_inputbazı oyun civarını sonra.

EDIT 2: Sıfır olmayan kontrolümle küçük bir hataya işaret ettiği için Falko'ya teşekkürler. Şimdi kodumuz aynı, daha az değişken isimleri ve küçük mantık.

DÜZENLEME 3: Python'un dizileri ve farklı türleri karşılaştırması sayesinde, bloğumuzun daha kısa bir sürümünü almak iiçin a listile karşılaştırabiliriz try...except.

İşte ungolfed sürümü:

i=input()

# If True, `i` must be a list
if [0]<i:
    t,b=i
# Otherwise, we know its a number (since `list` comes after `int` lexicographically.)
else:
    b=5
    t=i

b = b if b==1 else t+1
l=' |'
d=t/b
m=t%b
o=b-1

r=(l*o+'  ')*d+l*m
if t and b:
    print r,'\n',('-+'*o+'- ')*d+l*m,'\n',r

Bence t&bolduğunu False10,5 için. Aksi takdirde çözümlerimiz birbirine yaklaşıyor! ;)
Falko

@Falko Her iki konuda da haklısın! Büyük beyinler hakkında ne söylediklerini biliyorsun.
BeetDemGuise

iSkaler veya bir liste olup olmadığını test etmek için kısa bir yol bulabilirsek gerçekten harika olurdu . Sonra try ... exceptcanavarı bırakabiliriz .
Falko

@Falko Bence 1byte-daha iyi bir çek buldum. A listher zaman bir int'den daha büyüktür. Ayrıca, listsözlükbilimsel sırayla karşılaştırılır. Bu yüzden karşılaştırırsanız [0]<ibunun her zaman dönecektir Falseeğer ibir sayıdır ve Trueeğer ibir liste (sıfır olmayan ilk eleman ile) 'dir.
BeetDemGuise

1
Harika! Yaklaşımınızı daha da kısalttım. Güzel ekip çalışması! :)
Falko

3

Java, 343

class C{public static void main(String[]a){long n=new Long(a[0])+1,b=a.length>1?new Long(a[1]):5;if(b>0){if(b<2)b=(int)2e9;int i;for(i=1;i<n;i++)p(i%b>0?" |":"  ");p("\n");for(i=1;i<n-n%b;i++)p(i%b>0?"-+":"- ");if(n>b)p("- ");for(i=1;i<n%b;i++)p(" |");p("\n");for(i=1;i<n;i++)p(i%b>0?" |":"  ");}}static void p(String s){System.out.print(s);}}

Daha az golf:

class C {
  public static void main(String[] a) {
    long n=new Long(a[0])+1, b=a.length>1 ? new Long(a[1]) : 5;
    if(b>0) {
      if(b<2) b=(int)2e9; // if the base is 1, pretend the base is 2 billion
      int i;
      for(i=1;i<n;i++) p(i%b>0 ? " |" : "  ");
      p("\n");
      for(i=1;i<n-n%b;i++) p(i%b>0 ? "-+" : "- ");
      if(n>b) p("- ");
      for(i=1;i<n%b;i++) p(" |");
      p("\n");
      for(i=1;i<n;i++) p(i%b>0 ? " |" : "  ");
    }
  }
  static void p(String s) {
    System.out.print(s);
  }
}

Sen yaparak birkaç kaydedebilir ibir longayrı olarak beyan etmek zorunda kalmamak. Birkaç tane daha i++%b>0döngülerinizi ayrı ayrı (ve i++<n%büçüncü döngüde) artırmak yerine yaparak . Başka bir kullanarak b=b<2?(int)2e9:b.
Geobits

3

Perl - 167 165 156

my($n,$b)=($ARGV[0]=~/(\d+)(?:,(\d+))?/,5);print$b>1?map{join(" ",($_ x($b-1))x int($1/$b)," | "x($1%$b))."\n"}(" | ","-+-"," | "):join" ",("---")x$1if$1*$b

ungolfed

my($n,$b) = ($ARGV[0] =~ /(\d+)(?:,(\d+))?/, 5);
print($b>1 ?
    map{ 
        join(" ",($_ x ($b-1)) x int($1/$b)," | " x ($1%$b))."\n"
    } (" | ","-+-"," | ") :
    join " ", ("---") x $1
) if $1 * $b

taban 1 için dikey çizgiler yerine yatay çizgiler görüntüler :(
chinese perl goth

@chineseperlgoth evet, bu gereksinimlerden biri. Lütfen Q.
Fozi

3

C - 193

Çok üzgünüm. Özel durum ile başa çıkmak için 1 kötü bir kesmek biraz oldu, bu yüzden bu daha iyi bir yaklaşım ile golf olabilir sanırım. Ayrıca, bu kod çıktının başında yeni bir satır içerir, bu yüzden buna izin verilmiyorsa lütfen bana bildirin.

Tabii ki, çok çirkin görünümlü tanımlar her zaman yardım :)

Karakter sayımı yalnızca gerekli boşlukları ve yeni satırları içerir.

#define P printf(
#define L P" |")
#define A P"\n");for(i=0;i<a;)b==1?i++,L:i++&&i%b==0?P
i;
main(a,b)
{
    scanf("%d,%d",&a,&b)<2?b=5:!b?a=0:a;
    if(a){
    A"  "):L;
    A"- "):a%b&&i>a/b*b?L:P"-+");
    A"  "):L;}
}

Değerlerinizden biri sıfır olduğunda kodunuz yeni satırlar yazdırıyor gibi görünüyor. Bu açıkça izin verilmiyor. Çözümünüz uygun değil.
FUZxxl

@FUZxxl Haklısın, bunu kaçırdım! Bu kötü hızlı düzeltmenin şimdilik yapması gerekecek. Umarım yakında daha iyi bir yol bulmak için zamanım olur.
Allbeert

Oldukça Eğer değiştirerek birkaç karakter kaydedebilirsiniz eminim printfile putsve değiştirilmesi returnbir üçlü operatör ile.
millinon

@millinon Sorun, putsher seferinde yeni bir satır eklemesidir :(. Üçlü operatör için, içine returns veya fors eklemek mümkün değildir !. Yorumunuz bana birkaç karakter daha kaydetme fikri verdi kolayca kaldırarak returnkarşın, yine de teşekkürler.!
Allbeert

2

C # 271bytes

En kısa değil, giriş olarak 0'ı kabul etmesi gerektiğinden girdi okumasını golf edemedim.

using C=System.Console;class P{static void Main(){var L=C.ReadLine().Split(',');int t=int.Parse(L[0]),f=L.Length>1?int.Parse(L[1]):5,r=3,i;for(var R="";t*f>0&r-->0;C.WriteLine(R.TrimEnd()))for(R="",i=0;i<t;R+=r==1&i++<t-t%f?(i%f<1?"- ":"-|"):i%f<1?"  ":" |")f+=f<2?t:0;}}

Biçimlendirilmiş kod:

using C=System.Console;

class P
{
    static void Main()
    {
        var L=C.ReadLine().Split(',');
        int t=int.Parse(L[0]),f=L.Length>1?int.Parse(L[1]):5,r=3,i;

        for(var R="";t*f>0&r-->0;C.WriteLine(R.TrimEnd()))
            for(R="",i=0;i<t;R+=r==1&i++<t-t%f?(i%f<1?"- ":"-|"):i%f<1?"  ":" |")
                f+=f<2?t:0;
    }
}

1

Lua - 219203 bayt

"|" Nin b kopyalarını oluşturmaya gittim, sonra "|" sonunda. Belki '| tally up' "|" s ile her seferinde dize gitmiş gibi hissediyorum.

l=' |'s=string.rep _,_,a,b=io.read():find'(%d+)%D*(%d*)'b=tonumber(b)or 5 d=(a-a%b)/b f=b>1 and s(s(l,b-1)..'  ',d)g=b>1 and s(s('-+',b-1)..'- ',d)r=b>1 and a%b or a e=s(l,r)..'\n'print(f..e..g..e..f..e)

ungolfed:

l=' |'          --the base string
s=string.rep    --string.rep will be used a lot, so best shorten it

_,_,a,b=io.read():find'(%d+)%D*(%d*)' --reads a,b I'm probably way of the mark with this one

b=tonumber(b)or 5

d=(a-a%b)/b -- shorter than math.floor(a/b), d equal the vertical mark

f=b>1 and s(s(l,b-1)..'  ',d) or '' --creates d multiples of b multiples of "|" more or less
g=b>1 and s(s('-+',b-1)..'- ',d)or''--same as above but with the middle "-+-"

r=b>1 and a%b or a --idk maybe i should set r before d(a- a%b )/b

e=s(l,r)..'\n'  -- makes the remainder string, notice that if b==1  then e will output all the "|" 

print(f..e..g..e..f..e) -- here's where the real magic happens!

Örneklem:

c:\Programming\AnarchyGolfMine>lua test.lua
13,5
 | | | |   | | | |   | | |
-+-+-+-+- -+-+-+-+-  | | |
 | | | |   | | | |   | | |


c:\Programming\AnarchyGolfMine>lua test.lua
6,2
 |   |   |
-+- -+- -+-
 |   |   |


c:\Programming\AnarchyGolfMine>lua test.lua
18,1
 | | | | | | | | | | | | | | | | | |
 | | | | | | | | | | | | | | | | | |
 | | | | | | | | | | | | | | | | | |

1
Biraz daha okunaklı ve okunmamış bir versiyon gönderebilir misiniz? Lua'da Golf ilginç görünüyor!

@Alessandro bitti. Ve teşekkürler, kaçırdığım birkaç şey buldum.
AndoDaan

1

JavaScript (193)

Bu aşırı karmaşık olabilir.

s=prompt().split(",");a=+s[0];b=s[1];b=b?+b:5;o=b>1;v=" | ";q=w="";for(g=~~(a/b),c=o?a-g:a;g+1;g--,q+=" ",w+=" ")for(i=o;c&&i<b;i++)c--,q+=v,w+=g&&o?"-+-":v;if(a&&b)console.log(q+'\n'+w+'\n'+q)

Yorumlanan sürüm

s=prompt().split(",");
a=+s[0];
b=s[1];
b=b?+b:5;   // convert b to int and default to 5
o=b>1;      // special handling for b0 and b1
v=" | ";
q=w="";
// calculate number of lines and number of groups
for(g=~~(a/b),c=o?a-g:a;g+1;g--,q+=" ",w+=" ")
    for(i=o;c&&i<b;i++)
        c--,  // decrease line count
        q+=v,
        w+=g&&o?"-+-":v; // use " | " for last group and "-+-" for others
if(a&&b) // handle b0
    console.log(q+'\n'+w+'\n'+q)

1

Python - 127 123 122

Sadece biraz daha kısa bir python sürümü ile gizlice giriyoruz.

edit: 0 hiçbir şey ve rejigger yazdırmıyor, aynı uzunlukta sona erdi Sabit

k=input()
k=i,j=((k,5),k)[k>[]]
for m in[' |','-+',' |']*all(k):
 print(m*(j-1)+m[0]+' ')*(i/j*(j>1))+' |'*(i%(j+(j<2)*i))

0

C (207 karakter)

Yeni satır exit, sadece okunabilirlik içindir.

#define P printf(
#define t(v)for(a=c;b<=a;a-=b)a-c&&P" "),P v+1),q(b,v);q(a," |");P"\n");
q(n,c){while(n--)P c);}a;b;c;main(){scanf("%d,%d",&c,&b)<2?b=5:0;b&&c||
exit();b==1?b=32767:0;t("| ")t("+-")t("| ")}

scanfAllbeert çalınan utanmaz. Bu çözümün var olmayan bir prototipi zorlamaya çalışırken gcc ile derlenmediğine dikkat edin exit. Gibi çalışan bir C derleyicisi ile derleyin tcc. Ayrıca, bu işlev 64 bit platformlarda çalışabilir veya çalışmayabilir. Dikkatli kullanın.

İşte bu temel dayanaksız uygulama:

#include <stdio.h>
#include <stdlib.h>

static void
tally_line(int base, int count, const char *str)
{
     int follower = 0, i;

     /* full tallies first */
     for (; count >= base; count -= base) {
          if (follower++)
               putchar(' ');

          /* only print second character */
          printf(str + 1);

          for (i = 0; i < base; i++)
               printf(str);
     }

     /* partial tally */
     for (i = 0; i < count; i++)
          printf(" |");

     /* newline */
     puts("");
}

extern int
main(int argc, char **argv)
{
     int base, count;

     /* do away with program name */
     count = atoi(*++argv);

     base = argc - 3 ? 5 : atoi(*++argv);

     /* remove 0 later */
     base | count || exit(0);

     /* a crossed-out tally never appears for large numbers */
     if (base == 1)
          base = 32767;

     tally_line(base, count, "| ");
     tally_line(base, count, "+-");
     tally_line(base, count, "| ");

     return (EXIT_SUCCESS);
}

0

Piton 2 , 134 126 123 114 bayt

lambda i,j=5,a=" |":"\n".join(("",(a*~-j+"  ","-+"*~-j+"- ")[x%2]*(i/j))[j>1]+a*(i,i%j)[j>1]for x in(0,1,2)if i*j)

Çevrimiçi deneyin!

Eski soru biliyorum ama yine de gitmek için eğlenceli. Katıldığımdan beri öğrendiğim birkaç hileyi deneme şansı.

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.