วาดตัวอักษรฟันเลื่อย


42

ง่ายๆวันนี้ เขียนโปรแกรมที่สั้นที่สุดที่วาด "ตัวอักษรฟันเลื่อย" ให้จำนวนเต็มบวกสำหรับความสูง คุณต้องเขียนชื่อภาษาการเขียนโปรแกรมของคุณเมื่อคุณมาถึงตัวอักษรมันเริ่มต้นด้วย

ตัวอย่างเช่นหากภาษาของคุณคือ Python และอินพุตคือ1ผลลัพธ์ควรเป็น:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

หากอินพุตเป็น2เอาต์พุตควรเป็น:

 B D F H J L N Python R T V X Z
A C E G I K M O      Q S U W Y

หากอินพุตเป็น4เอาต์พุตควรเป็น:

   D     J     Python     V
  C E   I K   O      Q   U W
 B   F H   L N        R T   X Z
A     G     M          S     Y

หมายเหตุ

  • A เริ่มที่ด้านล่างซ้ายเสมอ
  • อินพุตสามารถผ่าน stdin หรือการเรียกใช้ฟังก์ชันหรือคล้ายกัน ส่งออกไปยัง stdout
  • ข้อมูลข้างต้น26ไม่จำเป็นต้องทำงาน
  • ไม่มีช่องว่างต่อท้าย

9
อนุญาตให้ใช้ภาษาโปรแกรมที่มีชื่อตัวอักษรเดียวหรือไม่ (C, J, K, ฯลฯ )
isaacg

@isaacg แน่นอน ฉันคิดว่ามันอาจจะง่ายขึ้นในพวกเขา
งานอดิเรกของ Calvin

1
สามารถคาดหวังให้อินพุตนั้นเก็บไว้ในตัวแปรได้หรือไม่?
Martin Ender

@ MartinBüttnerใช่แล้ว
งานอดิเรกของ Calvin

13
Btw, นี่ไม่ใช่คลื่นฟันเลื่อย, นี่คือคลื่นสามเหลี่ยม: P
qwr

คำตอบ:


14

ถ้าnถือความสูง:

C + รหัสหลบหนี: 81

x;main(y){for(y=n--;x<26;x++)printf("\033[%d;%dH%c",n?x/n&1?y++:y--:y,x+1,x+65);}

C: 110

x;char a[702]={[0 ...701]=32};main(y){for(y=--n;x<26;a[x*27-1]=10)a[27*(n?x/n&1?y++:y--:y)+x]=x+++65;puts(a);}

5
ฉันยอมรับความพ่ายแพ้ อะไรในโลก : D
Martin Ender

ฉันขอคำแนะนำในการรวบรวมได้ไหม ccให้ข้อผิดพลาด "<bebe.c: 1: 17: ข้อผิดพลาด: 'n' ไม่ได้ประกาศ (ใช้งานครั้งแรกในฟังก์ชั่นนี้)"
manatwork

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

โอ้ดังนั้นฉันต้องให้ n ในวิธีที่ฉันสามารถใด ๆ ฮ่า ๆ. ยังคงประทับใจ
จัดการ

19

C, 134

n,m,c,p;
main(r){
for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts(""))
for(c=-1,p=1;c++<25;)
p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65);
}

คอมไพล์บน gcc พร้อมคำเตือนเล็กน้อย บรรทัดใหม่จะไม่รวมอยู่ในจำนวนตัวอักษร

122 ตัวอักษรnถ้าใส่แล้วจะถูกเก็บไว้ใน

ขอบคุณuser2992539 , tolosและedc65สำหรับการปรับปรุง


3
คุณสามารถใช้แทนputs("") printf("\n")
Somnium

