Vẽ bảng chữ cái Sawtooth


42

Một ngày đơn giản. Viết chương trình ngắn nhất vẽ "bảng chữ cái răng cưa" với số nguyên dương cho chiều cao. Bạn phải viết tên ngôn ngữ lập trình của bạn khi bạn bắt đầu với chữ cái mà nó bắt đầu bằng.

Ví dụ: nếu ngôn ngữ của bạn là Python và đầu vào là 1đầu ra phải là:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Nếu đầu vào là 2đầu ra nên:

 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

Nếu đầu vào là 4đầu ra nên:

   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

Ghi chú

  • A luôn luôn bắt đầu ở phía dưới bên trái.
  • Đầu vào có thể thông qua stdin hoặc chức năng gọi hoặc tương tự. Đầu ra cho thiết bị xuất chuẩn.
  • Đầu vào ở trên 26không cần phải làm việc.
  • Không có dấu cách.

9
Các ngôn ngữ lập trình có tên một chữ cái được phép không? (C, J, K, v.v.)
isaacg

@isaacg Chắc chắn rồi. Tôi tưởng tượng nó có thể dễ dàng hơn ở họ.
Sở thích của Calvin

1
Đầu vào đơn giản có thể được dự kiến ​​sẽ được lưu trữ trong một biến?
Martin Ender

@ MartinBüttner Vâng, điều đó tốt.
Sở thích của Calvin

13
Btw, đây không phải là sóng răng cưa, đây là sóng tam giác: P
qwr

Câu trả lời:


14

nếu n giữ chiều cao:

Mã thoát 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
Tôi thừa nhận thất bại. Những gì trên trái đất. : D
Martin Ender

Tôi có thể yêu cầu hướng dẫn biên soạn không? ccđưa ra lỗi "<bebe.c: 1: 17: error: 'n' không được khai báo (lần đầu tiên sử dụng chức năng này).
manatwork

2
tốt, nó là cách tồi tệ hơn nó trông. đầu tiên là cái thứ hai chứa các khoảng trắng ở cuối, thứ hai cả hai đều dựa vào đó nlà một biến toàn cục được đặt thành một số lựa chọn của bạn (như Martin đã hỏi trước đó).
bebe

Ồ, vậy tôi phải cung cấp n bằng mọi cách có thể. Cười ngả nghiêng. Vẫn ấn tượng.
manatwork

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

Biên dịch trên gcc với một vài cảnh báo. Dòng mới không bao gồm trong số lượng nhân vật.

122 ký tự nếu đầu vào đã được lưu trữ trong n.

Cảm ơn user2992539 , tolosedc65 để cải tiến.


3
Bạn có thể sử dụng puts("")thay vì printf("\n").
Somnium

