Wenn Sie ein Blatt Millimeterpapier nehmen und eine geneigte Linie zeichnen, die m
Einheiten nach rechts und n
Einheiten nach oben zeigt, kreuzen Sie n-1
horizontale und m-1
vertikale Gitterlinien in einer bestimmten Reihenfolge. Schreiben Sie Code, um diese Sequenz auszugeben.
Zum Beispiel m=5
und n=3
gibt:
Möglicherweise verwandt: Euklidische Rhythmen erzeugen , Fibonacci- Fliesen , FizzBuzz
Eingabe: Zwei positive ganze Zahlen m,n
, die relativ prim sind
Ausgabe: Gibt die Kreuzungen als Folge von zwei unterschiedlichen Token zurück oder druckt sie aus. Zum Beispiel kann es sich um eine Zeichenfolge aus H
und V
, eine Liste aus True
und False
oder 0
's und 1
' s handeln, die in separaten Zeilen gedruckt werden. Es kann ein Trennzeichen zwischen Tokens geben, solange es immer dasselbe ist, und nicht etwa eine variable Anzahl von Leerzeichen.
Testfälle:
Der erste Testfall gibt eine leere Ausgabe oder keine Ausgabe aus.
1 1
1 2 H
2 1 V
1 3 HH
3 2 VHV
3 5 HVHHVH
5 3 VHVVHV
10 3 VVVHVVVHVVV
4 11 HHVHHHVHHHVHH
19 17 VHVHVHVHVHVHVHVHVVHVHVHVHVHVHVHVHV
39 100 HHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
Im Format (m,n,output_as_list_of_0s_and_1s)
:
(1, 1, [])
(1, 2, [0])
(2, 1, [1])
(1, 3, [0, 0])
(3, 2, [1, 0, 1])
(3, 5, [0, 1, 0, 0, 1, 0])
(5, 3, [1, 0, 1, 1, 0, 1])
(10, 3, [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
(4, 11, [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])
(19, 17, [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
(39, 100, [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0])
Antworten:
Ruby, 92; Strauß 0.7.0 , 38
Die Ausgabe für beide verwendet Einsen und Nullen (z. B.
101101
).Hier ist eine Erklärung für den Strauß:
Und eine Erklärung, wie das Ganze funktioniert, unter Verwendung des Ruby-Codes als Leitfaden:
quelle
Python, 53
Dies verwendet die Ausgabe der True / False-Liste. Nichts besonderes hier.
quelle
Pyth -
3224 BytesÜbernimmt die Eingabe über stdin mit dem Format
[m,n]
. Gibt das Ergebnis als Liste der Nullen und Einsen an stdout aus, wobei 0 = V und 1 = H.Testen Sie es online
Erläuterung:
quelle
eM
ist das gleiche wiemed
.@"VH"
da Sie drucken dürfen0
und1
stattV
undH
.J
. Hier ist, was ich bisher bei 25 Bytes habe: pyth.herokuapp.com/…jk
da die Ausgabe eine Liste sein kann.IA-32 Maschinencode, 26 Bytes
Hexdump des Codes:
Ich habe mit dem folgenden C-Code begonnen:
Es schreibt die Ausgabe in den bereitgestellten Puffer. Es gibt nicht die Länge der Ausgabe zurück, aber es wird nicht wirklich benötigt: Die Ausgabelänge ist immer
m + n - 2
:Um den C-Code in Maschinencode umzuwandeln, habe ich zuerst einige Anpassungen vorgenommen, um einen der
if/else
Zweige leer zu machen und mit zu vergleichen,0
anstatt mitn
:Von hier aus ist das Schreiben des Inline-Assembler-Codes unkompliziert:
quelle
t
ist die "Entfernung zubuzz
". Wenn der Abstand mindestens istn
, gehen Siefizz
, sonst gehen Siebuzz
; aktualisiere die Entfernung; Wiederholen, bis es 0 ist.Python - 125 Bytes
Verwendet einen sehr einfachen Algorithmus, erhöht nur die Koordinaten und erkennt, wenn er die Linien kreuzt und druckt. Bin auf der Suche nach Pyth zu übersetzen.
Diese while-Schleife überprüft die Anzahl der
l
Ines und dann, ob einer der Werte eine int-Grenze überschreitet, indem sie subtrahiert.Nimmt Eingaben wie
39, 100
von stdin und druckt wieHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
von stdout in einer Zeile.quelle
CJam, 15 Bytes
Probieren Sie es hier aus.
Es druckt
01
für V und10
für H.Erläuterung
Die diagonale Linie kreuzt eine horizontale Linie für jeweils 1 / n der gesamten diagonalen Linie und eine vertikale Linie für jeweils 1 / m.
quelle
TI-BASIC, 32
Einfach. Verwendet eine durch Zeilenumbrüche getrennte Folge von
0
und1
. Die Vorteile von TI-BASIC sind die Zwei-Byte-gcd(
und die implizite Multiplikation, die Nachteile sind jedoch die For-Schleife mit dem Endwert und den 5 für die Eingabe aufgewendeten Bytes.quelle
Python, 47
Wie Anatolygs Algorithmus , jedoch direkt mit Modulen überprüft.
quelle
Haskell, 78 Bytes
Anwendungsbeispiel:
So funktioniert es: Erstellen Sie eine Liste der x-Werte aller vertikalen Kreuzungen
(x,0)
fürx
in [1,2, ..., m-1] (0
zeigt vertikal an) und hängen Sie die Liste der x-Werte aller horizontalen Kreuzungen an(y*m/n,1)
füry
in an [1,2, ..., n-1] (1
zeigt horizontal an). Sortieren und nehmen Sie die zweiten Elemente der Paare.Fluch des Tages: Ich muss wieder 17 Bytes aufwenden,
import
weilsort
inData.List
und nicht in der Standardbibliothek.quelle
KDB (Q), 44 Bytes
Erläuterung
Finde alle x Achsenwerte von Schnittpunkten und sortiere sie. Wenn mod 1 Null ist, ist sein "V", nicht Null ist "H".
Prüfung
quelle
CJam,
2624 BytesProbieren Sie es online aus
Sehr einfach, so ziemlich eine direkte Implementierung eines Algorithmus vom Typ Bresenham.
Erläuterung:
Das letzte
01
muss gepoppt werden, da die Schleife bis zum Endpunkt durchlief, was nicht Teil der gewünschten Ausgabe ist. Beachten Sie, dass wir die Anzahl der Schleifen nicht einfach um 1 reduzieren können . Andernfalls fehlenN > M
alle0
s der letzten Iteration, während wir nur die allerletzten entfernen müssen0
.quelle
>
für verwenden;W<
.1
oben auf dem Stapel einen habe, kann ich ihn genauso gut produktiv einsetzen.