แสดงนับ (ในฐานที่แตกต่างกัน)


16

Tallying เป็นระบบการนับอย่างง่ายที่ทำงานในฐาน 5 มีระบบรับทราบที่แตกต่างหลากหลายที่ใช้กันทั่วโลก แต่ระบบที่ใช้ในประเทศที่ใช้ภาษาอังกฤษส่วนใหญ่นั้นอาจจะเป็นระบบที่ง่ายที่สุด - นับหน่วยโดยการทำเครื่องหมายแนวตั้ง แต่ละเครื่องหมายที่ 5 ใส่เส้นแนวนอนผ่านคอลเลกชันก่อนหน้าของสี่ กลุ่มนี้มีเครื่องหมายนับเป็นกลุ่ม 5 (และทำให้นับได้ง่ายขึ้น)

คุณกำลังจะเขียนโปรแกรมที่แสดงเครื่องหมายรวมถึงค่าที่กำหนด แต่การรายงานในฐาน 5 เท่านั้นน่าเบื่อ! ดังนั้นโปรแกรมของคุณควรสามารถแสดงตัวเลขในฐานที่ต่างกันได้

อินพุต

อินพุตจะเป็นค่าจำนวนเต็มหนึ่งหรือสองค่าที่ไม่ใช่ลบโดยคั่นด้วยเครื่องหมายจุลภาค (เช่น9หรือ8,4) ตัวเลขแรกคือค่าที่ควรแสดงโดยการนับ ค่าที่สองคือฐานของการนับ ถ้าค่าที่สองคือการไม่ได้รับการใช้งานฐาน 5

เอาท์พุต

เอาต์พุตจะเป็นค่าอินพุตที่แสดงเป็นเครื่องหมาย ASCally art tally นี่คือตัวอย่างบางส่วนที่คุณสามารถทดสอบโปรแกรมของคุณได้ - ผลลัพธ์ของคุณควรตรงกับพวกเขาทุกประการ!

อินพุต: 12หรือ12,5

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

การป้อนข้อมูล: 7,3

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

การป้อนข้อมูล: 4,2

 |   |
-+- -+-
 |   |

อินพุต: 6,1หรือ6,10(สังเกตช่องว่างนำหน้า)

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

โปรดทราบว่าฐาน 1 มีวัตถุประสงค์ที่จะไม่สอดคล้องกัน - ควรใช้เส้นแนวตั้งเท่านั้น

หากค่าที่ป้อนเข้าอย่างใดอย่างหนึ่งคือ 0 ไม่ควรมีเอาต์พุตใด ๆ (และโปรแกรมของคุณควรสิ้นสุดอย่างสง่างาม)

กฎระเบียบ

  • นี่คือดังนั้นการดำเนินการที่ถูกต้องสั้นที่สุด (เป็นไบต์) ชนะ
  • อินพุต / เอาต์พุตสามารถอยู่ในสื่อที่เหมาะสม (เช่น stdin / stdout, ไฟล์ ... )
  • อินพุตอาจอยู่ในรูปแบบของอาร์กิวเมนต์บรรทัดคำสั่งหลายรายการหรือคั่นด้วยช่องว่างเป็นต้นหากเหมาะสมกับภาษาเป้าหมายของคุณ
  • ขึ้นบรรทัดใหม่ที่ได้รับอนุญาตในการส่งออก ช่องว่างต่อท้ายไม่ได้ กฎนี้ใช้เฉพาะเมื่อมีเอาต์พุต (เช่นไม่ใช่เมื่อค่าที่ป้อนเป็น 0)
  • รหัสของคุณต้องเริ่มต้นที่ฐาน 5 เมื่อไม่มีฐานป้อน

3
ผลลัพธ์ที่ออกมาของ6,1รูปลักษณ์ไม่ควรเป็นเช่นนั้น-+- -+- -+- -+- -+- -+-หรือ
ปีเตอร์เทย์เลอร์

