Testere Dişi Alfabesini çizin


42

Bugün basit bir tane. Yükseklik için pozitif bir tamsayı verilen bir "testere dişi alfabesi" çizen en kısa programı yazın. Başladığı harfe geldiğinizde programlama dilinizin adını yazmalısınız.

Örneğin, eğer diliniz Python ise ve girdi ise 1çıktı şöyle olmalıdır:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Giriş ise 2, çıktı şöyle olmalıdır:

 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

Giriş ise 4, çıktı şöyle olmalıdır:

   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

notlar

  • A her zaman sol alttan başlar.
  • Giriş, stdin veya işlev çağrısı veya benzeri yoluyla olabilir. Stdout'a çıktı.
  • Yukarıdaki 26girişin çalışması gerekmez.
  • Sondaki boşluk yok.

9
Bir harf adlı programlama dillerine izin veriliyor mu? (C, J, K, vb.)
isaacg

@ isaacg Tabii. Onlarda daha kolay olabileceğini hayal ediyorum.
Calvin'in Hobileri

1
Girdilerin bir değişkende saklanması beklenebilir mi?
Martin Ender

@ MartinBüttner Evet, sorun değil.
Calvin'in Hobileri

13
BT, bu bir testere dişi dalgası değil, bu bir üçgen dalgası: P
qwr

Yanıtlar:


14

eğer n yüksekliğini tutan:

C + kaçış kodları: 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
Ben yenilgiyi kabul ediyorum. Ne yeryüzünde. : D
Martin Ender

Derleme talimatlarını isteyebilir miyim? cc"<bebe.c: 1: 17: error: 'n' bildirilmemiş (bu işlevde ilk kullanım)"
hatası veriyor

2
iyi göründüğünden çok daha kötü. Birincisi, ikincisi iz bırakma boşlukları içeriyor, ikincisi de her ikisine de dayanıyor n(Martin daha önce sorduğu gibi) seçtiğiniz bir dizi değişkene dayanıyor .
bebe,

Oh, yani elimden geldiğince n sağlamalıyım. Lol. Hala etkilendim.
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);
}

Birkaç uyarı ile gcc'de derlenir. Yeni satırlar karakter sayısına dahil edilmez.

Giriş önceden kaydedilmişse, 122 karaktern .

User2992539 sayesinde , geliştirmeler için tolos ve edc65 .


3
Sen kullanabilirsiniz puts("")yerine printf("\n").
Somnium,

