Zeichne das Sägezahn-Alphabet

42

Ein einfacher heute. Schreiben Sie das kürzeste Programm, das ein "Sägezahn-Alphabet" mit einer positiven Ganzzahl für die Höhe zeichnet. Sie müssen den Namen Ihrer Programmiersprache eingeben, wenn Sie zu dem Buchstaben kommen, mit dem sie beginnt.

Wenn Ihre Sprache beispielsweise Python ist und die Eingabe ist, sollte 1die Ausgabe wie folgt lauten:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Wenn der Eingang 2der Ausgang ist, sollte sein:

 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

Wenn der Eingang 4der Ausgang ist, sollte sein:

   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

Anmerkungen

  • A Beginnt immer links unten.
  • Die Eingabe kann über stdin oder Funktionsaufruf oder ähnliches erfolgen. Ausgabe auf Standardausgabe.
  • Die Eingabe oben 26muss nicht funktionieren.
  • Keine nachgestellten Leerzeichen.
Calvins Hobbys
quelle
9
Sind Programmiersprachen mit einem Buchstaben zulässig? (C, J, K usw.)
isaacg
@isaacg Sicher. Ich würde mir vorstellen, dass es bei ihnen einfacher sein könnte.
Calvins Hobbys
1
Kann man einfach erwarten, dass die Eingabe in einer Variablen gespeichert wird?
Martin Ender
@ MartinBüttner Ja, das ist gut.
Calvins Hobbys
13
Übrigens, das ist keine Sägezahnwelle, das ist eine
Dreieckwelle

Antworten:

14

wenn n die Höhe hält:

C + Escape-Codes: 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
quelle
5
Ich gebe eine Niederlage zu. Was in aller Welt. : D
Martin Ender
Darf ich um Kompilierungsanweisungen bitten? ccgibt Fehler "<bebe.c: 1: 17: Fehler: 'n' nicht deklariert (erste Verwendung in dieser Funktion)".
Manatwork
2
Nun, es ist viel schlimmer als es aussieht. Erstens enthält die zweite nVariable nachgestellte Leerzeichen. Zweitens basieren beide darauf, dass es sich um eine globale Variable handelt, die auf eine Zahl Ihrer Wahl festgelegt ist (wie Martin zuvor gefragt hat).
Bebe
Oh, also muss ich auf jede erdenkliche Weise für n sorgen. Lol. Immer noch beeindruckt.
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);
}

Kompiliert auf gcc mit ein paar Warnungen. Zeilenumbrüche sind nicht in der Zeichenanzahl enthalten.

122 Zeichen, wenn die Eingabe bereits in gespeichert ist n.

Vielen Dank an user2992539 , tolos und edc65 für Verbesserungen.

