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 1
die Ausgabe wie folgt lauten:
ABCDEFGHIJKLMNOPythonQRSTUVWXYZ
Wenn der Eingang 2
der 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 4
der 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
26
muss nicht funktionieren. - Keine nachgestellten Leerzeichen.
Antworten:
wenn n die Höhe hält:
C + Escape-Codes: 81
C: 110
quelle
cc
gibt Fehler "<bebe.c: 1: 17: Fehler: 'n' nicht deklariert (erste Verwendung in dieser Funktion)".n
Variable 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).C 134
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.
quelle
puts("")
anstelle von verwendenprintf("\n")
.p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);
anstelle vonif((c-...
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); }
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
N
vor dem Ausführen in Zeilen auf die gewünschte Höhe eingestellt wird:Rohtext-Ansatz
Um dies unabhängig vom Terminal zu ermöglichen, ändern Sie
For(C,1,16
dieFor(C,1,33
Markierung für die obere Schranke (R<2 or
) und entfernen Sie sie . Hier ist die Ausgabe mit5→N
:Grafischer Ansatz (dies kann auch
AxisOff
zur Verdeutlichung erforderlich sein )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:quelle
0→F
können Sie tun,Delvar F
was 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 dieC+7→C
, schreiben Sie es in einem kurzen Wenn (nein, dann / sonst / Ende)Pure Bash (keine Coreutils), 181 Bytes
Ausgabe:
Pipe
cat -E
nur um zu beweisen, dass es keine nachgestellten Zeilenumbrüche gibt.quelle
JavaScript (ES6) 231
244Edit 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
Erklärt
Beispiele
1
3 steigen
4 oben
Ich gehe runter
quelle
JAVA (393)
Wie immer eine großartige Sprache zum Golfen:
quelle
java.util.Arrays;
. :-(String x="ABC...Z";
denfor(char c...
Loop-Header und ersetzen Sie ihn durchfor (char c=65;++c<91;){
. Ich liebe Zeichen in Java =)c=='J'
mitc==74
spart zwei weitere Bytes insgesamt.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. =)Ruby, 112 Bytes
Erwartet, dass die Eingabe in gespeichert wird
h
.Lassen Sie mich wissen, ob dies geklärt werden muss.
quelle
%
.puts o...
mit$><<o...
.J: 75 Bytes
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)):
c) Erzeugen der zu korrigierenden Matrix
x (a
b
c}) ya) 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:
Die Umsetzung ergibt für b):
Und oh ja, handliche Tatsache: Js Name ist ... "J".
quelle
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.R (204)
Ergebnis
quelle
for
(for(i in 1:x)cat(...
zum Beispiel) die Leerzeichen um Ihre Anweisungen oder die um sie herum entfernen%in%
.Javascript -
248224235Hier 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.
quelle
|0
oder geändert werden~~
. 2: Es ist kürzer, das Array w direkt zu erstellen, ohnesplit
.for(w=[],v=0;v<z;v++)w[v]="\n";
(i==9?" ":" ")
könnte man verwenden(i^9?" ":" ")
, was ein Zeichen speichert.Perl 119
Dieses Programm nimmt Eingaben von
STDIN
und druckt das Ergebnis ausSTDOUT
.Und Bonus - eine Version, die gegen die Regeln verstößt, da sie nachgestellte Leerzeichen druckt, aber Interaktion hinzufügt:
... und einige Tests unten:
quelle
J,
67 5761 ZeichenVerwendung als Funktion:
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
"1
sagt "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.
quelle
MetaPost (207)
Sie können es hier ausprobieren .
quelle
Bash (213)
(223)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.
quelle
;
? Es wird nicht Ihre Golf-Score beeinflussenHaskell - 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:
Zum Ausführen laden Sie den Code in
ghci
und ausführen ,putStr $ s Int
woInt
Sie die gewünschte Höhe. Sie könnten auch hinzufügenimport
Kompilieren Sie das s in einer Textdatei mitghc
und übergeben Sie die Höhe als Befehlszeilenargument. Ungolfed-Version:quelle
const
mitpure
(unter Verwendung der Applicative Instanz für Funktionen) ein paar Bytes zu speichern.C # / LINQ:
Kurze Erklärung:
Enumerable.Range(0, N).Select(...)
Erzeugt für jede Zeile eine Zeichenkette, die schließlich mit zu einer einzigen Zeichenkette verkettet wirdString.Join(Environment.NewLine, ...)
. Für jede Zeile, mit der wir alle 26 Zeichen durchlaufenEnumerable.Range(0, 26).Select(...)
, bestimmt der Test am Anfang des Lambda-Ausdrucks, ob ein Zeichen oder ein Leerzeichen generiert werden soll, währendi==2
nach "C" gesucht wird, und konvertiert es je nach Zeile entweder in "C #" oder in zwei Leerzeichen . DasString.Concat(...)
konvertiert das ErgebnisIEnumerable<char>
für jede Zeile in eine Zeichenfolge, bevor es an übergeben wird,TrimEnd(...)
um nachfolgende Leerzeichen sauber zu entfernen.quelle
PHP
(216)(205)Neue Version:
Alte Version:
erwartet, dass die Variable $ i die Höhe ist.
quelle
C,
214169 Bytes, keine nachgestellten LeerzeichenVielen Dank an @ edc65 und @ tolos für ihre hilfreichen Vorschläge.
quelle
scanf
undprintf
) mit Prototypen versehen werden, da sonst undefiniertes Verhalten auftritt .#include <stdio.h>
ist natürlich der kürzeste Weg, um beidenscanf
und einen Prototyp zu gebenprintf
.int
Wenn Sie nichts zurücksenden, können Sie auch die Deklaration für main fallen lassen . Kann zusätzliche Pars fallen, ersetzen Sie' '
mit32
undif(!C)m=c
mit einer ternarny Aussage, und wie ich (oben) nur gelernt ersetzenprintf("\n")
mitputs("")
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("");}}
Javascript (
204 185150)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.
Golfen (161):
Golf und verschleiert (149):
quelle
.substr(a,1)
=>[a]
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"))
K, 60 Bytes
Ziemlich einfach, und es sieht so aus, als hätte ich gerade die J-Lösung verdrängt. :)
Erstellen Sie zunächst ein Alphabet:
Und eine Sägezahnwelle von angemessener Länge:
Füllen Sie jeden Buchstaben des Alphabets mit führenden Leerzeichen auf:
Zippen Sie das Alphabet und das Rechteck zusammen und drehen Sie jede Reihe:
Und die Umsetzung davon ist unsere Antwort:
Probieren Sie es hier in OK .
quelle
C:142139 ZeichenSchrecklich lang, ich erwarte, dass ich es ein bisschen verkürzen kann:Etwas besser lesbar:
Edit: Ich habe die "no trailing spaces" -Regel verpasst, komme aber wieder.
quelle
Scala, 246 Bytes
neu formatiert und kommentiert:
Ergebnisse:
quelle
Python - 137
Eingabe in ieg gespeichert werden
i=8
quelle
Schläger
Hier ist eine saubere funktionale Version: Vorschläge zur Verkürzung sind willkommen.
Ausgabe
quelle