2
Lưu 4 ký tự p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);thay vìif((c-...

1
Xin lỗi vì nhận xét (đã xóa) trước đó. Tôi đã sai. Chơi với các dấu hiệu và lạm dụng thực tế là đối số đầu tiên của chính là 1 nếu không có tham số: 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 byte (văn bản thô), 186 byte (đồ họa)

Để đáp ứng với OP, TI-83 tuyệt vời (và mới hơn) có kích thước 16 x 8 (chỉ sử dụng văn bản lớn tiêu chuẩn) hoặc với kích thước 94 x 62 pixel (với văn bản nhỏ có giá trị khoảng 10 dòng ).

Bây giờ, điều này có một vấn đề nhỏ (mà tôi muốn làm rõ). Các áp đặt kích thước không thể bị "bỏ qua" bởi trình thông dịch; nói cách khác, nếu chúng ta cố gắng đặt chiều cao răng cưa ở mức 20, thì nó sẽ gây ra lỗi ngăn chặn việc thực thi toàn bộ mã. Tôi có thể viết mã, trong một môi trường vô hạn, tạo ra đầu ra chính xác, ngoại trừ nó sẽ không chạy trên máy.

Với điều này đang được nói, tôi giới thiệu cho bạn các phiên bản (đang chạy) của các chương trình. Tất cả đều phụ thuộc vào biến Nđược đặt thành chiều cao mong muốn trong các dòng trước khi chạy:

  • Phương pháp tiếp cận văn bản thô

    :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
    

    Để thực hiện công việc này không phụ thuộc vào thiết bị đầu cuối, thay đổi For(C,1,16đến For(C,1,33và loại bỏ các kiểm tra ràng buộc trên ( R<2 or). Đây là đầu ra với 5→N:

    nhập mô tả hình ảnh ở đây

  • Cách tiếp cận đồ họa (điều này cũng có thể cần AxisOffcho rõ ràng)

    :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
    

    Cái này hoạt động tốt, với hai quirks nhỏ. Chiều cao vẫn là một vấn đề, mặc dù chiều rộng không. Tuy nhiên, tôi đã không lưu các chữ cái, vì vậy trong một số trường hợp (khi chữ bắt đầu tăng hoặc giảm từ răng cưa), các chữ cái có thể bị cắt bởi những người kế nhiệm. Để làm cho nó hoạt động bất kể thiết bị đầu cuối, hãy loại bỏ kiểm tra giới hạn trên ( R<7 or). Sau đó theo biểu đồ:

    nhập mô tả hình ảnh ở đây


Bây giờ tôi phải chuyển cái này sang máy tính vẽ đồ thị của mình
Liam McInroy

Nhận xét nhanh: Thay vì 0→Fbạn có thể thực hiện việc Delvar Flưu 1 byte một lần token hóa. Ngoài ra, tôi chắc chắn rằng bạn có thể đưa yếu tố Đầu ra / Văn bản đến cuối nhờ điều kiện kiểm tra boolean nội tuyến cho tọa độ và đối với C+7→C, hãy viết nó trong một thời gian ngắn nếu (không sau đó / khác / kết thúc)
Adriweb

11

Pure Bash (không có coreutils), 181 byte

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[@]%%+( )}"

Đầu ra:

Đường ống để cat -Echỉ để chứng minh không có dòng mới.

$ ./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

Chỉnh sửa sửa lỗi, một số sắp xếp lại và một cách quản lý chiều cao khác == 1
Hơn nữa, đã thay đổi thành một chức năng do OP cho phép, do đó không có dấu nhắc () cho đầu vào

Không có thay đổi đối với thuật toán chung có lẽ KHÔNG phải là tốt nhất cho thử thách này

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

Giải thích

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

Ví dụ

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 đi lên

  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 trên đầu

   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 đi xuống

      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)

Luôn luôn là một ngôn ngữ tuyệt vời để chơi golf:

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
Thật không may, bạn quên nhập khẩu cho java.util.Arrays;. :-(
Justin

Nhưng bạn có thể áp dụng mã của mình: loại bỏ String x="ABC...Z";và thay thế for(char c...tiêu đề vòng lặp bằng for (char c=65;++c<91;){, tôi yêu các ký tự trong Java =)
flawr

Hơn nữa bạn có thể thay thế c=='J'bằng c==74, tiết kiệm tổng cộng hai byte.
flawr

2
Tôi chắc chắn rằng bạn có thể làm tốt hơn nữa nếu bạn ngưng tụ nếu bạn sử dụng một số XOR cho những câu lệnh if đó, nhưng ở đây phiên bản cải tiến của tôi: (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: không cần nhập nữa.util.Arrays; =)
flawr

9

Ruby, 112 byte

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

Dự kiến ​​đầu vào sẽ được lưu trữ trong h.

Hãy cho tôi biết nếu điều này cần làm rõ.


Rất nhỏ nhưng bạn có thể loại bỏ không gian sau %.
Sở thích của Calvin

@ Calvin'sHob sở thích Ha, tôi không tin vào cú pháp của mình làm nổi bật ở đó: D. Sẽ sửa nó sau.
Martin Ender

Bạn có thể thay thế puts o...bằng $><<o....
Jordan

6

J: 75 byte

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

Sử dụng kết hợp sửa đổi tuyệt vời . Như thường lệ, IO xấu xí và cồng kềnh, không đi sâu vào chi tiết ở đó. Giải pháp cốt lõi cần 3 gerunds (một loại động từ danh từ-ified (aka. Hàm)):

  • a) tạo ra bảng chữ cái
  • b) tạo ra các chỉ số
  • c) tạo ma trận để sửa đổi

    x (a bc}) y

