Schreiben Sie ein Programm oder eine Funktion, die eine positive Ganzzahl N aufnimmt und eine N × N ASCII-Zeichenfolge ausgibt oder zurückgibt, deren obere Hälfte ein Halbkreis aus (
's und deren untere Hälfte ein nach unten weisendes Dreieck aus V
' s ist, mit Leerzeichen als Polsterung.
Mit anderen Worten, stellen Sie eine ASCII-Eistüte her: (Ausgabe für N = 17)
(((((
(((((((((
(((((((((((((
(((((((((((((
(((((((((((((((
(((((((((((((((
(((((((((((((((((
(((((((((((((((((
VVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVV
VVVVVVVVVVVVV
VVVVVVVVVVV
VVVVVVVVV
VVVVVVV
VVVVV
VVV
V
Beispiele
Hier sind die Ausgänge für N = 1 bis 5. Beachten Sie, dass für ungerade N das Dreieck immer die größere Hälfte sein muss.
V
((
VV
(((
VVV
V
((
((((
VVVV
VV
(((
(((((
VVVVV
VVV
V
Hier ist ein N = 101 Pastebin.
Und hier ist eine ungolfed Python 3 Referenzimplementierung:
N = int(input())
ic = [[' '] * N for _ in range(N)]
for y in range(N//2):
for x in range(N):
if (x - (N - 1) / 2)**2 + (y - (N - 1) / 2)**2 < (N / 2)**2:
ic[y][x] = '('
for y in range(N//2, N):
for x in range(y - N//2, N - (y - N//2)):
ic[y][x] = 'V'
for line in ic:
print(''.join(line))
Einzelheiten
- Nehmen Sie Eingaben von stdin, der Befehlszeile oder als Funktionsargument entgegen. Ausgabe an stdout oder ähnliches, oder Sie geben die Zeichenfolge zurück, wenn Sie eine Funktion schreiben.
- Der Kegelabschnitt sollte genau mit der Referenzimplementierung für alle N übereinstimmen.
- Die Eisportion muss nicht genau mit der Referenzimplementierung übereinstimmen, solange sie für alle N eindeutig die Form eines Halbkreises hat. (Sie müssen sich also nicht um geringfügige Unterschiede im Halbkreis aufgrund von Rundungsfehlern sorgen .)
- Es sollten keine unnötigen führenden Leerzeichen vorhanden sein, es können jedoch überflüssige nachgestellte Leerzeichen vorhanden sein.
- Die Ausgabe kann optional einen nachgestellten Zeilenumbruch enthalten.
- Optional können Sie alle drei anderen verschiedenen verwenden druckbaren ASCII - Zeichen anstelle von
(
,V
und Raum.
Wertung
Die kürzeste Übermittlung in Bytes gewinnt. Tiebreaker geht zur ältesten Vorlage.
Antworten:
CJam, 46 Bytes
Probieren Sie es online aus.
Ich glaube, dies entspricht genau der ursprünglichen Spezifikation, die erforderlich war, als ich anfing, diese Antwort zu erstellen. Möglicherweise können ein paar Bytes eingespart werden, indem die ursprüngliche Spezifikation der Mathematik nicht mehr eingehalten wird. Solange ich jedoch keine Möglichkeit sehe, mehr als ein oder zwei Bytes zu speichern, belasse ich dies beim jetzigen Stand.
Erläuterung
quelle
2
's und1
' s anstelle von(
's undV
' s zu verwenden?inca2
129123121111107Dabei werden meist die Formeln aus dem Python-Beispiel verwendet, aber anstelle von Doppelschleifen werden Jot-Dots und Iotas verwendet. Die
i
Funktion führt den Zirkeltest für diej
Funktion durch, die darauf einen Punkt aufruft . Und diek
Funktion führt den Dreieckstest für diel
Funktion durch. Diec
Funktion verknüpft die Ergebnisse vonj
undl
und formt sie in N × N um.Bearbeiten: -6 Kombiniere 2 Karten zu 1.
Bearbeiten: -2 Entferne nutzlose Reisen.
edit: schöner Typoskript.
edit: -10 wende wiederholte Ausdrücke Array-weise an.
edit: -4 Wiederholte Ausdrücke als Funktion ausklammern.
edit: zeilenweiser Kommentar.
Im Einzelnen ist der Einstiegspunkt die
c
Funktion, die ein implizit genanntes Argument annimmty
.Die
j
Funktion erhält den gleichen Eingabewert wie ihry
Parameter.Der Punkt hier macht die Doppelschleife. Es ruft die
i
Funktion mit jeder Kombination von Elementen aus dem linken und rechten Array (0..n / 2 und 0..n) auf. So ist diei
empfängt Funktion wiex
der y - Index in der Tabelle, und er empfängt alsy
der x - Index. Die Namen sind hier etwas verkehrt herum gekommen :).woher
q
kommtzurück zu
i
Der Boden sollte nicht notwendig sein. Aber anscheinend hat der Dolmetscher einen Fehler.
Die
l
Funktion arbeitet ähnlich wie diej
Funktion mit einem Punkt.Die
k
Funktion liefert einen Booleschen Wert, der mit 2 skaliert ist, sodass die Werte später im Mapping von den Eiscreme-Werten unterschieden werden können.In Aktion (Weiterleiten durch
tr
, um Tabulatorzeichen zu entfernen, die die REPL-Eingabeaufforderung darstellen):quelle
Python 2,
193192Verwendet keine Zeichenfolgen, nur Mathematik
s(L,U)
Gibt eine Zahl der Form „U
-digits mit den am weitesten rechtsL
Nullen und der Rest ones“f(N,m)
zurückkehrt eine N-stellige Zahl mit dem inneren Abschnitt2
und einem m-breiten Rand1
auf jeder Seite machtg(N,m)
das gleiche, wobei jedoch7
für die ‚Farbe‘ des inneren Abschnitts, da es der Textur des Kegels genauer entsprichtAusgabe
quelle
Perl 6, 175
Ziemlich unkomplizierte Implementierung ohne viel Golfspiel, nur überflüssige Leerzeichen / Interpunktion:
quelle