Gambarkan Alfabet Gigi Gergaji

42

Yang sederhana hari ini. Tuliskan program terpendek yang menggambar "alfabet gigi gergaji" yang diberi bilangan bulat positif untuk ketinggian. Anda harus menulis nama bahasa pemrograman Anda ketika Anda datang ke surat itu dimulai dengan.

Misalnya, jika bahasa Anda adalah Python dan inputnya adalah 1outputnya harus:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Jika inputnya adalah 2output harus:

 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

Jika inputnya adalah 4output harus:

   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

Catatan

  • A selalu dimulai di kiri bawah.
  • Input dapat melalui stdin atau panggilan fungsi atau yang serupa. Output ke stdout.
  • Masukan di atas 26tidak perlu bekerja.
  • Tidak ada spasi tambahan.
Hobi Calvin
sumber
9
Apakah bahasa pemrograman dengan satu nama huruf diizinkan? (C, J, K, dll.)
isaacg
@isaacg Tentu. Saya membayangkan mungkin lebih mudah bagi mereka.
Hobi Calvin
1
Bisakah input hanya diharapkan disimpan dalam variabel?
Martin Ender
@ MartinBüttner Ya, tidak apa-apa.
Hobi Calvin
13
Btw, ini bukan gelombang gigi gergaji, ini adalah gelombang segitiga: P
qwr

Jawaban:

14

jika n menahan tinggi:

C + kode pelarian: 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);}
bebe
sumber
5
Saya akui kekalahan. Apa yang ada di bumi. : D
Martin Ender
Bolehkah saya meminta instruksi kompilasi? ccmemberikan kesalahan "<bebe.c: 1: 17: error: 'n' tidak dideklarasikan (digunakan pertama kali dalam fungsi ini)".
manatwork
2
Yah itu jauh lebih buruk daripada yang terlihat. pertama, yang kedua berisi spasi tambahan, kedua keduanya bergantung pada itu nadalah variabel global yang disetel ke sejumlah pilihan Anda (seperti yang ditanyakan Martin).
bebe
Oh, jadi aku harus menyediakan dan dengan cara apa pun aku bisa. Lol. Masih terkesan.
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);
}

Kompilasi pada gcc dengan beberapa peringatan. Baris baru tidak termasuk dalam jumlah karakter.

122 karakter jika input sudah tersimpan n.

Terima kasih kepada user2992539 , tolos dan edc65 untuk peningkatan.