2
บันทึก 4 ตัวอักษรด้วยp-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);แทนif((c-...

1
ขออภัยสำหรับความคิดเห็นก่อนหน้านี้ (ถูกลบ) ฉันผิด เล่นกับสัญญาณและใช้ความจริงที่ว่าข้อโต้แย้งแรกของหลักคือ 1 หากไม่มีพารามิเตอร์: 134n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
edc65

13

TI-BASIC - 148 ไบต์ (ข้อความดิบ), 186 ไบต์ (กราฟิก)

ในการตอบสนองต่อ OP นั้น TI-83 ที่ยอดเยี่ยม (และใหม่กว่า) มาพร้อมขนาด 16 x 8 (เพียงแค่ใช้ตัวอักษรขนาดใหญ่มาตรฐาน) หรือขนาด 94 x 62 พิกเซล (ซึ่งตัวอักษรขนาดเล็กมีค่าประมาณ 10 บรรทัด) )

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

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

  • วิธีข้อความดิบ

    :ClrHome
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :8→R
    :For(C,1,16
    :If N=1
    :Then
    :0→F
    :Else
    :If R<2 or 10-R>N
    :1→F
    :If R>7
    :-1→F
    :End
    :If C≠20
    :Then
    :Output(R,C,sub(Str1,C,1
    :Else
    :Output(R,C,sub(Str1,C,8
    :C+7→C
    :End
    :R+F→R
    :End
    

    เพื่อที่จะทำให้งานนี้โดยไม่คำนึงถึงขั้วเปลี่ยนแปลงFor(C,1,16ไปFor(C,1,33และลบการตรวจสอบขอบเขตบน ( R<2 or) นี่คือผลลัพธ์ด้วย5→N:

    ป้อนคำอธิบายรูปภาพที่นี่

  • วิธีกราฟิก (อาจจำเป็นต้องมีAxisOffความชัดเจน)

    :ClrDraw
    :N*6→N
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :57→R
    :For(C,1,56
    :If N=6
    :Then
    :0→F
    :Else
    :If R<7 or 64-R>N
    :6→F
    :If R>51
    :-6→F
    :End
    :If C≠20
    :Then
    :If C>50
    :Then
    :Text(R,C,sub(Str1,C-23,1
    :Else
    :Text(R,C,sub(Str1,C,1
    :End
    :Else
    :Text(R,C,sub(Str1,C,8
    :C+30→C
    :End
    :R+F→R
    :End
    

    อันนี้ใช้งานได้ดีกับสองนิสัยใจคอเล็กน้อย ความสูงยังคงเป็นปัญหาอยู่แม้ว่าความกว้างจะไม่ใช่ อย่างไรก็ตามฉันไม่ได้เว้นวรรคดังนั้นในบางกรณี (เมื่อตัวอักษรเริ่มขึ้นหรือลดลงจากฟันเลื่อย) ตัวอักษรอาจถูกตัดออกโดยผู้สืบทอดของพวกเขา ในการทำให้มันทำงานโดยไม่คำนึงถึงเทอร์มินัลให้ลบการตรวจสอบขอบเขตบน ( R<7 or) จากนั้นติดตามกราฟ:

    ป้อนคำอธิบายรูปภาพที่นี่


ตอนนี้ฉันต้องย้ายสิ่งนี้ไปยังเครื่องคิดเลขกราฟของฉัน
Liam McInroy

ความคิดเห็นอย่างรวดเร็ว: แทนที่จะ0→Fทำเช่นนั้นคุณจะDelvar Fประหยัดได้ 1 ไบต์เมื่อทำการโทเค็น นอกจากนี้ฉันแน่ใจว่าคุณสามารถแยกเอาท์พุท / ข้อความไปยังจุดสิ้นสุดด้วยเงื่อนไขการทดสอบแบบอินไลน์บูลีนสำหรับพิกัดและสำหรับการC+7→Cเขียนสั้น ๆ ถ้า (ไม่ใช่ / อื่น / สิ้นสุด)
Adriweb

11

Pure Bash (ไม่มี coreutils), 181 ไบต์

m=$1
for l in A Bash {C..Z};{
((m))||s=++
((m>$1-2))&&s=--
for((m=$1==1?1:m,m$s,i=0;i<$1;i++));{
((i-m))&&a[i]+=${l//?/ }||a[i]+=$l
}
}
shopt -s extglob
printf %s\\n "${a[@]%%+( )}"

เอาท์พุท:

ส่งไปยังcat -Eเพื่อพิสูจน์ว่าไม่มีการขึ้นบรรทัดใหม่

$ ./sawtooth.sh 1 | cat -E
ABashCDEFGHIJKLMNOPQRSTUVWXYZ$
$ ./sawtooth.sh 5 | cat -E
       E       M       U$
      D F     L N     T V$
     C   G   K   O   S   W$
 Bash     H J     P R     X Z$
A          I       Q       Y$
$ 

10

JavaScript (ES6) 231 244

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

ไม่มีการเปลี่ยนแปลงอัลกอริทึมทั่วไปที่อาจไม่ดีที่สุดสำหรับความท้าทายนี้

F=h=>{for(p=s=[i=z=b=t=''];++p<h;)i=1,z=b=' ',s[p]=t;for(p=--h,k=64;++k<91;)s[p]+=t+String.fromCharCode(k),k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))),p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b;console.log(s.join('\n'))}

อธิบาย

F=h=>{
  // row in s for output must be initialized to ''. In the same step I make other initializations
  for(p=s=[i=z=b=t='']; ++p < h;) // initialize for height 1, all increment and spacing can be null
    i=1,z=b=' ',s[p]=t; // the for body is entered only if height > 1, initializing spacing and increment to the right values
  for(p=--h,k=64;++k<91;)
    s[p]+=t+String.fromCharCode(k),
    k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))), // if 'J' modify each line of output adding the name or spacing
    p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b; // index bouncing
  console.log(s.join('\n'))
}

ตัวอย่าง

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 ขึ้นไป

  C   G            K   O   S   W
 B D F H Javascript L N P R T V X Z
A   E   I            M   Q   U   Y

4 อยู่ด้านบน

   D     Javascript     P     V
  C E   I          K   O Q   U W
 B   F H            L N   R T   X Z
A     G              M     S     Y

7 ลงไป

      G                    S
     F H                  R T
    E   I                Q   U
   D     Javascript     P     V
  C                K   O       W
 B                  L N         X Z
A                    M           Y

9

JAVA (393)

เป็นภาษาที่ยอดเยี่ยมสำหรับการเล่นกอล์ฟ:

public class P{public static void main(String[]a){int h=Integer.valueOf(a[0]);String x="ABCDEFGHIJKLMNOPQRSTUVWXYZ";String[]l=new String[h];Arrays.fill(l,"");int i=h-1;int d=-1;for(char c:x.toCharArray()){for(int n=0;n<l.length;n++){String k=(n==i)?(c=='J')?"Java":c+"":(c=='J')?"    ":" ";l[n]+=k;}if(i==0&&d==-1)d=1;if(i==h-1&&d==1)d=-1;if(h>1)i+=d;}for(String s:l){System.out.println(s);}}}

2
java.util.Arrays;แต่น่าเสียดายที่คุณลืมนำเข้าสำหรับ :-(
Justin

แต่คุณสามารถ imporve รหัสของคุณ: กำจัดString x="ABC...Z";และแทนที่for(char c...หัวห่วงกับfor (char c=65;++c<91;){ฉันรักตัวอักษรในชวา =)
flawr

นอกจากนี้คุณสามารถแทนที่c=='J'ด้วยc==74บันทึกอีกสองไบต์รวม
ข้อบกพร่อง

2
ฉันแน่ใจว่าคุณสามารถทำได้ดียิ่งขึ้นถ้าคุณควบแน่นถ้าคุณใช้ XORs สำหรับคำสั่ง if แต่นี่คือรุ่นที่ปรับปรุงของฉัน: (325) public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}@Quincunx: ไม่จำเป็นต้องใช้ import.util.Arrays อีกแล้ว =)
ข้อบกพร่อง

9

ทับทิม 112 ไบต์

o="#{' '*29}
"*h
26.times{|i|o[(h-i%(h<2?1:2*h-2)-1).abs*30+i+(i>17?3:0)]=(i+65).chr}
puts o.gsub('R   ','Ruby')

hคาดว่าการป้อนข้อมูลจะถูกเก็บไว้ใน

แจ้งให้เราทราบหากต้องการคำชี้แจง


มีขนาดเล็กมาก แต่คุณสามารถลบที่ว่างหลังจาก%นั้น
งานอดิเรกของ Calvin

@ งานอดิเรกของ Calvin ฮาฉันไม่เชื่อใจในการเน้นที่นั่น: D จะแก้ไขในภายหลัง
Martin Ender

คุณสามารถแทนที่ด้วยputs o... $><<o...
จอร์แดน

6

J: 75 ไบต์

NB. without IO |:26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}5
2(1!:2)~|.26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}".1!:1[1

การใช้ที่ยอดเยี่ยมแก้ไขร่วม ตามปกติแล้ว IO นั้นน่าเกลียดและไม่น่าดู วิธีแก้ปัญหาหลักใช้เวลา 3 gerunds (กริยาเรียงคำนาม (ฟังก์ชัน.)):

  • ก) การสร้างตัวอักษร
  • b) การสร้างดัชนี
  • c) สร้างเมทริกซ์เพื่อทำการแก้ไข

    x (a bc}) y

ก) เป็นการค้นหาเล็กน้อยในตาราง ascii

c) เป็นเรื่องเล็กน้อยยิ่งขึ้น

b) เป็นสิ่งที่น่าสนใจ ขวัญกำลังใจคือดัชนีแนวนอนควรเริ่มต้นจาก 0 ถึง y-1 และกลับลงมาทำซ้ำ 26 ครั้งนี้ เช่น. สำหรับ y == 4:

0 1 2 3 2 1 0 1 2 3 2 1 ...

การใช้สิ่งนี้จะช่วยให้ b):