3
หากคุณระบุ "อินพุตจะเป็นค่าจำนวนเต็มบวกหนึ่งหรือสองค่าคั่นด้วยเครื่องหมายจุลภาค (เช่น 9 หรือ 8,4)" จากนั้นเราควรจะสามารถรับได้ตามที่กำหนดและไม่ต้องกังวลกับ "โปรแกรมของคุณควรแข็งแกร่ง - คุณควรตรวจสอบอินพุต ... " นอกเหนือจากการจัดการตัวเลขหนึ่งหรือสอง
AndoDaan

1
@PeterTaylor -+-จะเป็นตัวแทนของสองเพราะมีเส้นแนวตั้งและคะแนนแนวนอนผ่านมัน ฐาน 1 จะมีเส้นแนวตั้งเท่านั้น @AndoDaan กระสุน
Sean Latham

ตกลง--- --- --- --- --- ---แล้ว เพื่อความสอดคล้องกับฐานอื่น ๆ คุณควรจะตีแนวนอนผ่านb-1เส้นแนวตั้ง หากวัตถุประสงค์นั้นไม่สอดคล้องกันคุณควรระบุอย่างชัดเจน
Peter Taylor

ฉันทำอย่างนั้นแล้ว ขออภัยฉันคิดว่ามันส่อให้เห็น
Sean Latham

คำตอบ:


4

CJam 103 85 72ตัวอักษร

ลองมันที่http://cjam.aditsu.net/

เป็นต้นฉบับ

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

ทำงานโดยกำหนด tallys หนึ่งชุดด้วยช่องว่างบรรทัดและ l สำหรับช่องว่างที่ควรเว้นช่องว่าง จากนั้นใช้ประโยชน์จากฟังก์ชั่น er (tranliteration) เพื่อสร้างบรรทัดที่สอง ส่วนที่ไม่มีประสิทธิภาพมากที่สุดคือการจัดการกับกรณีพิเศษ 1 และ 0 จะแก้ไขเมื่อฉันปรับปรุง เคล็ดลับที่ฉันใช้เวลานานเกินไปที่จะรับรู้: เนื่องจากอินพุตที่สองเป็น 1 เป็นอินฟินิตี้หรืออินพุทแรก +1 ให้นิยามใหม่เมื่อมันเท่ากับ 1 ช่วยประหยัดงานได้มาก

ปรับปรุงมากที่สุดโดยใช้เครื่องหมายจุลภาคคั่น

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

ปรับปรุงมากที่สุดจนถึงกับช่องว่างที่คั่นด้วยช่องว่าง

โดยธรรมชาติแล้ว CJam ได้รับการออกแบบมาเพื่อการป้อนข้อมูลด้วยตัวคั่น การวางอินพุตที่ 20 3 แทน 20,3 เป็นประโยชน์อย่างมาก

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

5

Python 2 - 111 108 119 144 140 136 135 134 - ลองใช้ดู

ตกลงลองมาดูกัน:

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)

แก้ไข:ผมเคยมองข้ามว่าควรจะมีการส่งออกไม่มีถ้าหรือn==0 b==0ค่าใช้จ่ายนี้ฉัน 11 ตัวอักษร :(

แก้ไข:ตกลงหลังจากแก้ไขปัญหาที่สองที่กล่าวถึงในความคิดเห็นวิธีการแก้ปัญหาของฉันโดยทั่วไปแปรสภาพเป็นหนึ่งจาก BeetDemGuise


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

1
สิ่งนี้จะล้มเหลวเมื่อละเว้นค่าที่สอง ( bควรเป็น 5 ในกรณีนี้) ฉันจะทำให้ชัดเจนยิ่งขึ้นในคำถาม แก้ไข: โอ้ไม่เป็นไรคุณแก้ไขมันเช่นเดียวกับที่ฉันแสดงความคิดเห็นนี้!
ฌอนลาแทม

งูหลามตัวไหนคืออะไร?
Beta Decay

มันคือ Python 2.7.8 - โอ้มีความผิดพลาดเล็ก ๆ ที่ปลายมาก ...
Falko

1
หากเป็น Python 2.x คุณจะไม่สามารถบันทึกอักขระได้อีกหนึ่งตัวโดยใช้n/bแทนn//bหรือไม่?
Emil

5

ทุบตี, 239 228 199 189 188

นี่คือความพยายามของฉันมันสามารถเล่นกอล์ฟได้มาก

หมายเหตุ: บรรทัดที่สองจะไม่ลบ 5 จาก 2 มันจะตั้งค่าเริ่มต้นถ้า$2ว่าง!

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}ทำงานแทน`seq $n`?
FUZxxl