a) là một tra cứu khá nhỏ trong bảng ascii

c) thậm chí còn tầm thường hơn

b) là một trong những thú vị. Tinh thần là các chỉ số theo chiều ngang được cho là bắt đầu từ 0 đến y-1 và quay trở lại, lặp lại điều này 26 lần. Ví dụ. cho y == 4:

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

Thực hiện điều này mang lại cho 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.

Và ồ, thực tế tiện dụng: Tên của J là ... "J".


Có đáng để sử dụng sửa đổi? Tôi có vẻ dễ dàng hơn để nói một cái gì đó như 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'Phần xấu xí trong giải pháp đó là 8 ký tự chỉ cho trường hợp đặc biệt chiều cao 1, nhưng điều này có lẽ có thể rút ngắn một chút.
b_jonas

Cám ơn vì sự gợi ý! Bạn thực sự ngắn hơn rất nhiều, và sửa đổi có lẽ là quá mức cần thiết. Vì nó quá khác biệt, có lẽ bạn muốn tự mình đăng nó như một giải pháp?
jpjacobs

Thông số kỹ thuật nói "không có dấu cách" và giải pháp của tôi không in dấu cách.
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="")
}

Kết quả

> 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 

Tôi thấy những gì bạn đã làm ở đó! Rất thông minh ...
Kroltan

1
+1 gọn gàng! Bạn có thể thoát khỏi khoảng trắng xung quanh forcâu lệnh của bạn ( for(i in 1:x)cat(...ví dụ) hoặc khoảng trống xung quanh %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(""))

Đây là một liên kết đến jsfiddle, nơi bạn có thể kiểm tra nó.
chỉnh sửa: Tạo nhật ký giao diện điều khiển cho phông chữ đơn cách và xóa dấu phẩy nếu input == 1.


Gợi ý: 1: parseInt và Math.floor đều có thể được thay đổi với một hoạt động ép buộc số nguyên như |0hoặc ~~. 2: ngắn hơn để xây dựng mảng w trực tiếp mà không cần split. for(w=[],v=0;v<z;v++)w[v]="\n";
edc65

... và không có câu lệnh đầu ra (console.log hoặc bất cứ điều gì bạn sử dụng trong fiddle của mình, đó là một phần của số char)
edc65

@ edc65 Cảm ơn bạn đã cho lời khuyên. Bạn đã đúng Tôi quên đầu ra ở đây vì vậy tôi đã thêm một cảnh báo, nhưng không có phông chữ đơn cách nhau nên nó trông khá hỗn loạn.
izlin

@izlin Thay vì (i==9?" ":" ")bạn có thể sử dụng (i^9?" ":" "), giúp lưu một ký tự.
rev

1
CỨU GIÚP! bất cứ ai có thể giải thích? (Tại sao có hai lần <code> v = 0 </ code>?)
flawr

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

Chương trình này lấy đầu vào từ STDINvà in kết quả đến STDOUT.

Và phần thưởng - một phiên bản trái với quy tắc khi nó in các dấu cách, nhưng thêm một số tương tác:

#!/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=$_)

... và một số bài kiểm tra dưới đây:

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 ký tự

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

Sử dụng như một chức năng:

   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

Giải thích: giải pháp này sử dụng một cách tiếp cận khác với giải pháp J khác. Thay vì tạo ra sóng răng cưa 0 1 2 3 2 1 0 1 ... , tôi đã xem xét khoảng cách giữa các chữ cái liên tiếp. Ví dụ, đối với n = 4 nếu bạn đi từ A trở lên, quấn qua cột thứ hai và tầm B, sau đó bạn tìm thấy bốn không gian giữa A và B. mô hình này khoảng cách giữa các chữ cái là rất thường xuyên: cho n = 4 sự mô hình là 4 4 4 2 2 2 4 4 4 ... .