($(,|.@}.@}:)@i.) <"1@,. i.@[)       NB. is equivalent too
(tine0 tine1 tine2)                  NB. a fork with tines defined as
tine0 =: 
  hook0 =: hook0_0 hook0_1           NB. a dyadic hook: x (g h) y -: x g h y
     hook0_0 =: $                    NB. reshape
     hook0_1 =: (hook1_0 hook1_1)@i. NB. do hook1 after making 0-y
       hook1_0=: ,                   NB. append to self
       hook1_1=: |.@}.@}:            NB. rotated version of y after beheading and curtailing
tine2 =: i.@[                  NB. generate 0-x
tine1 =: <"1@,.                NB. glue together coordinates.

ความจริงแล้วมีประโยชน์: ชื่อของ J คือ ... "J"


ควรใช้การแก้ไขไหม ฉันดูเหมือนจะง่ายกว่าที่จะพูดอะไรบางอย่างเช่น3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'ส่วนที่น่าเกลียดในการแก้ปัญหานั้นคือ 8 ตัวอักษรไปจนถึงความสูงพิเศษ 1 แต่อาจสั้นลงได้เล็กน้อย
b_jonas

ขอบคุณสำหรับคำแนะนำ! ของคุณสั้นกว่าจริง ๆ และการแก้ไขอาจจะเกินความจริง เนื่องจากมันแตกต่างกันมากคุณอาจต้องการโพสต์เป็นวิธีแก้ปัญหาด้วยตัวเอง
jpjacobs

ข้อมูลจำเพาะระบุว่า "ไม่มีช่องว่างต่อท้าย" และโซลูชันของฉันพิมพ์ช่องว่างต่อท้าย
b_jonas

5

R (204)

f=function(x) {
  m=matrix(" ",x,26)
  i=x
  d=ifelse(x==1,0,-1)
  for (j in 1:26) {
    m[i,j]=LETTERS[j]
    if (!((i+d) %in% 1:x)) d=-d
    i=i+d
  }
  for (i in 1:x) cat(m[i,],"\n",sep="")
}

ผลลัพธ์

> f(1)
ABCDEFGHIJKLMNOPQRSTUVWXYZ
> f(2)
 B D F H J L N P R T V X Z
A C E G I K M O Q S U W Y 
> f(3)
  C   G   K   O   S   W   
 B D F H J L N P R T V X Z
A   E   I   M   Q   U   Y 
> f(7)
      G           S       
     F H         R T      
    E   I       Q   U     
   D     J     P     V    
  C       K   O       W   
 B         L N         X Z
A           M           Y 

ฉันรู้ว่าคุณทำอะไรที่นั่น! ฉลาดมาก ...
Kroltan

1
+1 เรียบร้อย! คุณสามารถกำจัดช่องว่างรอบตัวของคุณforงบแม้ว่า ( for(i in 1:x)cat(...เป็นต้น) %in%หรือหนึ่งรอบ
plannapus

3

Javascript - 248 224 235

z=~~prompt(),y="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");y[9]="Javascript";for(w=[],v=0;v<z;v++)w[v]="\n";v--;for(i=0;i<26;i++){for(j=0;j<z;j++)w[j]+=j-v?i-9?" ":"          ":y[i];~~(i/(z-1))%2?v++:v--;}if(z==1)w=y;console.log(w.join(""))

นี่คือลิงค์ไปยัง jsfiddle ซึ่งคุณสามารถทดสอบได้
แก้ไข: สร้างบันทึกคอนโซลสำหรับแบบอักษรแบบโมโนสเปซและลบเครื่องหมายจุลภาคหากอินพุต == 1


ข้อเสนอแนะ: 1: parseInt และ Math.Floor สามารถทั้งการเปลี่ยนแปลงกับการดำเนินการจำนวนเต็ม coercing เหมือนหรือ|0 ~~2: มันสั้นเพื่อสร้างอาร์เรย์ W splitโดยตรงโดยไม่ต้อง for(w=[],v=0;v<z;v++)w[v]="\n";
edc65

... และไม่มีคำสั่งเอาท์พุท (console.log หรืออะไรก็ตามที่คุณใช้ในซอมันเป็นส่วนหนึ่งของจำนวนถ่าน)
edc65

@ edc65 ขอบคุณสำหรับคำแนะนำ คุณพูดถูกฉันลืมเอาท์พุทที่นี่ดังนั้นฉันจึงเพิ่มการแจ้งเตือน แต่ไม่มีแบบอักษรเว้นระยะเดียวดังนั้นมันจึงดูค่อนข้างวุ่นวาย
izlin

@izlin แทนที่จะ(i==9?" ":" ")ใช้(i^9?" ":" ")ซึ่งคุณสามารถบันทึกอักขระได้
rev

1
ช่วยด้วย! มีใครอธิบายได้บ้าง (เหตุใดจึงมี <code> v = 0 </code> สองครั้ง)
ข้อบกพร่อง

3

Perl 119

$s.=/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]for(0..26)x($m=<>);print$s=~s/\s+$//rg