grc
quelle
3
Sie können puts("")anstelle von verwenden printf("\n").
Somnium
2
Speichern Sie 4 Zeichen mit p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);anstelle vonif((c-...
1
Entschuldigung für den vorherigen (gelöschten) Kommentar. Ich habe mich geirrt. Spiel mit den Zeichen und missbrauche die Tatsache, dass das erste Argument von main 1 ist, wenn es keine Parameter gibt: 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 Bytes (Rohtext), 186 Bytes (Grafik)

Als Reaktion auf das OP kommt der wunderbare TI-83 (und neuer) mit einer Größe von 16 x 8 (nur unter Verwendung des Standard-Großtexts) oder mit einer Größe von 94 x 62 Pixel (was bei kleinem Text etwa 10 Zeilen wert ist) ).

Nun, das hat ein kleines Problem (zu dem ich Klarheit haben möchte). Die Größenvorgaben können vom Interpreter nicht "ignoriert" werden. Mit anderen Worten, wenn wir versuchen würden, die Sägezahnhöhe auf 20 zu setzen, würde dies zu einem Fehler führen, der die vollständige Ausführung des Codes verhindert. Ich könnte Code schreiben, der in einer unendlichen Umgebung die richtige Ausgabe erzeugt, es sei denn, er würde nicht auf dem Computer ausgeführt.

Nachdem dies gesagt wurde, präsentiere ich Ihnen die (laufenden) Versionen der Programme. Sie hängen alle davon ab, ob die Variable Nvor dem Ausführen in Zeilen auf die gewünschte Höhe eingestellt wird:

  • Rohtext-Ansatz

    :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
    

    Um dies unabhängig vom Terminal zu ermöglichen, ändern Sie For(C,1,16die For(C,1,33Markierung für die obere Schranke ( R<2 or) und entfernen Sie sie . Hier ist die Ausgabe mit 5→N:

    Bildbeschreibung hier eingeben

  • Grafischer Ansatz (dies kann auch AxisOffzur Verdeutlichung erforderlich sein )

    :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
    

    Dieser funktioniert OK, mit zwei kleinen Macken. Die Höhe ist immer noch ein Problem, obwohl die Breite nicht ist. Allerdings habe ich die Buchstaben nicht mit einem Leerzeichen versehen. In einigen Fällen (wenn der Buchstabe vom Sägezahn abfällt oder abfällt) werden die Buchstaben möglicherweise von ihren Nachfolgern abgeschnitten. Entfernen Sie das Häkchen ( R<7 or), damit es unabhängig vom Terminal funktioniert . Dann folgt die Grafik:

    Bildbeschreibung hier eingeben

Doktoro Reichard
quelle
Nun ich habe zu portieren , dies zu meinem Grafik - Taschenrechner
Liam McInroy
Kurzer Kommentar: Stattdessen 0→Fkönnen Sie tun, Delvar Fwas 1 Byte spart, sobald es tokenisiert ist. Ich bin mir auch sicher, dass Sie die Ausgabe / den Text gegen Ende faktorisieren können, dank einer booleschen Inline-Testbedingung für die Koordinate und für die C+7→C, schreiben Sie es in einem kurzen Wenn (nein, dann / sonst / Ende)
Adriweb
11

Pure Bash (keine Coreutils), 181 Bytes

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

Ausgabe:

Pipe cat -Enur um zu beweisen, dass es keine nachgestellten Zeilenumbrüche gibt.

$ ./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$
$ 
Digitales Trauma
quelle
10

JavaScript (ES6) 231 244

Edit Bugfix, einige Nachbestellungen und eine andere Art der Höhenverwaltung == 1
Außerdem wurde eine Funktion hinzugefügt, da dies durch OP erlaubt ist, so dass keine Eingabeaufforderung () erfolgt

Keine Änderungen am allgemeinen Algorithmus, der für diese Herausforderung wahrscheinlich NICHT der beste ist

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

Erklärt

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

Beispiele

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 steigen

  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 oben

   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

Ich gehe runter

      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
quelle
9

JAVA (393)

Wie immer eine großartige Sprache zum Golfen:

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
quelle
2
Leider hast du den Import für vergessen java.util.Arrays;. :-(
Justin
Aber Sie können Ihren Code verbessern: Entfernen Sie String x="ABC...Z";den for(char c...Loop-Header und ersetzen Sie ihn durch for (char c=65;++c<91;){. Ich liebe Zeichen in Java =)
flawr
Weitere Sie ersetzen können c=='J'mit c==74spart zwei weitere Bytes insgesamt.
Fehler
2
Ich bin mir sicher, dass Sie es noch besser machen können, wenn Sie die if-Anweisungen komprimieren, wenn Sie einige XORs für diese 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);}}verwenden. =)
Fehler
9

Ruby, 112 Bytes

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

Erwartet, dass die Eingabe in gespeichert wird h.

Lassen Sie mich wissen, ob dies geklärt werden muss.

Martin Ender
quelle
Sehr geringfügig, aber Sie können den Raum danach entfernen %.
Calvins Hobbys
@ Calvin'sHobbies Ha, ich habe meiner Syntax-Hervorhebung dort nicht vertraut: D. Wird später behoben.
Martin Ender
Sie können ersetzen puts o...mit $><<o....
Jordanien
6

J: 75 Bytes

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

Mit der wunderbaren Amend-Konjunktion . Wie üblich ist das IO hässlich und klobig und geht dort nicht auf Details ein. Die Kernlösung besteht aus 3 Gerunden (eine Art Nomen-ified Verb (aka. Funktion)):

  • a) Erzeugen des Alphabets
  • b) Erzeugen der Indizes
  • c) Erzeugen der zu korrigierenden Matrix

    x (a bc}) y