Vì vậy, ý tưởng là đầu tiên xây dựng mảng dẹt (và hoán vị), sau đó định hình lại và lật nó để nó trông đúng. Thói quen đầu ra rất đơn giản (ít nhất là J): dtb là "xóa khoảng trống theo dõi" và "1nói "hoạt động trên mỗi dòng". dtbecho đều được cung cấp bởi thư viện chuẩn.

Cảm ơn Zsbán Ambrus vì đã giúp đỡ chơi golf.


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;

nhập mô tả hình ảnh ở đây

Bạn có thể thử nó ở đây.


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

Điều chỉnh nhỏ và chúng tôi xuống tới 213.

Bản gốc có một lỗi nhỏ. Đã thử nghiệm và xác nhận để hoạt động trên phiên bản bash 4.2.37.

Cảm ơn @manatwork đã chỉ ra lỗi và một số mẹo.


Tôi đã chỉnh sửa bài đăng của bạn bằng cách thêm đánh dấu cú pháp vào nó, nhưng bây giờ tôi thấy rằng nó đã đánh dấu sai một phần mã của bạn dưới dạng một nhận xét, vì vậy tôi đã cuộn lại. Tôi chỉ nói điều này trong trường hợp bạn đang tự hỏi tại sao tôi lại quay lại :)
Chương trìnhFOX

@ProgramFOX Không sao đâu. Dù sao cũng cảm ơn!
Okw

Tôi nghĩ rằng có một lỗi nhỏ ở đâu đó, vì đầu ra đang dần giảm dần. (. Ít nhất trong Bash 4.3) Một số cải tiến nhỏ để giảm kích thước đến 194 ký tự: Bỏ qua sigil trong việc đánh giá số học, không nên cố gắng tăng gấp đôi-quote bên trong chuỗi dụng dấu ngoặc kép: pastebin.com/zKa3zdwR
manatwork

Bạn có thể sử dụng các dòng mới thay vì một số ;chỉ để làm cho nó dễ đọc hơn một chút không? Nó sẽ không ảnh hưởng đến điểm số golf của bạn
Chấn thương kỹ thuật số

2

Haskell - 432 Byte (không may ...)

Điều này hóa ra khó hơn nhiều so với tôi dự kiến ​​sẽ hoàn thành, do đó, số lượng byte quá lớn. Tôi chắc chắn rằng tôi (hoặc ai đó) có thể làm tốt hơn, nhưng tôi đã dành quá nhiều thời gian cho việc này. Phiên bản chơi gôn như sau:

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]]

Để chạy, tải mã vào ghcivà thực hiện putStr $ s Intở đâu Intlà chiều cao mong muốn của bạn. Bạn cũng có thể thêm

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

bên dưới imports trong tệp văn bản, biên dịch nó ghcvà chuyển chiều cao dưới dạng đối số dòng lệnh. Phiên bản bị đánh cắp:

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] ]

Tôi tin rằng bạn có thể thay thế constbằng pure(sử dụng ví dụ Ứng dụng cho các hàm) để lưu một vài byte.
Trái cây Esolanging

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

Giải thích ngắn gọn: Enumerable.Range(0, N).Select(...)làm cho một chuỗi được tạo cho mỗi dòng cuối cùng được nối thành một chuỗi với String.Join(Environment.NewLine, ...). Đối với mỗi dòng chúng tôi chuyển qua tất cả 26 ký tự Enumerable.Range(0, 26).Select(...), kiểm tra khi bắt đầu biểu thức lambda xác định xem có tạo ký tự hoặc i==2khoảng trắng trong khi kiểm tra "C" và chuyển đổi thành "C #" hoặc hai khoảng trắng tùy thuộc vào dòng . Việc String.Concat(...)chuyển đổi kết quả IEnumerable<char>cho mỗi dòng thành một chuỗi trước khi chuyển nó sang TrimEnd(...)để loại bỏ sạch mọi khoảng trắng ở cuối.