โปรแกรมนี้จะใช้เวลาการป้อนข้อมูลจากและพิมพ์ผลให้STDINSTDOUT

และโบนัส - เวอร์ชันที่ขัดกับกฎในขณะที่พิมพ์ช่องว่างต่อท้าย แต่เพิ่มการโต้ตอบบางอย่าง:

#!/usr/bin/perl -p
$r=0;$_=join'',map{/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]}(0..26)x($m=$_)

... และการทดสอบบางอย่างด้านล่าง:

1
ABCDEFGHIJKLMNOPerlQRSTUVWXYZ
2
 B D F H J L N Perl R T V X Z
A C E G I K M O    Q S U W Y
4
   D     J     Perl     V
  C E   I K   O    Q   U W
 B   F H   L N      R T   X Z
A     G     M        S     Y
6
     F         Perl         Z
    E G       O    Q       Y
   D   H     N      R     X
  C     I   M        S   W
 B       J L          T V
A         K            U

3

J, 67 57 61 ตัวอักษร

echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)

ใช้เป็นฟังก์ชั่น:

   echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)
   D     J     P     V
  C E   I K   O Q   U W
 B   F H   L N   R T   X Z
A     G     M     S     Y

คำอธิบาย:โซลูชันนี้ใช้วิธีการที่แตกต่างจากโซลูชัน J อื่น ๆ แทนที่จะสร้างคลื่นฟันเลื่อย0 1 2 3 2 1 0 1 ...ฉันมองระยะห่างระหว่างตัวอักษรที่ต่อเนื่องกัน ยกตัวอย่างเช่นสำหรับn = 4ถ้าคุณไปจาก A ขึ้นไปห่อไปยังคอลัมน์ที่สองและการเข้าถึง B แล้วคุณจะพบสี่ช่องว่างระหว่าง A และ B รูปแบบของระยะห่างระหว่างตัวอักษรนี้เป็นปกติมาก: สำหรับn = 4รูปแบบคือ4 4 4 2 2 2 4 4 4 ...

