Manchmal zeichne ich beim Kritzeln ein Rechteck, beginne mit einer Diagonale an einer der Ecken und zeichne dann einfach eine Linie aus, indem ich sie "reflektiere", wenn ich auf eine Seite des Rechtecks treffe. Ich mache so weiter, bis ich eine andere Ecke des Rechtecks getroffen habe (und hoffe, dass das Seitenverhältnis meines Rechtecks nicht irrational war;)). Das ist, als würde man den Weg eines Lasers in eine Kiste verfolgen. Das Ergebnis soll mit ASCII-Kunst erzeugt werden.
Betrachten Sie als Beispiel eine Box mit Breite 5
und Höhe 3
. Wir werden immer in der oberen linken Ecke beginnen. Das #
markiert die Begrenzung der Box. Beachten Sie, dass sich Breite und Höhe auf die Innenmaße beziehen.
####### ####### ####### ####### ####### ####### #######
#\ # #\ # #\ \# #\ /\# #\ /\# #\/ /\# #\/\/\#
# \ # # \ /# # \ /# # \/ /# # \/ /# #/\/ /# #/\/\/#
# \ # # \/ # # \/ # # /\/ # #\/\/ # #\/\/ # #\/\/\#
####### ####### ####### ####### ####### ####### #######
Die Herausforderung
Angesichts der (positiven) Breite und Höhe der Box sollten Sie das Endergebnis der Laserverfolgung erzielen. Sie können ein Programm oder eine Funktion schreiben, indem Sie die Eingabe über STDIN (oder die nächstgelegene Alternative), das Befehlszeilenargument oder das Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative) oder über Funktionsrückgabewerte oder -argumente ausgeben.
Sie können für die Eingabe ein beliebiges Listen-, Zeichenfolge- oder Zahlenformat verwenden. Die Ausgabe muss eine einzelne Zeichenfolge sein (es sei denn, Sie drucken sie nach STDOUT, was Sie natürlich schrittweise tun können). Dies bedeutet auch, dass Sie zuerst die Höhe und dann die Breite eingeben können. Geben Sie einfach das genaue Eingabeformat in Ihrer Antwort an.
In keiner Zeile der Ausgabe darf ein führender oder nachfolgender Leerraum vorhanden sein. Optional können Sie eine einzelne nachgestellte Newline ausgeben.
Sie müssen Raum nutzen, /
, \
und #
und die Testfälle genau wie dargestellt reproduzieren.
Testfälle
2 2
####
#\ #
# \#
####
3 2
#####
#\/\#
#/\/#
#####
6 3
########
#\ /#
# \ / #
# \/ #
########
7 1
#########
#\/\/\/\#
#########
1 3
###
#\#
#/#
#\#
###
7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########
22 6
########################
#\ /\ /\ /\ /\ /\ #
# \/ \/ \/ \/ \/ \#
# /\ /\ /\ /\ /\ /#
#/ \/ \/ \/ \/ \/ #
#\ /\ /\ /\ /\ /\ #
# \/ \/ \/ \/ \/ \#
########################
X
die für Überfahrten notwendig wären. Vielleicht nächstes Mal. ;)Antworten:
Pyth,
434139 BytesProbieren Sie es online aus: Pyth Compiler / Executor . Geben Sie die Zahlen in der folgenden Reihenfolge ein: Höhe erste Zeile, Breite zweite Zeile.
Danke an isaacg, der geholfen hat, zwei Bytes zu sparen.
Erläuterung:
Meine Lösung verfolgt den Laser nicht, sondern verwendet ein einfaches Muster, das den gcd enthält. Wenn
m, n
die Maße der Box sind, lassen Sied = gcd(m, n)
. Die Größe des Musters ist genau2*d x 2*d
.ZB das Wiederholungsmuster für
7 5
ist
(
gcd(7, 5) = 1
, Größe des Musters ist2 x 2
)Und das sich wiederholende Muster für
22 6
ist
(
gcd(22, 6) = 2
, Größe des Musters ist4 x 4
)Meine Lösung macht für jede der Linien folgendes: Sie erzeugt einfach eine Linie des Musters, wiederholt es einige Male und schneidet es am Ende so, dass es in die Box passt.
quelle
X
Träger „Zuordnen“ in Strings, können Sie ändernm\
zu*d
und entfernens
.*\
anstattm\
kurz zu verwenden, aber verwerfe es, weil es die gleiche Größe hat. Ich habe nicht an die Variabled
und das Unnötige gedachts
.C 256 Bytes
Ich kann das wahrscheinlich unter 200 bekommen, und ich werde später eine Erklärung hinzufügen, aber vielleicht habe ich in ein paar Stunden eine Arbeit, die ich stattdessen machen sollte.
quelle
J, 85 Bytes
Lassen
g = gcd(w,h)
. Die Funktion füllt die Elemente einerw/g by h/g
Matrix mitg by g
Kacheln mit/
und\
in ihrer Diagonale und Antidiagonale. Das resultierende 4D-Array wird in ein 2D-Array (das Innere der Box) zerlegt und dann mit#
's umgeben. (Die Zahlen0 1 2 3
werden anstelle von verwendet[space] / \ #
und die Zahlen werden am Ende in Zeichen geändert.)Eine direkte positionsbasierte Berechnung der Innenkoordinate könnte möglicherweise zu einer etwas kürzeren Lösung führen.
Verwendung:
Probieren Sie es hier online aus.
quelle
Desmos Calculator - nicht konkurrierend, um weiterführendes Wissen zu verbessern
Probieren Sie es online!
Eingänge:
Zwischenprodukte:
Formel, abgekürzt:
Ausgänge:
Wie es funktioniert:
Das Programm erfüllt nicht das endgültige Kriterium - die Erzeugung von ASCII-Zeichen in Form von Rahmen und Linien. Daher werde ich Informationen als nicht wettbewerbsfähig einreichen, um anderen bei der Bewältigung der Herausforderung zu helfen. Damit Desmos funktioniert, wenn c = 0 oder c = b ist, wurde ein kleiner Versatzfaktor von 0,01 eingeführt, da Desmos anscheinend die Grenzen von Mod (A, B) von (0, B) anstelle von [0, B aufweist )
quelle