grc
sumber
3
Anda bisa menggunakan puts("")bukan printf("\n").
Somnium
2
Simpan 4 karakter dengan p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);alih - alihif((c-...
1
Maaf atas komentar sebelumnya (yang dihapus). Saya salah. Bermain dengan tanda-tanda dan menyalahgunakan fakta bahwa argumen utama utama adalah 1 jika tidak ada parameter: 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 (teks mentah), 186 byte (grafik)

Menanggapi OP, TI-83 yang luar biasa (dan yang lebih baru) hadir dengan ukuran 16 x 8 (hanya menggunakan teks besar standar) atau dengan ukuran 94 x 62 piksel (yang dengan teks kecil bernilai sekitar 10 baris) ).

Sekarang, ini memiliki sedikit masalah (yang ingin saya klarifikasi). Penentuan ukuran tidak dapat "diabaikan" oleh penerjemah; dengan kata lain, jika kita mencoba mengatur ketinggian gigi gergaji pada 20, itu akan memberikan kesalahan mencegah eksekusi penuh kode. Saya dapat menulis kode yang akan, dalam lingkungan yang tak terbatas, menghasilkan output yang benar, kecuali itu tidak akan berjalan pada mesin.

Dengan ini dikatakan, saya hadir Anda versi (menjalankan) program. Semuanya tergantung pada variabel Nyang disetel ke ketinggian yang diinginkan dalam baris sebelum dijalankan:

  • Pendekatan teks mentah

    :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
    

    Dalam rangka untuk membuat karya ini terlepas dari terminal, perubahan For(C,1,16untuk For(C,1,33dan menghapus pengecekan batas atas ( R<2 or). Ini adalah output dengan 5→N:

    masukkan deskripsi gambar di sini

  • Pendekatan grafis (ini mungkin juga perlu AxisOffkejelasan)

    :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
    

    Yang ini berfungsi OK, dengan dua quirks kecil. Ketinggian masih menjadi masalah, meskipun lebarnya tidak. Namun, saya tidak memberi spasi pada surat-surat itu, jadi dalam beberapa kasus (ketika surat itu mulai naik atau turun dari gigi gergaji), surat-surat itu mungkin dipotong oleh penerusnya. Untuk membuatnya berfungsi terlepas dari terminal, hapus centang batas atas ( R<7 or). Kemudian ikuti grafik:

    masukkan deskripsi gambar di sini

Doktoro Reichard
sumber
Sekarang saya harus port ini ke kalkulator grafik saya
Liam McInroy
Komentar cepat: Alih-alih 0→FAnda dapat melakukan Delvar Fyang menghemat 1 byte sekali tokenized. Juga, saya yakin Anda dapat memfaktorkan Output / Teks menjelang akhir berkat kondisi uji boolean sebaris untuk koordinat tersebut, dan untuk itu C+7→C, tuliskan dalam waktu singkat if (no then / else / end)
Adriweb
11

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

Keluaran:

Diputar cat -Ehanya untuk membuktikan bahwa tidak ada baris baru yang tertinggal.

$ ./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$
$ 
Trauma Digital
sumber
10

JavaScript (ES6) 231 244

Edit perbaikan Bug, beberapa pemesanan ulang dan cara mengelola ketinggian yang berbeda == 1
Selain itu, diubah ke fungsi karena diizinkan oleh OP, jadi tidak ada prompt () untuk input

Tidak ada perubahan pada algoritma umum yang mungkin BUKAN yang terbaik untuk tantangan ini

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

Dijelaskan

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

Contohnya

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 naik

  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 di atas

   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 turun

      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
edc65
sumber
9

JAVA (393)

Seperti biasa bahasa yang bagus untuk bermain 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);}}}
Thomas Rüping
sumber
2
Sayangnya, Anda lupa impor untuk java.util.Arrays;. :-(
Justin
Tetapi Anda dapat memperbaiki kode Anda: menghilangkan String x="ABC...Z";dan mengganti for(char c...loop header dengan for (char c=65;++c<91;){, saya suka karakter di Java =)
flawr
Selanjutnya Anda dapat mengganti c=='J'dengan c==74, menyimpan total dua byte lagi.
flawr
2
Saya yakin Anda dapat melakukan yang lebih baik lagi jika Anda menyingkat jika Anda menggunakan beberapa XOR untuk pernyataan if, tetapi di sini versi saya yang ditingkatkan: (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: tidak perlu lagi untuk import.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')

Diharapkan input untuk disimpan h.

Beri tahu saya jika ini membutuhkan klarifikasi.

Martin Ender
sumber
Sangat kecil tetapi Anda dapat menghapus ruang setelahnya %.
Hobi Calvin
@ Calvin Hobbies Ha, saya tidak percaya sintaks saya menyoroti di sana: D. Akan memperbaikinya nanti.
Martin Ender
Anda bisa menggantinya puts o...dengan $><<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

Menggunakan perubahan Amand yang indah . Seperti biasa IO jelek dan kikuk, tidak masuk ke detail di sana. Solusi inti mengambil 3 gerunds (semacam kata benda-ified kata kerja (alias. Function)):

  • a) menghasilkan alfabet
  • b) menghasilkan indeks
  • c) menghasilkan matriks untuk menebus kesalahan

    x (ab c}) y

a) adalah pencarian yang cukup sepele di tabel ascii

c) bahkan lebih sepele

b) yang menarik. Moralnya adalah bahwa indeks horizontal seharusnya mulai dari 0 hingga y-1 dan mundur, mengulangi ini sebanyak 26 kali. Misalnya. untuk y == 4:

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

Menerapkan ini memberi untuk 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.

Dan oh ya, fakta praktis: nama J adalah ... "J".

jpjacobs
sumber
Apakah layak menggunakan amand? Sepertinya lebih mudah bagi saya untuk mengatakan sesuatu seperti 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'Bagian buruk dalam solusi itu adalah 8 karakter hanya untuk kasus khusus tinggi 1, tetapi ini mungkin dapat dipersingkat sedikit.
b_jonas
Terima kasih untuk sarannya! Milikmu memang jauh lebih pendek, dan amandemen mungkin berlebihan. Karena sangat berbeda, mungkin Anda ingin mempostingnya sebagai solusi sendiri?
jpjacobs
Spesifikasi mengatakan "tidak ada spasi tambahan" dan solusi saya mencetak spasi tambahan.
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="")
}

Hasil

> 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 
djhurio
sumber
Saya melihat apa yang Anda lakukan di sana! Sangat cerdas ...
Kroltan
1
+1 Rapi! Anda dapat menghilangkan spasi di sekitar forpernyataan Anda ( for(i in 1:x)cat(...misalnya) atau yang ada di sekitar %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(""))

Berikut ini tautan ke jsfiddle, tempat Anda dapat mengujinya.
sunting: Membuat log konsol untuk font monospace dan menghapus koma jika input == 1.