ดังนั้นความคิดคือการสร้างอาเรย์แบนราบ (และ transposed) ก่อนจากนั้นปรับรูปร่างและพลิกมันเพื่อให้ถูกต้อง ชุดคำสั่งเอาต์พุตตรงไปตรงมา (สำหรับ J อย่างน้อย): dtbคือ "ลบช่องว่างต่อท้าย" และ"1ระบุว่า "ทำงานกับแต่ละบรรทัด" dtbและechoจัดทำโดยไลบรารีมาตรฐาน

ขอบคุณZsbán Ambrusสำหรับความช่วยเหลือในการเล่นกอล์ฟ


3

MetaPost (207)

numeric h,d,y;h=5;d=-1;y=1;u=5mm;pair p;string s;for x=1upto26:p:=(x,y)*u;s:=char(x+64);if x=13:s:="MetaPost";elseif x>13:p:=(x+2,y)*u;fi;label.rt(s,p);if(y=h)or(y=1):d:=d*-1;fi;if h=1:d:=0;fi;y:=y+d;endfor;

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถลองได้ที่นี่


2

Bash (213) (223)

read i
p=0
d=1
printf '\n%.0s' `seq $i`
for l in {A..Z}
do (($p==$i-1))&&((p=$p*-1))
(($i==1))&&p=0
(($p!=0))&&echo -en "\033[s\033[${p#-}A"
[[ "$l" == "B" ]]&&l="Bash"
echo -en $l"\033[s\033[${p#-}B"
((p++))
done

การปรับแต่งเล็กน้อยและเราลงไปที่ 213

อันแรกมีข้อผิดพลาดเล็กน้อย ผ่านการทดสอบและยืนยันแล้วว่าใช้ได้กับ bash เวอร์ชั่น 4.2.37

ขอบคุณ @manatwork สำหรับการชี้จุดบกพร่องและเคล็ดลับบางอย่าง


ฉันแก้ไขโพสต์ของคุณโดยเพิ่มการเน้นไวยากรณ์ไปที่โพสต์ แต่ตอนนี้ฉันเห็นว่าการเน้นส่วนของรหัสของคุณเป็นความคิดเห็นผิดดังนั้นฉันจึงย้อนกลับ ฉันเพียงแค่กล่าวว่านี้ในกรณีที่คุณสงสัยว่าทำไมฉันรีดมันกลับมา :)
ProgramFOX

@ProgramFOX ไม่เป็นไร ขอบคุณมาก!
ตกลง

ฉันคิดว่ามีข้อผิดพลาดเล็กน้อยที่ใดที่หนึ่งเนื่องจากผลลัพธ์ช้าลง (อย่างน้อยใน Bash 4.3.) การปรับปรุงเล็กน้อยบางอย่างเพื่อลดขนาดเป็น 194 ตัวอักษร: ละเว้น sigil ในการประเมินผลทางคณิตศาสตร์อย่าพยายามอ้างอิงสองครั้งในสตริงที่ยกมาสอง
บรรทัด

คุณสามารถใช้การขึ้นบรรทัดใหม่แทนการอ่าน;เพื่อให้อ่านง่ายขึ้นได้หรือไม่? มันจะไม่ส่งผลต่อคะแนนกอล์ฟของคุณ
Digital Trauma

2

Haskell - 432 ไบต์ (น่าเสียดาย ... )

สิ่งนี้กลับกลายเป็นว่าหนักกว่าที่ฉันคาดไว้มากเพื่อให้บรรลุอย่างหมดจด ฉันแน่ใจว่าฉัน (หรือใครบางคน) สามารถทำได้ดีกว่า แต่ฉันใช้เวลากับสิ่งนี้มากเกินไป รุ่น golfed เป็นดังนี้:

import Data.Matrix
import Data.Vector(toList)
r=repeat
s h=y h$l(take 26(case h of 1->r 1;_->concat$r$[h,h-1..1]++[2..h-1]))['A'..'Z']$matrix h 32(const ' ')<|>matrix h 1(const '\n')
l _[]m=m
l(x:i)(r:e)m=l i e$u m(let z=26-length i in if z<9 then z else z+6)x r
l _ _ m=m
u m c r h=case h of 'H'->t c r"Haskell"m;_->setElem h(r,c)m
t _ _[]m=m
t c r(x:i)m=t(c+1)r i$setElem x(r,c)m
y h m=concat[toList$getRow x m|x<-[1..h]]