2
p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);Bunun yerine 4 karakterle kaydedinif((c-...

1
Önceki (silinmiş) yorum için özür dilerim. Yanılmışım. İşaretlerle oynamak ve ilk argümanın parametre yoksa 1 olduğu gerçeğini kötüye kullanmak: 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 bayt (ham metin), 186 bayt (grafik)

OP'ye cevaben, harika TI-83 (ve daha yenisi) 16 x 8 boyutunda (sadece standart büyük metni kullanarak) veya 94 x 62 piksel boyutunda (küçük metinde yaklaşık 10 satırlık bir değer ile) geliyor ).

Şimdi, bunun küçük bir sorunu var (açıklığa kavuşturmak istiyorum). Büyüklük yüklemeleri tercüman tarafından "göz ardı edilemez"; Başka bir deyişle, testere dişi yüksekliğini 20'ye ayarlamaya çalışacak olursak, kodun tamamen yürütülmesini engelleyen bir hata verirdi. Ben olabilir makinede aday olmayacağını hariç, sonsuz ortamda, doğru çıktı üretecektir kod yazmak.

Bu söylenirken, size programların (çalışan) sürümlerini sunuyorum. Hepsi, Nçalıştırmadan önce satırlarda istenen yüksekliğe ayarlanan değişkene bağlıdır :

  • Ham metin yaklaşımı

    :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
    

    Ne olursa olsun, terminal, değişimin bu işi yapmak için For(C,1,16için For(C,1,33ve üst sınır kontrolü çıkarın ( R<2 or). İşte çıktı 5→N:

    görüntü tanımını buraya girin

  • Grafik yaklaşımı (bu AxisOffaçıklığa da ihtiyaç duyabilir )

    :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
    

    Bu bir iki küçük tuhaflıklar ile Tamam çalışır. Genişlik olmasa da yükseklik hala bir sorundur. Bununla birlikte, harfleri boş bırakmadım, bu yüzden bazı durumlarda (harf testere dişinden yükselmeye veya azalmaya başladığında), harfler halefleri tarafından kesilebilir. Terminalden bağımsız olarak çalışmasını sağlamak için üst sınır kontrolünü ( R<7 or) kaldırın . Sonra grafiği izler:

    görüntü tanımını buraya girin


Şimdi var benim grafik hesap makinesi için bu bağlantı noktasına
Liam Mclnroy

Hızlı yorum: 0→FSizin yerine, bir Delvar Fkez belirtildiğinde 1 byte kazandıran yapabilirsiniz . Ayrıca, koordinat için bir satır içi boolean test koşulu sayesinde Çıktı / Metni sona doğru çarpanlara koyabileceğinizden emin olabilirsiniz ve C+7→Ckısa bir süre sonra yazınız (eğer / o zaman / sonda değil)
Adriweb

11

Saf Bash (coreutils yok), 181 bayt

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

Çıktı:

Borulu için cat -Esadece hayır izleyen yeni satırlar vardır kanıtlamak için.

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

Düzenleme Hata düzeltme, bir yeniden sıralama ve yükseklik == 1 yönetmek farklı bir şekilde
, bu gibi bir fonksiyona değiştirilebilir Ayrıca, giriş için) (yani hiçbir anında, OP izin verdiği

Bu algoritma için muhtemelen en iyisi OLMAYAN genel algoritmada değişiklik yok

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

Açıklaması

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

Örnekler

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 yukarı

  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 üstte

   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 aşağı gidiyor

      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)

Her zaman olduğu gibi golf oynamak için harika bir dil:

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
Ne yazık ki, içe aktarma işlemini unuttun java.util.Arrays;. :-(
Justin,

Ancak kodunuzu alabilirsiniz: döngü başlığını kaldırın String x="ABC...Z";ve değiştirin, Java karakterlerini seviyorum =)for(char c...for (char c=65;++c<91;){
flawr

Dahası c=='J'ile değiştirebilirsiniz c==74, toplamda iki bayt daha kaydeder.
kusur,

2
Bazı XOR'ları if ifadeleri için kullanırsanız yoğunlaştırırsanız daha da iyi yapabileceğinize eminim, ancak burada gelişmiş 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);}}sürümüm: (325) @Quincunx: artık import.util.Arrays; =)
kusur

9

Ruby, 112 bayt

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

Girilecek girişi bekler h.

Bu açıklama gerektiriyorsa bana bildirin.


Çok küçük ama sonra boşluğu kaldırabilirsiniz %.
Calvin'in Hobileri

@ Calvin's Hobbies Ha, sözdizimimin orada vurgulanmasına güvenmedim: D. Daha sonra tamir edecek.
Martin Ender

Sen yerini alabilir puts o...ile $><<o....
Jordan,

6

J: 75 bayt

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

Harika Amend birleşimini kullanarak . Her zamanki gibi IO çirkin ve tıknaz, orada ayrıntılara girmiyor. Çekirdek çözümü 3 mermi alır (bir isim-isimli fiil (aka. Fonksiyonu)):

  • a) alfabeyi oluşturmak
  • b) endeksleri oluşturmak
  • c) telafi etmek için matris üretmek

    x (a bc}) y

a) ascii tablosunda oldukça önemsiz bir arama

c) daha da önemsiz

b) ilginç olanıdır. Moral, yatay endekslerin 0'dan y-1'e kadar başlaması ve bunu 26 kez tekrar etmesi gerektiğidir. Örneğin. y == 4 için:

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

Bunun uygulanması b) için verir:

($(,|.@}.@}:)@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.

Ve oh evet, kullanışlı gerçek: J'nin adı ... "J".


Değişiklik kullanmaya değer mi? Bana böyle bir şey söylemek daha kolay görünüyor 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'Bu çözümdeki çirkin kısım, sadece özel durum yüksekliği 1 olan 8 karakterdir, ancak bu muhtemelen biraz kısaltılabilir.
b_jonas

Önerin için teşekkürler! Sizinki gerçekten çok daha kısa, ve değişiklik muhtemelen fazla abartılı. Çok farklı olduğu için belki kendiniz bir çözüm olarak göndermek istersiniz?
jpjacobs

Spec "iz bırakmayan boşluk yok" diyor ve benim çözümüm izleyen boşluk bırakıyor.
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="")
}

Sonuç

> 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 

Orada ne yaptığını anladım! Çok akıllı ...
Kroltan

1
+1 Düzgün! forYine de ( for(i in 1:x)cat(...örneğin) ifadelerinizin etrafındaki boşluklardan veya etrafındakilerden kurtulabilirsiniz %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(""))