@FUZxxl น่าเสียดายที่ไม่ได้h=8;echo {1..$h}ผลลัพธ์{1..8}

นั่นไม่ดีเลย
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

โปรแกรมค่อนข้างตรงไปตรงมา:

  • t,bได้รับข้อมูลและพยายามที่จะเข้าไปในแกะ หากล้มเหลวเพียงกำหนดค่าที่ถูกต้อง
  • ถ้าฐาน1เปลี่ยนค่าเป็นสิ่งที่สามารถจัดการกับเส้นแนวตั้งทั้งหมดได้อย่างง่ายดาย ( t+1)
  • ตั้งค่าตัวแปรบางอย่างและสร้างส่วนล่างและส่วนบนของส่วนสูง
  • พิมพ์ความสูงหากทั้งคู่tและbไม่ใช่ศูนย์

แก้ไข 1:ใช้inputฟังก์ชั่นแทนraw_inputหลังจากบางคนเล่นรอบ

แก้ไข 2:ขอบคุณ Falko สำหรับการชี้จุดบกพร่องเล็ก ๆ ด้วยการตรวจสอบที่ไม่ใช่ศูนย์ของฉัน ตอนนี้รหัสของเราเหมือนกันโดยทั่วไปชื่อตัวแปรน้อยและตรรกะขนาดเล็ก

แก้ไข 3:ด้วยวิธีที่ Python เปรียบเทียบลำดับและประเภทที่แตกต่างกันเราสามารถเปรียบเทียบiกับ a listเพื่อรับtry...exceptบล็อกรุ่นที่สั้นกว่าของเรา

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

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

ฉันคิดว่าt&bเป็นFalse10,5 มิฉะนั้นโซลูชันของเราจะมาบรรจบกัน! ;)
Falko

@Falko คุณคิดถูกทั้งคู่! คุณรู้ว่าสิ่งที่พวกเขาพูดเกี่ยวกับความคิดที่ดี
BeetDemGuise

มันจะดีมากถ้าเราหาทางทดสอบว่าiเป็นเซนต์คิตส์และเนวิส จากนั้นเราสามารถดรอปtry ... exceptมอนสเตอร์ได้
Falko

@Falko ฉันคิดว่าฉันพบการตรวจสอบที่ดีกว่า 1byte A listยิ่งใหญ่กว่า int เสมอ นอกจากนี้ยังlistมีการเปรียบเทียบ s ตามลำดับคำด้วยพจนานุกรม ดังนั้นถ้าเราเปรียบเทียบ[0]<iนี่จะส่งคืนเสมอFalseถ้าiเป็นจำนวนและTrueถ้าiเป็นรายการ (ที่มีองค์ประกอบแรกที่ไม่ใช่ศูนย์)
BeetDemGuise

1
ที่ดี! ฉันสั้นลงวิธีการของคุณ การทำงานเป็นทีมที่ดี! :)
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);}}

หักกอล์ฟ:

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

คุณสามารถบันทึกไม่กี่โดยการดังนั้นคุณจึงไม่ต้องประกาศมันแยกกัน เพิ่มอีกสองสามอย่างโดยทำในลูปแทนการเพิ่มทีละส่วน (และในลูปที่สาม) หนึ่งโดยใช้อีก ilongi++%b>0i++<n%bb=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

แสดงเส้นแนวนอนแทนที่จะเป็นเส้นแนวตั้งสำหรับฐาน 1 :(
จีนเพอร์ลชาวเยอรมัน

@ chineseperlgoth ใช่นั่นเป็นหนึ่งในข้อกำหนด โปรดอ่านความคิดเห็นเกี่ยวกับ Q.
Fozi

3

C - 193

ฉันขอโทษ. การจัดการกับกรณีพิเศษสำหรับ 1 นั้นเป็นการแฮ็คที่ไม่ดีดังนั้นฉันคิดว่านี่น่าจะเป็นสนามที่มีวิธีการที่ดีกว่า นอกจากนี้รหัสนี้มีบรรทัดใหม่ที่จุดเริ่มต้นของการส่งออกดังนั้นหากไม่ได้รับอนุญาตโปรดแจ้งให้เราทราบ

แน่นอนคำจำกัดความที่ดูน่าเกลียดมากจะช่วยเสมอ :)