เพื่อให้ทำงานได้โหลดรหัสลงghciและดำเนินการputStr $ s Intที่Intเป็นความสูงที่คุณต้องการ คุณสามารถเพิ่มได้

import System.Environment
main :: IO ()
main = fmap (s . read . head) getArgs >>= putStr

ภายใต้imports ในไฟล์ข้อความให้คอมไพล์ด้วยghcและส่งผ่านความสูงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เวอร์ชันที่ไม่ถูกปรับแต่ง:

import System.Environment
import Data.Matrix
import Data.Vector (toList)

main :: IO ()
main = fmap (sawtooth . read . head) getArgs >>= putStr

type M = Matrix Char

sawtooth :: Int -> String
sawtooth height = let mat     = matrix height 32 (const ' ') <|> matrix height 1 (const '\n')
                      numbers = take 26 (case height of 1 -> repeat 1
                                                        _ -> concat $ repeat $ [height,height-1..1]++[2..height-1])
                      chars   = ['A'..'Z']
                  in toString height $ makeMatrix numbers chars mat

makeMatrix :: [Int] -> String -> M -> M
makeMatrix []     []     mat = mat
makeMatrix (x:xs) (s:ss) mat = makeMatrix xs ss $ updateMatrix
                                                    mat (let z = 26 - length xs in if z < 9 then z else z + 6) x s
makeMatrix _      _      mat = mat

updateMatrix :: M -> Int -> Int -> Char -> M
updateMatrix mat col row char = case char of 'H' -> insertHaskell col row "Haskell" mat
                                             _   -> setElem char (row, col) mat

insertHaskell :: Int -> Int -> String -> M -> M
insertHaskell _   _   []     mat = mat
insertHaskell col row (x:xs) mat = insertHaskell (col+1) row xs $ setElem x (row, col) mat

toString ::Int -> M -> String
toString height mat = concat [ toList $ getRow x mat | x <- [1..height] ]

ฉันเชื่อว่าคุณสามารถแทนที่constด้วยpure(โดยใช้อินสแตนซ์สำหรับฟังก์ชั่น) เพื่อบันทึกไม่กี่ไบต์
แยกผลไม้

2

C # / LINQ:

using System;
using System.Linq;

namespace SawtoothAlphabet
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = Int32.Parse(args[0]);   // eg 4
            Console.WriteLine(
                String.Join(Environment.NewLine, Enumerable.Range(0, N).Select(line =>
                    String.Concat(Enumerable.Range(0, 26).Select(i =>
                        line == Math.Abs(i % (2 * (N - 1)) - (N - 1))
                            ? (i == 2) ? "C#" : Char.ConvertFromUtf32(i + 'A')
                            : (i == 2) ? "  " : " ")
            ).TrimEnd())));
        }
    }
}

คำอธิบายสั้น ๆ : Enumerable.Range(0, N).Select(...)ทำให้สตริงที่จะสร้างสำหรับแต่ละบรรทัดซึ่งในที่สุดก็ตัดแบ่งเป็นสตริงเดียวกับในString.Join(Environment.NewLine, ...)ที่สุด สำหรับแต่ละบรรทัดเราวนรอบทั้ง 26 อักขระด้วยEnumerable.Range(0, 26).Select(...)การทดสอบที่จุดเริ่มต้นของการแสดงออกแลมบ์ดาจะกำหนดว่าจะสร้างตัวละครหรือช่องว่างในขณะที่i==2ตรวจสอบ "C" และแปลงเป็น "C #" หรือสองช่องว่างขึ้นอยู่กับบรรทัด . การString.Concat(...)แปลงผลลัพธ์IEnumerable<char>สำหรับแต่ละบรรทัดเป็นสตริงก่อนที่จะส่งผ่านไปTrimEnd(...)ยังเพื่อลบล้าง whitespace ที่ต่อท้ายใด ๆ


1

PHP (216) (205)

เวอร์ชั่นใหม่:

$b=array_fill(65,26,' ');$b[80]='   ';$b=array_fill(0,$i,$b);for($j=--$i,$x=64;++$x<91;$i||$j=0){$b[$j][$x]=chr($x);$x==80&&$b[$j][$x]='PHP';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

เวอร์ชั่นเก่า:

$b=array_fill(0,$i,array_fill(0,28,' '));for($j=--$i,$x=-1;++$x<28;$i||$j=0){$q=&$b[$j];$q[$x]=chr($x-($x&16)/8+65);$x==15&&($q[++$x]='H')*$q[++$x]='P';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

คาดว่าตัวแปร $ i จะสูง


1

C, 214 169 ไบต์ไม่มีช่องว่างต่อท้าย

ขอบคุณ @ edc65 และ @tolos สำหรับคำแนะนำที่เป็นประโยชน์

#define C ((c-i+n-65)%z&&(c+i+n-67)%z)
n,i,m,c,z;main(){scanf("%d",&n);z=n<2?1:2*n-2;for(;i++<n;){for(m=c=64;c++<90;)m=C?m:c;for(c=64;c++<m;)putchar(C?32:c);puts("");}}

3
มันเป็นการต่อสู้ที่พ่ายแพ้ แต่ฉันยืนยันว่า: #include <stdio.h> ไม่จำเป็นในหลาย ๆ กรณีไม่ว่าจะเป็น gcc หรือคอมไพเลอร์อื่น ๆ มันเป็นมาตรฐานและถูกต้อง C อยู่แล้ว
edc65

2
@ edc65: ขึ้นอยู่กับสิ่งที่คุณพิจารณาว่า "ถูกต้อง C" เป็น AFAIK ที่ถูกต้อง K&R C แต่ ANSI / ISO C ต้องการฟังก์ชั่น Variadic (ซึ่งรวมถึงscanfและprintf) จะได้รับต้นแบบมิฉะนั้นคุณจะได้รับพฤติกรรมที่ไม่ได้กำหนด #include <stdio.h>เป็นของหลักสูตรทางที่สั้นที่สุดที่จะให้เป็นแบบอย่างที่ดีกับทั้งสองและscanf printf
celtschk

@celtschk ที่ถูกต้อง K&R เพียงพอสำหรับฉันในการตีกอล์ฟ และ 'ในหลายกรณี' (เมื่อใช้การใส่ตัวอย่าง) เป็น C89 ที่ถูกต้อง สิ่งที่ฉันต้องการความเครียดคือนั่นไม่ใช่พฤติกรรมแปลก ๆ ของ gcc (คนที่ต้องการทราบเกี่ยวกับฟังก์ชั่น
Variadic

1
Globals เป็นประเภท int และเริ่มต้นเป็นศูนย์ อาจปล่อยintการประกาศสำหรับ main หากคุณไม่ส่งคืนสิ่งใด สามารถวาง parens พิเศษแทนที่' 'ด้วย32และif(!C)m=cด้วยคำสั่ง ternarny และในขณะที่ฉันเพิ่งเรียนรู้ (ด้านบน) แทนที่printf("\n")ด้วยputs("")18 ตัวอักษร:n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}

1

Javascript ( 204 185 150)

h=m=4;d=h>1?-1:0;o=[];for(a=0;a<35;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m+=d;if(m<2||m==h)d=-d}}console.log(o.join("\n"))

แก้ไข

บันทึกแล้ว 13 ไบต์โดยไม่สร้างอาร์เรย์และ. join ("\ n") จำเป็นต้องมีการพลิกลูปสำหรับ จากนั้นด้วยความช่วยเหลือจาก C coding son ทำให้รหัสฉลาดเกินกว่าจะบันทึกได้ 12 ไบต์

นี่คือเวอร์ชันที่สามารถอ่านได้ซึ่งแสดงการเปลี่ยนแปลงเชิงตรรกะ

for (row = height; row; row--) {
    rowOfNextActiveLetter = 1;
    direction = height > 1 ? -1 : 0;
    output = "";
    for (a = 0; a < 35; a++) {
        output += (row == rowOfNextActiveLetter ? "ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a] : "");
        if (a < 9 || a > 17) {
            rowOfNextActiveLetter -= direction;
            if (rowOfNextActiveLetter < 2 || rowOfNextActiveLetter == height)direction = -direction
        }
    }
    console.log(output)
}

เล่นกอล์ฟ (161):

for(r=h;r;r--){m=1;d=h>1?-1:0;o="";for(a=0;a<35;a++){o+=(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m-=d;if(m<2||m==h)d=-d}}console.log(o)}

ตีกอล์ฟและงง (149):

for(r=h;r;r--,console.log(o))for(m=1,d=h>1?1:0,o="",a=0;a<35;)if(o+=r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ",a<9|a++>17)d=(m+=d)<2|m==h?-d:d

ฉันชอบมันแม้ว่าฉันจะไม่เข้าใจมันเต็ม แต่อย่างไรก็ตามคุณสามารถตัด 9 chars เพื่อลบ substrings และใช้ direct index .substr(a,1)=>[a]
edc65

คุณสามารถ จำกัด ให้แคบลงได้โดยใช้ตัวดำเนินการระดับบิตและรวมตัววนซ้ำสำหรับ 182: h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
WallyWest

อ๊ะทำความสะอาดพื้นที่มากเกินไปหนึ่งอัน
John Nowlin

1

K, 60 ไบต์

`0:'{+{x!y}.'+(26#{(!x),|1_!x-1}x;(((x-1)#" "),)'`c$65+!26)}

ค่อนข้างตรงไปตรงมาและดูเหมือนว่าฉันเพิ่งจะแก้ปัญหาเจ :)

ขั้นแรกสร้างตัวอักษร:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