izlin
sumber
Saran: 1: parseInt dan Math.floor dapat diubah dengan operasi paksaan bilangan bulat seperti |0atau ~~. 2: lebih pendek untuk membangun array w secara langsung, tanpa split. for(w=[],v=0;v<z;v++)w[v]="\n";
edc65
... dan tidak ada pernyataan keluaran (console.log atau apa pun yang Anda gunakan dalam biola Anda, itu bagian dari perhitungan char)
edc65
@ edc65 Terima kasih atas tipsnya. Anda benar saya lupa output di sini jadi saya menambahkan peringatan, tetapi tidak ada font mono spaced sehingga terlihat sangat kacau.
izlin
@izlin Alih-alih (i==9?" ":" ")bisa Anda gunakan (i^9?" ":" "), yang menyimpan karakter.
rev
1
MEMBANTU! adakah yang bisa menjelaskan? (Mengapa ada dua kali <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

Program ini mengambil input dari STDIN dan mencetak hasilnya STDOUT.

Dan bonus - versi yang melanggar aturan saat mencetak spasi tambahan, tetapi menambahkan beberapa interaksi:

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

... dan beberapa tes di bawah ini:

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
core1024
sumber
3

J, 67 57 61 karakter

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

Gunakan sebagai fungsi:

   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

Penjelasan: solusi ini menggunakan pendekatan yang berbeda dari solusi J lainnya. Alih-alih menghasilkan gelombang gigi gergaji 0 1 2 3 2 1 0 1 ... , saya melihat jarak antara huruf berturut-turut. Misalnya, untuk n = 4 jika Anda pergi dari A ke atas, bungkus ke kolom kedua dan jangkauan B, maka Anda menemukan empat ruang antara A dan B. Pola jarak antara huruf sangat biasa: untuk n = 4 yang pola adalah 4 4 4 2 2 2 4 4 4 ... .

Jadi idenya adalah untuk pertama-tama membangun array yang rata (dan ditransposisikan), dan kemudian membentuk kembali dan membalikkannya sehingga terlihat benar. Rutin output langsung (untuk menjadi J, setidaknya): dtb adalah "delete trailing blanks" dan "1mengatakan "operasikan pada setiap baris". dtb dan echo keduanya disediakan oleh perpustakaan standar.

Terima kasih kepada Zsbán Ambrus atas bantuan golfnya.

FireFly
sumber
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;

masukkan deskripsi gambar di sini

Anda bisa mencobanya di sini.

cacat
sumber
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

Perubahan kecil dan kita turun ke 213.

Yang asli memiliki bug kecil. Diuji dan dikonfirmasi untuk bekerja pada bash versi 4.2.37.

Terima kasih kepada @manatwork karena menunjukkan bug dan beberapa tips.

Baik w
sumber
Saya mengedit posting Anda dengan menambahkan penyorotan sintaks untuk itu, tetapi sekarang saya melihat bahwa salah menyoroti bagian dari kode Anda sebagai komentar, jadi saya gulung kembali. Saya hanya mengatakan ini jika Anda bertanya-tanya mengapa saya mengembalikannya :)
ProgramFOX
@ProgramFOX Tidak apa-apa. Bagaimanapun, terima kasih!
Okw
Saya pikir ada bug minor di suatu tempat, karena output perlahan turun. (Setidaknya dalam Bash 4.3.) Beberapa perbaikan kecil untuk mengurangi ukuran menjadi 194 karakter: hilangkan sigil dalam evaluasi aritmatika, jangan mencoba untuk membuat penawaran ganda di dalam string yang dikutip ganda: pastebin.com/zKa3zdwR
manatwork
Bisakah Anda menggunakan baris baru alih-alih ;hanya untuk membuatnya sedikit lebih mudah dibaca? Ini tidak akan memengaruhi skor golf Anda
Trauma Digital
2

Haskell - 432 Bytes (sayangnya ...)

Ini ternyata jauh lebih sulit daripada yang saya harapkan untuk diselesaikan murni, karena itu jumlah byte yang lumayan. Saya yakin saya (atau seseorang) bisa melakukan yang lebih baik, tetapi saya telah menghabiskan terlalu banyak waktu untuk hal ini. Versi golf adalah sebagai berikut:

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

Untuk menjalankan, muat kode ke dalam ghcidan jalankan di putStr $ s Intmana Intketinggian yang Anda inginkan. Anda juga bisa menambahkan

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

di bawah imports dalam file teks, kompilasi dengan ghc, dan berikan ketinggian sebagai argumen baris perintah. Versi tidak disatukan:

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] ]
DrJPepper
sumber
Saya percaya Anda dapat mengganti constdengan pure(menggunakan instance Applicative untuk fungsi) untuk menyimpan beberapa byte.
Buah 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())));
        }
    }
}