จำนวนตัวละครประกอบด้วยช่องว่างที่จำเป็นและบรรทัดใหม่เท่านั้น

#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;}
}

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

@FUZxxl ถูกต้องแล้วฉันพลาดไป! การแก้ไขด่วนที่ไม่ดีนี้จะต้องทำในตอนนี้ ฉันหวังว่าฉันจะมีเวลาเร็ว ๆ นี้เพื่อหาวิธีที่ดีกว่า
Allbeert

ฉันค่อนข้างมั่นใจว่าคุณสามารถบันทึกตัวละครไม่กี่ตัวโดยแทนที่printfด้วยputsและแทนที่returnด้วยตัวดำเนินการประกอบ
millinon

@millinon มีปัญหากับ putsคือมันเพิ่มบรรทัดใหม่ทุกครั้ง :( และสำหรับผู้ประกอบการที่สามมันเป็นไปไม่ได้ที่จะเพิ่มreturns หรือfors ในพวกเขา! ความคิดเห็นของคุณทำให้ฉันมีความคิดที่จะช่วยตัวละครอีกไม่กี่ ได้อย่างง่ายดายโดยการลบreturnแม้ว่าขอบคุณ!
Allbeert

2

C # 271bytes

ไม่ใช่ที่สั้นที่สุดฉันไม่สามารถอ่านค่าอินพุตกอล์ฟได้เนื่องจากจำเป็นต้องยอมรับค่า 0 เป็นอินพุต

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

รหัสที่จัดรูปแบบ:

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 - 219 203 ไบต์

ฉันไปทำสำเนา d ของสำเนา "|" แล้วเพิ่มสำเนาของ "|" ในตอนท้าย ฉันรู้สึกว่าบางทีฉันควรจะไปกับ "นับ" กับ "สตริง" ทีละครั้ง

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!

ตัวอย่าง:

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
คุณช่วยโพสต์เวอร์ชั่นที่อ่านง่ายขึ้นและไม่น่ารังเกียจมากขึ้นได้ไหม? การเล่นกอล์ฟใน Lua ดูน่าสนใจ!

@lessandro เสร็จแล้ว และขอบคุณมันทำให้ฉันพบสิ่งที่ฉันพลาด
AndoDaan

1

จาวาสคริปต์ (193)

นี่อาจจะซับซ้อนเกินไป

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)

แสดงความคิดเห็นรุ่น

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

เพิ่งแอบเข้ามาด้วยรุ่นไพ ธ อนที่สั้นกว่าเล็กน้อย

แก้ไข: แก้ไข 0 ไม่ได้พิมพ์อะไรและ rejigger จบลงด้วยความยาวเดียวกัน

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 ตัวอักษร)

ขึ้นบรรทัดใหม่ก่อนexitเพื่อความชัดเจนเท่านั้น

#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("| ")}

scanfการใช้งานที่หน้าด้านถูกขโมยจาก Allbeert ขอให้สังเกตว่าการแก้ปัญหานี้ไม่ได้รวบรวมกับ GCC exitขณะที่มันพยายามที่จะบังคับใช้เป็นต้นแบบสำหรับ คอมไพล์ด้วยคอมไพเลอร์ C ที่ใช้งานได้tccได้ นอกจากนี้ฟังก์ชั่นนี้อาจทำงานได้หรือไม่ทำงานบนแพลตฟอร์ม 64 บิต ใช้ด้วยความระมัดระวัง

นี่คือการติดตั้งแบบดั้งเดิมที่ไม่ได้ดำเนินการบนพื้นฐานของ:

#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

Python 2 , 134 126 123 114 ไบต์

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)

ลองออนไลน์!

คำถามเก่าที่ฉันรู้ แต่สนุกที่จะได้ไปที่ โอกาสที่จะลองเทคนิคเล็กน้อยที่ฉันได้เรียนรู้ตั้งแต่เข้าร่วม

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