a) ist eine ziemlich triviale Suche in der ASCII-Tabelle

c) ist noch trivialer

b) ist das Interessante. Die Moral ist, dass die horizontalen Indizes von 0 bis y-1 und zurück beginnen und dies 26 Mal wiederholen sollen. Z.B. für y == 4:

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

Die Umsetzung ergibt für 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.

Und oh ja, handliche Tatsache: Js Name ist ... "J".

jpjacobs
quelle
Lohnt es sich zu ändern? Es scheint mir einfacher zu sein, so etwas zu sagen. 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'Der hässliche Teil dieser Lösung sind die 8 Zeichen, nur um die Sonderfallhöhe 1 zu erreichen, aber dies kann wahrscheinlich ein bisschen verkürzt werden.
b_jonas
Danke für den Vorschlag! Ihre ist in der Tat viel kürzer und die Änderung ist wahrscheinlich übertrieben. Da es so anders ist, möchten Sie es vielleicht selbst als Lösung posten?
Jpjacobs
Die Spezifikation sagt "keine nachgestellten Leerzeichen" und meine Lösung druckt nachgestellte Leerzeichen.
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="")
}

Ergebnis

> 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
quelle
Ich sehe, was du dort getan hast! Sehr klug ...
Kroltan
1
+1 Ordentlich! Sie können jedoch for( for(i in 1:x)cat(...zum Beispiel) die Leerzeichen um Ihre Anweisungen oder die um sie herum entfernen %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(""))

Hier ist ein Link zur jsfiddle, wo Sie es testen können.
edit: Erstellt ein Konsolenprotokoll für eine monospaced Schriftart und entfernt die Kommas, wenn input == 1.