Penjelasan singkat: Enumerable.Range(0, N).Select(...) menyebabkan string dihasilkan untuk setiap baris yang akhirnya digabungkan menjadi satu string dengan String.Join(Environment.NewLine, ...). Untuk setiap baris dengan siklus 26 karakter Enumerable.Range(0, 26).Select(...), pengujian di awal ekspresi lambda menentukan apakah akan menghasilkan karakter atau spasi sementara i==2memeriksa untuk "C" dan mengubahnya menjadi "C #" atau dua spasi tergantung pada garis . The String.Concat(...)bertobat yang dihasilkan IEnumerable<char>untuk setiap baris ke dalam string sebelum diteruskan ke TrimEnd(...)ke strip bersih diri setiap Trailing spasi.

Mark Feldman
sumber
1

PHP (216) (205)

Versi baru:

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

Versi lama:

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

mengharapkan variabel $ i menjadi tinggi.

Christoph
sumber
1

C, 214 169 byte, tanpa spasi tambahan

Terima kasih kepada @ edc65 dan @tolos atas sarannya yang bermanfaat.

#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("");}}
sebuah daratan
sumber
3
Ini adalah pertarungan yang hilang, tetapi saya bertahan: #include <stdio.h> tidak diperlukan dalam banyak kasus, baik itu gcc atau kompiler lainnya. C standar dan valid.
edc65
2
@ edc65: Tergantung pada apa yang Anda anggap "valid C". Ini adalah AFAIK K&R C yang valid, tetapi ANSI / ISO C menuntut agar fungsi variadik (yang termasuk scanfdan printf) diberikan prototipe, jika tidak Anda akan mendapatkan perilaku yang tidak terdefinisi. #include <stdio.h>adalah, tentu saja, cara terpendek untuk memberikan prototipe untuk keduanya scanfdan printf.
celtschk
@celtschk K&R yang valid sudah cukup bagi saya dalam kode golf. Dan 'dalam banyak kasus' (ketika hanya menggunakan put misalnya) valid C89. Yang saya ingin stres adalah itu bukan perilaku aneh gcc. (Thks untuk catatan tentang fungsi variadic, sih)
edc65
1
Global adalah tipe int dan diinisialisasi ke nol. Mungkin juga membatalkan intdeklarasi untuk utama jika Anda tidak mengembalikan apa pun. Dapat memberikan paren tambahan, ganti ' 'dengan 32dan if(!C)m=cdengan pernyataan ternarny, dan seperti yang baru saja saya pelajari (di atas) ganti printf("\n")dengan puts("")untuk 18 karakter: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"))

EDIT

Disimpan 13 byte dengan tidak membangun array dan .join ("\ n"). Diperlukan membalik loop. Kemudian, dengan bantuan dari putra C coding, membuat kode sepenuhnya terlalu pintar untuk menyimpan 12 byte lagi.

Ini adalah versi yang dapat dibaca yang menunjukkan perubahan logika.

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

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

Golf dan dikaburkan (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
John Nowlin
sumber
Saya suka bahkan jika saya tidak mengerti sepenuhnya. Tapi bagaimanapun Anda dapat memotong 9 karakter menghapus substr dan menggunakan indeks langsung .substr(a,1)=>[a]
edc65
Anda dapat mempersempitnya lebih lanjut dengan menggunakan operator bitwise dan menyatukan iterator untuk 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
wah, membersihkan satu ruang terlalu banyak
John Nowlin
1

K, 60 byte

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

Cukup mudah, dan sepertinya saya baru saja keluar solusi J. :)

Pertama, buat alfabet:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Dan gelombang gigi gergaji dengan panjang yang sesuai:

  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 setiap huruf alfabet dengan spasi:

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

Zip alfabet dan gelombang persegi bersama, dan putar setiap baris:

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

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

Dan transposisi dari itu adalah jawaban kita:

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

Coba di sini di OK .

JohnE
sumber
0

C: 142 139 karakter

Sangat lama, saya berharap dapat mempersingkat sedikit:

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

Sedikit lebih mudah dibaca:

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

Sunting: Saya merindukan aturan "tanpa spasi tambahan", tetapi saya akan kembali.

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

diformat ulang dan dikomentari:

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
}

Hasil:

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
Karol S
sumber
0

Python - 137

Input untuk disimpan di 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)
Vektor
sumber
0

Raket

Berikut ini adalah versi fungsional yang bersih: saran untuk mempersingkat sambutan.

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

Keluaran

> (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  
pengguna29983
sumber