İşte bunu test edebileceğiniz jsfiddle bağlantısı.
düzenleme: Monospaced bir yazı tipi için bir konsol günlüğü yaptı ve girdi == 1 ise virgülleri kaldırın.


Öneriler: 1: parseInt ve Math.floor, |0veya gibi bir tamsayı zorlama işlemi ile değiştirilebilir ~~. 2: w dizisini direk olarak kurmak, daha kısadır split. for(w=[],v=0;v<z;v++)w[v]="\n";
edc65

... ve bir çıkış deyimi yoktur (console.log veya
kemanında

@ edc65 Tavsiyeler için teşekkür ederiz. Haklıydınız çıktıyı unuttum, bu yüzden bir uyarı ekledim, ancak mono aralıklı bir yazı tipi yok, bu yüzden oldukça kaotik görünüyor.
izlin,

@izlin Yerine, bir karakter kaydeder, (i==9?" ":" ")kullanabilirsiniz (i^9?" ":" ").
rev

1
YARDIM! kimse açıklayabilir mi? (Neden iki kez <code> v = 0 </code> var?)
kusur

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

Bu program girdi alır STDINve sonucu yazdırır STDOUT.

Ve bonus - takip eden boşlukları yazdırırken kurallara aykırı ancak bazı etkileşimler ekleyen bir sürüm:

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

... ve aşağıda bazı testler:

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 karakter

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

Bir işlev olarak kullanın:

   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

Açıklama: Bu çözüm, diğer J çözümünden farklı bir yaklaşım kullanıyor. Testere dişi dalgası oluşturmak yerine 0 1 2 3 2 1 0 1 ... , ardışık harfler arasındaki boşluğa baktım. Örneğin, eğer A'dan yukarıya doğru giderseniz, n = 4 için, ikinci sütuna sarın ve B'ye ulaşın, sonra A ile B arasında dört boşluk bulursunuz. Harfler arasındaki boşluk kalıbı çok düzenli: n = 4 için kalıp 4 4 4 2 2 2 4 4 4 ... .

Bu nedenle, fikir önce düzleştirilmiş (ve çevrilmiş) diziyi oluşturmak, sonra onu yeniden şekillendirmek ve doğru görünecek şekilde çevirmektir. Çıktı rutini basittir (en azından J olduğu için): dtb "sondaki boşlukları sil" dir ve "1"her satırda çalış" der. dtb ve echo standart kütüphane tarafından sağlanmaktadır.

Bazı golf yardımları için Zsbán Ambrus'a teşekkürler .


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;

görüntü tanımını buraya girin

Burada deneyebilirsiniz .


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

Küçük tweaks ve 213'e düştük.

İlkinde küçük bir böcek vardı. Test edilmiş ve bash sürüm 4.2.37 üzerinde çalışmak üzere onaylanmıştır.

Hatayı ve bazı ipuçlarını işaret ettiği için @ manatwork'e teşekkür ederiz.


Postanızı vurgulayarak sözdizimi ekleyerek düzenledim, ancak şimdi kodunuzun bir bölümünü yanlış olarak vurguladığını görüyorum, bu nedenle geri aldım. Bunu neden geri aldığımı merak ediyor olmanız durumunda söyledim :)
ProgramFOX

@ProgramFOX Sorun değil. Yine de teşekkürler!
Okw

Çıktı yavaş yavaş alçaldığından, bir yerde küçük bir hata olduğunu düşünüyorum. (. Bash 4.3 En azından) Bazı küçük iyileştirmeler 194 karakterle boyutunu azaltmak için: omit aritmetik değerlendirmede deseni, çift-alıntı çift tırnaklar kalkma: pastebin.com/zKa3zdwR
manatwork

;Biraz daha okunaklı hale getirmek için sadece bazıları yerine newlines kullanabilir misiniz ? Golf puanınızı etkilemeyecek
Digital Trauma,

2

Haskell - 432 Bayt (ne yazık ki ...)

Bu tamamen başarmayı beklediğimden çok daha zor oldu, bu yüzden ağır bayt sayısı. Eminim ki (ya da birileri) daha iyisini yapabilirdi, ama bu konuda çok fazla zaman geçirdim. Golf versiyonu aşağıdaki gibidir:

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

Çalıştırmak için kodu yükleyin ghcive istediğiniz yüksekliğin putStr $ s Intnerede Intolduğunu uygulayın. Ayrıca ekleyebilirsiniz

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