และคลื่นความยาวที่เหมาะสม:

  26#{(!x),|1_!x-1}5
0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1

วางตัวอักษรแต่ละตัวโดยมีช่องว่างนำหน้า:

  (((5-1)#" "),)'"ABC"
("    A"
 "    B"
 "    C")

ซิปตัวอักษรและคลื่นสี่เหลี่ยมเข้าด้วยกันแล้วหมุนแต่ละแถว:

  +(0 1 2;("  A";"  B";"  C"))
((0
  "  A")
 (1
  "  B")
 (2
  "  C"))

  {x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  A"
 " B "
 "C  ")

และการขนย้ายของนั่นคือคำตอบของเรา:

  +{x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  C"
 " B "
 "A  ")

ลองมันนี่ในoK


0

C: 142 139 ตัวอักษร

นานมากฉันคาดว่าจะสามารถย่อให้สั้นลงได้เล็กน้อย:

char a[26][27],i,j,p,d;main(n){for(scanf("%d",&n);i<26;d^=!p^p+2>n,p+=d-(d^n>1),i++)for(j=n;j--;a[j][i]=p^j?32:i+65);while(n)puts(a[--n]);}

อ่านง่ายขึ้นเล็กน้อย:

char a[26][27], i, j, p, d;
main(n) {
    for (
        scanf("%d", &n);
        i < 26;
        d ^= !p ^ p + 2 > n,
        p += d - (d ^ n > 1),
        i++
    )
        for (
            j = n;
            j--;
            a[j][i] = p ^ j
                ? 32
                : i + 65
        );

    while (n)
        puts(a[--n]);
}

แก้ไข: ฉันพลาด "ไม่มีช่องว่างต่อท้าย" - กฎ แต่ฉันจะกลับมา


0

สกาลา, 246 ไบต์

def f(h:Int)={val a=Seq.fill(h)(Array.fill(32)(' '));var(r,x,d)=(h-1,0,if(h==1)0 else-1);def p(c:Char){a(r)(x)=c;x+=1};for(c<-'A'to'Z'){p(c);if(c==83)"cala"foreach p;r+=d;if(r==0|r==h-1)d*= -1};for(z<-a)println(new String(z)replaceAll(" +$",""))}

ฟอร์แมตใหม่และแสดงความคิดเห็น:

def f(h: Int) = {
  val a = Seq.fill(h)(Array.fill(32)(' '));
  // r - row; x - x coordinate, column; d - direction
  var (r, x, d) = (h - 1, 0, if(h==1) 0 else -1); 
  def p(c: Char) { // p for "put the character"
    a(r)(x) = c;
    x += 1
  };
  for(c <- 'A' to 'Z') { 
    p(c);
    if(c == 83)      // 83 == 'S'
      "cala" foreach p;
    r += d;
    if(r == 0 | r == h - 1)     // | is shorter than || 
      d *= -1
  };
  for(z <- a)
    println(new String(z) replaceAll (" +$", ""))  // trimming trailing whitespace
}

ผล:

scala> f(4)
   D     J     P         V
  C E   I K   O Q       U W
 B   F H   L N   R     T   X Z
A     G     M     Scala     Y

scala> f(5)
    E       M           U
   D F     L N         T V
  C   G   K   O   Scala   W
 B     H J     P R         X Z
A       I       Q           Y

scala> f(1)
ABCDEFGHIJKLMNOPQRScalaTUVWXYZ

0

Python - 137

อินพุตที่จะเก็บไว้ใน ieg i=8

l=[""]*h;k=j=0;y=h-1;exec'l[y]+=" "*(j-len(l[y]))+chr(k+65)+"ython"*(k==15);j=len(l[y]);y-=1^k/(h-(h>2))%2*-2;k+=1;'*26;print"\n".join(l)

0

แร็กเกต

นี่เป็นเวอร์ชั่นที่ใช้งานได้ดี: ให้คำแนะนำเพื่อย่อให้สั้นลง

(define (sawtooth n)
  (define (ST i d m lns)
    (if (null? m) 
        lns
        (let* ([v (first m)]
               [spc (make-string (string-length v) #\space)]
               [I (+ i d)])
          (ST I
              (if (or (zero? I) (= (sub1 n) I)) (* d -1) d)
              (rest m)
              (for/list ([ln lns] [j n])
                       (~a ln (if (= i j) v spc)))))))
  (displayln
   (string-join 
    (ST (sub1 n)
        (if (= n 1) 0 -1) 
        (string-split "A B C D E F G H I J K L M N O P Q Racket S T U V W X Y Z")
        (make-list n "\n")))))

เอาท์พุต

> (sawtooth 1)
ABCDEFGHIJKLMNOPQRacketSTUVWXYZ

> (sawtooth 2)
 B D F H J L N P Racket T V X Z 
A C E G I K M O Q      S U W Y 

> (sawtooth 8)
       H                  V     
      G I                U W    
     F   J              T   X   
    E     K            S     Y  
   D       L     Racket       Z 
  C         M   Q               
 B           N P                
A             O  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.