Die Herausforderung
Erstellen Sie ein Cantor-Set mit N-Level .
Die ternäre Cantor-Menge wird durch wiederholtes Löschen des offenen mittleren Drittels einer Menge von Liniensegmenten erstellt.
Das Programm empfängt einen Parameter N
(eine Ganzzahl) und druckt dann (auf Konsolen- oder ähnliche Weise) einen Cantor-Satz von N Ebenen. Der Ausdruck darf nur nicht mit einem Punkt ( _
) und mit Leerzeichen versehene Zeichen enthalten. Der Parameter kann positiv oder negativ sein und das Vorzeichen gibt die Konstruktionsausrichtung des Cantor-Sets an: Wenn N > 0
das Cantor-Set nach unten und N < 0
das Cantor-Set nach oben konstruiert ist. Wenn N = 0
dann druckt das Programm eine einzelne Zeile ( _
).
Beispielsweise:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Gewinnkriterien
Da es sich um eine Code-Golf-Herausforderung handelt, gewinnt der kürzeste Code.
Bearbeitet: Ändere die Eingabe von 0 nach dem Vorschlag von ugoren.
_
(aber sie nach unten zu drucken, wenn Sie -0 erhalten).Antworten:
GolfScript,
49 4240 ZeichenMit Dankeschön an Hammar für 42-> 40.
Mein bisher bester Versuch einer zahlen-theoretischen Herangehensweise ist leider viel länger:
oder
und ich vermute, dass die Länge von
base
undzip
es unmöglich machen wird, aufzuholen.quelle
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
beträgt 39 Zeichen, stürzt jedoch bei der Eingabe ab0
. :-(n/abs(n)
, um es zu bekommensignum(n)
.Python,
116 113 104103 ZeichenÄlterer Algorithmus mit 113 Zeichen aufgefüllt
quelle
Rubin (97)
Basierend auf Steven Rumbalskis Python-Version:
Frühere Versuche, beide gleich lang (112)
Bauen Sie Linien aus Teilen:
Beginnen Sie mit einer Linie und bohren Sie Löcher hinein:
quelle
Perl, 93 Zeichen
Ich dachte, ich würde versuchen zu sehen, wie gut sich Peter Taylors GolfScript-Lösung auf Perl portieren lässt. Zu den bemerkenswerten Merkmalen gehört die Verwendung von
sort
anstelle vonreverse
, um drei Zeichen zu speichern, wobei die Tatsache genutzt wird, dass ein Leerzeichen zuvor sortiert wurde_
.quelle
Common Lisp,
217210 ZeichenErweitert:
Ich denke, wenn der Lisp-Code eine Anfangszählung für eine andere Sprache übertrifft (C, 219), geht es mir gut :)
quelle
C (
163161 Zeichen)Leiht sich ein paar Tricks aus Ugorens Antwort , aber die Kernlogik ist ganz anders. Ich konnte seiner for-Schleife nicht folgen, daher ist es möglicherweise möglich, weitere zu hybridisieren und zu speichern.
quelle
C,
219193179143136131 ZeichenBefolgte eine andere Idee von Petyer Taylor und eine Verbesserung meiner eigenen, sparte 6 weitere.
Einige Tipps von @PeterTaylor wurden integriert und seine Hauptfunktion mit geringfügigen Änderungen kopiert, die einen Charakter retten (ist es fair, ihn zu kopieren? Da keiner von uns diesen gewinnen wird, denke ich, dass es nicht so schlimm ist).
Ich dachte an eine signifikante Verbesserung der Funktionsweise meiner Rekursion und nachdem ich die Antwort von Peter Taylor gesehen hatte, implementierte ich sie, um den Vorsprung wiederzugewinnen. Als ich seine Antwort noch einmal las, sah ich, dass ich fast genau das tat, was er tat. Das scheint also die von ihm vorgeschlagene Hybridisierung zu sein.
Vereinfachte auch das Einschleifen bei
main
gleicher Länge.Und nahm Peters Trick, um eine neue Zeile zu drucken, anstatt
puts("")
- einen Charakter zu speichern.Aus
int
Variablendeklaration entfernt - eine Warnung, spart jedoch 4 Zeichen.Der neue Algorithmus berechnet nicht 3 ^ x im Voraus, sondern verwendet eine einzelne Schleife, um 3 ^ x Zeichen zu drucken.
Kann durch Definieren einen weiteren speichern
int*v
, aber dann funktionieren 64-Bit nicht.Die Anzahl der Zeichen schließt Leerzeichen aus (diese können entfernt werden).
Älterer Algorithmus, 219 Zeichen:
quelle
i
Parameter nicht entfernen , da die Verwendung der globalen würde störenmain
.l--
wird störeno>=l
, und ich muss es ersetzen>
(warum schreibe ich es dann so, als wäre es eine schlechte Sache?) Ich könnte dich auch kopierenmain
, was einfacher und kürzer ist als meine.i
- ich habe die Tatsache übersehen, dass ich es wirklich nicht mehr benutze (ich dachte, du meinst, ich übergebe es nicht).p
scheint jetzt ganz optimal zu sein, und deinesmain
war besser (ich bin nicht sicher, ob es optimal ist, aber ich kann es nicht weiter verbessern). Abgesehen von einer neuen genialen Programmstruktur war der einzige Weg, den Code des anderen zu kopieren.J,
44393837 BytesVerwendet die Iteration, um den nächsten Satz zu erstellen, der anfänglich mit 1 (repräsentiert
_
) beginnt .Verwendung
Erläuterung
quelle
@.
vielleicht könnte es in Kombination mit$:
hier von Nutzen sein? ZB sowas(zero case)`(positive case)`(negative case)@.*
oder vielleicht sogar":@_:`(positive case)`(|."1@$:)@.*
.R ,
141 139137 BytesProbieren Sie es online!
-15 Bytes danke auch Giuseppes Verwendung
'('
als Identitätsfunktion;write
anstattcat
die Ausgabe zu drucken; kluger Gebrauch von%x%
.-2 Bytes dank Kirill L. mit
c
statt'('
als Identitätsfunktion.quelle
%x%
? Es könnte einige Probleme geben, wenn man abwechselnde Reihen nimmt ...kron
habe! Ich würde mir vorstellen, dass dies 125 Bytes erreichen sollte, wenn wir den richtigen Ansatz finden.`(`
als Identitätsfunktion verwenden, sodass Siewrite
direkt anstelle voncat
und einefor
Schleife verwenden können. 141 Bytes(
wie man das so macht, oder dassif
man damit aus zwei Funktionen auswählen kann. Und ich werde anfangen zu schreiben ... spart eine Menge "\ n".Python,
177164 Zeichenquelle
input
as nicht konvertierenint
. Ihre letzten beiden Zeilen könnten verkürzt werden aufprint"\n".join(r[::N>0 or-1])
Perl, 113 Zeichen
Erweitert:
quelle
JavaScript 121 Bytes
Innere rekursive Funktion, dann kümmern Sie sich bei Bedarf um die Rückwärtsausgabe
Weniger golfen
Prüfung
quelle
Batch,
265262242236235 BytesBearbeiten:
12 bis19 Bytes dank @ l4m2 gespeichert. 8 Bytes durch Entfernen der unnötigen%a%
Variablen gespart .quelle
set c=%n%,-1,0 [LF] if %n% lss 0 set c=0,1,%a% [LF] for /l %%i in (%c%)do call:l %%i
?JavaScript (Node.js) , 148 Byte
Probieren Sie es online!
quelle
Python 2 , 102 Bytes
Probieren Sie es online!
quelle
Prolog (SWI) ,
265232213 BytesProbieren Sie es online!
quelle
PowerShell , 111 Byte
Probieren Sie es online!
Weniger golfen:
quelle