Izlin
quelle
Vorschläge: 1: parseInt und Math.floor können beide mit einer Integer-Coercing-Operation wie |0oder geändert werden ~~. 2: Es ist kürzer, das Array w direkt zu erstellen, ohne split. for(w=[],v=0;v<z;v++)w[v]="\n";
Edc65
... und es gibt keine Ausgabe-Anweisung (console.log oder was auch immer Sie in Ihrer Geige verwenden, es ist Teil der
Zeichenanzahl
@ edc65 Danke für die Tipps. Sie hatten Recht, ich habe die Ausgabe hier vergessen, also habe ich eine Warnung hinzugefügt, aber es gibt keine mono-beabstandete Schrift, so dass sie ziemlich chaotisch aussieht.
Izlin
@izlin Anstelle von (i==9?" ":" ")könnte man verwenden (i^9?" ":" "), was ein Zeichen speichert.
rev
1
HILFE! kann mir jemand erklären (Warum gibt es zweimal <code> v = 0 </ code>?)
Fehler
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

Dieses Programm nimmt Eingaben von STDINund druckt das Ergebnis aus STDOUT.

Und Bonus - eine Version, die gegen die Regeln verstößt, da sie nachgestellte Leerzeichen druckt, aber Interaktion hinzufügt:

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

... und einige Tests unten:

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
quelle
3

J, 67 57 61 Zeichen

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

Verwendung als Funktion:

   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

Erläuterung: Diese Lösung verwendet einen anderen Ansatz als die andere J-Lösung. Anstatt eine Sägezahnwelle zu erzeugen 0 1 2 3 2 1 0 1 ... , habe ich mir den Abstand zwischen aufeinanderfolgenden Buchstaben angesehen. Zum Beispiel für n = 4 , wenn Sie von der A nach oben gehen, wickeln auf die zweite Säule und Reichweite B, dann vier Räume zwischen A und B. Sie Dieses Muster der Abstand zwischen den Buchstaben ist sehr regelmäßig finden: für n = 4 die Muster 4 4 4 2 2 2 4 4 4 ... .

Die Idee ist also, zuerst das abgeflachte (und transponierte) Array zu erstellen und es dann umzuformen und zu drehen, damit es richtig aussieht. Die Ausgaberoutine ist einfach (zumindest für J): dtb ist "lösche nachgestellte Leerzeichen" und "1sagt "operiere auf jeder Zeile". dtb und echo werden beide von der Standardbibliothek bereitgestellt.

Vielen Dank an Zsbán Ambrus für die Hilfe beim Golfen.

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

Bildbeschreibung hier eingeben

Sie können es hier ausprobieren .

fehlerhaft
quelle
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

Kleinere Optimierungen und wir sind bei 213 angelangt.

Das Original hatte einen kleinen Fehler. Getestet und bestätigt, um an der Bash-Version 4.2.37 zu arbeiten.

Vielen Dank an @manatwork für den Hinweis auf den Fehler und einige Tipps.

OK W
quelle
Ich habe Ihren Beitrag bearbeitet, indem ich ihm eine Syntaxhervorhebung hinzufügte. Jetzt sehe ich jedoch, dass ein Teil Ihres Codes fälschlicherweise als Kommentar hervorgehoben wurde, sodass ich ihn zurückgesetzt habe. Ich sagte dies nur für den Fall, dass Sie sich fragen, warum ich es zurückgesetzt habe :)
ProgramFOX
@ProgramFOX Das ist in Ordnung. Trotzdem danke!
Okw
Ich denke, irgendwo liegt ein kleiner Fehler vor, da die Ausgabe langsam abnimmt. (. Mindestens in Bash 4.3) Einige kleineren Verbesserungen , die Größe auf 194 Zeichen zu verringern: Lassen Sie die Sigill in arithmetischer Auswertung, versuchen Sie nicht doppelte Anführungszeichen innerhalb Strings in doppelten Anführungszeichen: pastebin.com/zKa3zdwR
Manatwork
Können Sie anstelle einiger Zeilenumbrüche auch Zeilenumbrüche verwenden, um die Lesbarkeit zu verbessern ;? Es wird nicht Ihre Golf-Score beeinflussen
Digital Trauma
2

Haskell - 432 Bytes (leider ...)

Es stellte sich heraus, dass dies viel schwieriger war, als ich erwartet hatte, daher die hohe Bytezahl. Ich bin mir sicher, dass ich (oder jemand) es besser machen könnte, aber ich habe zu viel Zeit damit verbracht, wie es ist. Die Golfversion lautet wie folgt:

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

Zum Ausführen laden Sie den Code in ghciund ausführen , putStr $ s Intwo IntSie die gewünschte Höhe. Sie könnten auch hinzufügen

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

importKompilieren Sie das s in einer Textdatei mit ghcund übergeben Sie die Höhe als Befehlszeilenargument. Ungolfed-Version:

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
quelle
Ich glaube , Sie ersetzen können , constmit pure(unter Verwendung der Applicative Instanz für Funktionen) ein paar Bytes zu speichern.
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())));
        }
    }
}

Kurze Erklärung: Enumerable.Range(0, N).Select(...)Erzeugt für jede Zeile eine Zeichenkette, die schließlich mit zu einer einzigen Zeichenkette verkettet wird String.Join(Environment.NewLine, ...). Für jede Zeile, mit der wir alle 26 Zeichen durchlaufen Enumerable.Range(0, 26).Select(...), bestimmt der Test am Anfang des Lambda-Ausdrucks, ob ein Zeichen oder ein Leerzeichen generiert werden soll, während i==2nach "C" gesucht wird, und konvertiert es je nach Zeile entweder in "C #" oder in zwei Leerzeichen . Das String.Concat(...)konvertiert das Ergebnis IEnumerable<char>für jede Zeile in eine Zeichenfolge, bevor es an übergeben wird, TrimEnd(...)um nachfolgende Leerzeichen sauber zu entfernen.