importbir metin dosyasındaki s'nin altında onu derleyin ghcve yüksekliği komut satırı argümanı olarak iletin. Ungolfed versiyonu:

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

Birkaç bayttan tasarruf etmek için (işlevler için Uygulamalı örneği kullanarak) constile değiştirebileceğinize inanıyorum pure.
Esolanging Fruit

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

Kısa açıklama: Enumerable.Range(0, N).Select(...)sonuçta tek bir dizgeyle birleştirilen her satır için bir dizgenin üretilmesine neden olur String.Join(Environment.NewLine, ...). 26 karakterin hepsinde dolaştığımız her satır Enumerable.Range(0, 26).Select(...)için, lambda ifadesinin başlangıcındaki test, i==2"C" işaretini kontrol ederken bir karakter veya boşluk üretip üretmeyeceğini belirler ve çizgiye bağlı olarak "C #" veya iki boşluğa dönüştürür. . String.Concat(...)Dönüştürür Elde IEnumerable<char>geçirmeden önce bir dizeye her bir çizgi için TrimEnd(...)temiz bir şeridi bir arka boşluk için.


1

PHP (216) (205)

Yeni sürüm:

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

Eski versiyon:

$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 değişkeninin yükseklik olmasını bekler.


1

C, 214 169 bayt, iz bırakmayan boşluk yok

@ Edc65 ve @tolos'a yardımcı önerileri için teşekkür ederiz.

#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
Bu kayıp bir savaş, ama inanıyorum: #include <stdio.h> birçok durumda gerekli değildir, gcc veya başka bir derleyici olsun. Zaten standart ve geçerli bir C.
edc65

2
@ edc65: Neyin "geçerli C" olduğunu düşündüğünüze bağlı. AFAIK geçerli K&R C'dir, ancak ANSI / ISO C, değişken işlevlerin (dahil olan scanfve dahil printf) prototip verilmesini ister, aksi takdirde tanımsız davranış elde edersiniz. #include <stdio.h>olduğunu, tabii ki, en kısa yoldur hem bir prototip vermek scanfve printf.
celtschk

@celtschk geçerli K & R kod golf benim için yeterli. Ve 'çoğu durumda' (örneğin sadece puts kullanılırken) C89 geçerlidir. Stres atmak istediğim şey bu, garip bir garip davranış değil. (Zaten variadic fonksiyonları hakkında not için
thks

1
Globals int türünde ve sıfır olarak başlatıldı. intHerhangi bir şey iade etmiyorsanız, ana bildirimi de bırakabilirsiniz . Ekstra parens damla değiştirebilir miyim ' 'ile 32ve if(!C)m=cbir ternarny deyimi ile, ve ben sadece öğrenilen olarak (yukarıda) değiştirin printf("\n")ile puts("")18 karakter için: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"))

DÜZENLE

Bir dizi oluşturmayarak 13 bayt kaydedildi ve .join ("\ n"). For döngüler gerekli saygısız. Daha sonra, C kodlama oğlunun da yardımıyla, 12 byte'ı kurtarmak için kod tamamen zekice yapıldı.

İşte mantık değişikliğini gösteren okunabilir versiyon.

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 oynadı ve şaşırdı (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

Tam anlamamış olsam bile hoşuma gidiyor. Ama yine de, .substr(a,1)[a]
substr'ları

182 için bitsel operatörleri ve birleştirici yineleyicileri kullanarak daha da daraltabilirsiniz: 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

boğmaca, çok fazla boşluk
temizle

1

K, 60 bayt

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

Oldukça basit ve görünüşe göre J çözümünü yeni kapattım. :)

İlk önce bir alfabe oluşturun:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Ve uygun uzunlukta testere dişi dalgası:

  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

Alfabedeki harflerin her birini baş boşluklarla doldurun:

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

Alfabeyi ve kare dalgayı birlikte sıkıştırın ve her satırı döndürün:

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

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

Ve bunun aktarılması bizim cevabımız:

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

Burada OK'de deneyin .


0

C: 142 139 karakter

Korkunç bir şekilde, biraz kısaltabilmeyi umuyorum:

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

Biraz daha okunaklı:

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

Düzenleme: "iz bırakmayan boşluk yok" kuralını kaçırdım, ancak geri döneceğim.


0

Scala, 246 bayt

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

yeniden biçimlendirildi ve yorumlandı:

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
}

Sonuçlar:

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

İeg'de depolanacak girdi 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

raket

İşte temiz bir işlevsel sürüm: hoş geldiniz kısaltmak için öneriler.

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

Çıktı

> (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  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.