1

PHP (216) (205)

Phiên bản mới:

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

Phiên bản cũ:

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

mong đợi biến $ i là chiều cao.


1

C, 214 169 byte, không có dấu cách

Cảm ơn @ edc65 và @tolos vì những gợi ý hữu ích của họ.

#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
Đó là một trận chiến thua, nhưng tôi vẫn kiên trì: #include <stdio.h> không cần thiết trong nhiều trường hợp, có thể là gcc hoặc bất kỳ trình biên dịch nào khác. Đó là C tiêu chuẩn và hợp lệ nào.
edc65

2
@ edc65: Phụ thuộc vào những gì bạn cho là "C hợp lệ". Đó là K & R C hợp lệ của AFAIK, nhưng ANSI / ISO C yêu cầu các chức năng dao động (bao gồm scanfprintf) được đưa ra các nguyên mẫu, nếu không bạn sẽ có hành vi không xác định. #include <stdio.h>tất nhiên, là cách ngắn nhất để đưa ra một nguyên mẫu cho cả hai scanfprintf.
celtschk

@celtschk K & R hợp lệ là đủ cho tôi trong môn đánh gôn. Và 'trong nhiều trường hợp' (khi chỉ sử dụng đặt chẳng hạn) là C89 hợp lệ. Điều tôi muốn nhấn mạnh là đó không phải là một hành vi kỳ lạ của gcc. (Dù sao thì cũng cần lưu ý về các hàm
matrixdic

1
Globals là loại int và khởi tạo bằng không. Cũng có thể bỏ intkhai báo cho chính nếu bạn không trả lại bất cứ điều gì. Có thể thả thêm parens, thay thế ' 'bằng32if(!C)m=cvới một tuyên bố ternarny, và như tôi chỉ học được (ở trên) thay thế printf("\n")với puts("")18 ký tự: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"))

BIÊN TẬP

Đã lưu 13 byte bằng cách không xây dựng một mảng và .join ("\ n"). Yêu cầu lật các vòng lặp. Sau đó, với sự giúp đỡ từ con trai mã hóa C, đã tạo mã hoàn toàn quá thông minh để tiết kiệm thêm 12 byte.

Đây là phiên bản có thể đọc được cho thấy sự thay đổi logic.

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

Chơi gôn (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)}

Chơi gôn và bị xáo trộn (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

Tôi thích nó ngay cả khi tôi không hiểu nó đầy đủ. Nhưng dù sao bạn cũng có thể cắt 9 ký tự loại bỏ chất nền và sử dụng chỉ mục trực tiếp .substr(a,1)=>[a]
edc65

Bạn có thể thu hẹp nó hơn nữa bằng cách sử dụng các toán tử bitwise và liên kết các vòng lặp cho 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

Rất tiếc, đã dọn sạch quá nhiều không gian
John Nowlin

1

K, 60 byte

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

Khá đơn giản, và có vẻ như tôi vừa tìm ra giải pháp J. :)

Đầu tiên, tạo một bảng chữ cái:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Và một làn sóng răng cưa có độ dài phù hợp:

  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

Pad từng chữ cái của bảng chữ cái với không gian hàng đầu:

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

Nén bảng chữ cái và sóng vuông với nhau và xoay từng hàng:

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

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

Và sự hoán vị của điều đó là câu trả lời của chúng tôi:

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

Hãy thử nó ở đây trong oK .


0

C: 142 139 ký tự

Dài khủng khiếp, tôi hy vọng có thể rút ngắn nó một chút:

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

Hơi dễ đọc hơ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]);
}

Chỉnh sửa: Tôi đã bỏ lỡ "không có dấu cách" -rule, nhưng tôi sẽ trở lại.


0

Scala, 246 byte

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(" +$",""))}

định dạng lại và nhận xét:

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
}

Các kết quả:

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

Con trăn - 137

Đầu vào được lưu trữ trong 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

Vợt

Đây là một phiên bản chức năng sạch: đề xuất để rút ngắn nó chào đón.

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

Đầu ra

> (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  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.