Mark Feldman
quelle
1

PHP (216) (205)

Neue Version:

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

Alte Version:

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

erwartet, dass die Variable $ i die Höhe ist.

Christoph
quelle
1

C, 214 169 Bytes, keine nachgestellten Leerzeichen

Vielen Dank an @ edc65 und @ tolos für ihre hilfreichen Vorschläge.

#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("");}}
ein Land
quelle
3
Es ist eine verlorene Schlacht, aber ich bleibe dabei: #include <stdio.h> wird in vielen Fällen nicht benötigt, sei es gcc oder irgendein anderer Compiler. Es ist sowieso Standard und gültiges C.
EDC65
2
@ edc65: Kommt darauf an, was du als "gültiges C" ansiehst. Es ist AFAIK-gültig, K & R C, aber ANSI / ISO C verlangt, dass verschiedene Funktionen (einschließlich scanfund printf) mit Prototypen versehen werden, da sonst undefiniertes Verhalten auftritt . #include <stdio.h>ist natürlich der kürzeste Weg, um beiden scanfund einen Prototyp zu geben printf.
Celtschk
@celtschk gültiges K & R reicht mir im Codegolf. Und 'in vielen Fällen' (zum Beispiel nur mit Puts) ist C89 gültig. Was ich möchte, ist, dass das kein seltsames Verhalten von gcc ist. (Danke für den Hinweis zu verschiedenen Funktionen, trotzdem)
edc65
1
Globals werden vom Typ int und mit Null initialisiert. intWenn Sie nichts zurücksenden, können Sie auch die Deklaration für main fallen lassen . Kann zusätzliche Pars fallen, ersetzen Sie ' 'mit 32und if(!C)m=cmit einer ternarny Aussage, und wie ich (oben) nur gelernt ersetzen printf("\n")mit puts("")18 Zeichen: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"))

BEARBEITEN

13 Byte wurden gespart, indem kein Array und keine .join-Datei ("\ n") erstellt wurden. Erforderliches Umdrehen der for-Schleifen. Dann, mit Hilfe von C Coding Sohn, machte Code völlig zu schlau, um weitere 12 Bytes zu speichern.

Hier ist die lesbare Version, die den logischen Wechsel zeigt.

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

Golfen (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 und verschleiert (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
quelle
Ich mag es auch wenn ich es nicht ganz verstehe. Sie können jedoch 9 Zeichen schneiden, indem Sie substr entfernen und den direkten Index verwenden .substr(a,1)=>[a]
edc65
Sie können es weiter 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"))
eingrenzen,
whoops, räumte ein zu viele Leerzeichen auf
John Nowlin
1

K, 60 Bytes

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

Ziemlich einfach, und es sieht so aus, als hätte ich gerade die J-Lösung verdrängt. :)

Erstellen Sie zunächst ein Alphabet:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Und eine Sägezahnwelle von angemessener Länge:

  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

Füllen Sie jeden Buchstaben des Alphabets mit führenden Leerzeichen auf:

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

Zippen Sie das Alphabet und das Rechteck zusammen und drehen Sie jede Reihe:

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

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

Und die Umsetzung davon ist unsere Antwort:

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

Probieren Sie es hier in OK .

JohnE
quelle
0

C: 142 139 Zeichen

Schrecklich lang, ich erwarte, dass ich es ein bisschen verkürzen kann:

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

Etwas besser lesbar:

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

Edit: Ich habe die "no trailing spaces" -Regel verpasst, komme aber wieder.

Fors
quelle
0

Scala, 246 Bytes

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

neu formatiert und kommentiert:

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
}

Ergebnisse:

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
quelle
0

Python - 137

Eingabe in ieg gespeichert werden 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)
Vektorisiert
quelle
0

Schläger

Hier ist eine saubere funktionale Version: Vorschläge zur Verkürzung sind willkommen.

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

Ausgabe

> (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  
user29983
quelle