Kartenhaus (Version 2)

8

Vielen Dank an FryAmTheEggman für die Idee für diese zweite Version.
Version 1 hier .

Nicht ganz so einfache Herausforderung: Bauen Sie bei einer bestimmten Anzahl von Karten das größte Kartenhaus, das Sie können, mit dieser Anzahl von Karten gemäß der folgenden Baureihenfolge:

                          /\       /\         /\         /\/\
                 --       --       --         ----       ----
/\  →  /\/\  →  /\/\  →  /\/\  →  /\/\/\  →  /\/\/\  →  /\/\/\  →

                /\         /\
     --         --         --
    /\/\       /\/\       /\/\
    ----       ----       ----
→  /\/\/\  →  /\/\/\  →  /\/\/\/\  →  ...

Sie beginnen also mit einem einstöckigen Haus, bauen dann die angrenzende Gruppe, legen dann die Brückenkarte ein, bauen dann die Gruppe im zweiten Stock und beginnen dann, Gruppen und Brücken vom ersten Stock diagonal zu bauen, um den dritten Stock zu erreichen, und so weiter auf.

Eine einzelne Karte wird mit a /, a \oder a dargestellt --. Wenn Sie nach der Verwendung so vieler Karten wie möglich nur noch eine Karte übrig haben, geben Sie einfach das aus, was Sie bisher erreicht haben (siehe Beispiel für 3 Karten, das Ergebnis ist das gleiche wie für 2 Karten). Die einzige Ausnahme ist der Fall einer Karte, die eine flache Karte ausgeben muss.

Beispiele:

Input: 1
Output: 

--   <a card lying on the floor>

Input: 2
Output:

/\

Input: 3
Output:

/\

Input: 5
Output:

 --
/\/\

Input: 10
Output:

 /\
 ----
/\/\/\

Input: 20
Output:

  /\
  --
 /\/\/\
 ------
/\/\/\/\

Input: 39
Output:

    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Input: 40
Output:

    /\
    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Die Eingabe kann numerisch oder eine Zeichenfolge sein und ist immer eine positive Ganzzahl. Die Ausgabe muss genau wie gezeigt sein, wobei führende und nachfolgende Leerzeichen und Zeilenumbrüche zulässig sind.

Dies ist , also kann das kürzeste Programm / die kürzeste Funktion für jede Sprache gewinnen!

Charlie
quelle
Dies kommt aus dem Sandkasten .
Charlie
6
Es ist eine interessante Herausforderung, aber ich persönlich denke, Sie hätten zwischen dem Posten etwas länger warten sollen, vielleicht einen Tag.
Caird Coinheringaahing
@cairdcoinheringaahing Ich gebe zu, dass ich nicht wusste, wie viel Zeit ich zwischen beiden Posts hätte warten sollen. Es ist eine Weile her seit der letzten Antwort für Version 1, also nahm ich an, ich könnte sie jetzt (24 Stunden später) posten. Vielen Dank für Ihren Rat, das werde ich beim nächsten Mal berücksichtigen.
Charlie
2
Wenn die Breite einer Bridge-Karte ungleich Null ist, sollte die Ausgabe für 1 Karte nicht eine flache Karte sein?
Peter Taylor
2
Ich denke, die Hälfte der Testfälle ist jetzt falsch, weil sie nicht die Möglichkeit berücksichtigen, eine flache Schicht auf den Boden zu legen. Die Sandbox funktioniert nur dann wirklich, wenn Sie eine Frage für ein paar Tage dort lassen, damit die Leute Zeit haben, Kommentare abzugeben. (Und für "Teil 2" ist es wichtig, klar zu machen, dass es Teil 2 ist, damit die Leute nicht denken, dass es Teil 1 ist und sie es bereits gesehen haben).
Peter Taylor

Antworten:

4

Holzkohle , 67 Bytes

Nθ⁼θ¹A²ηW¬‹θη«←÷η³↓→/…\/÷η³↙A⁻θηθA⁺³ηη»‖MM÷η³→Fθ≡﹪鳦¹«↗←\/»²«↑P²»«

Probieren Sie es online aus! Hinweis: Die neueste Version von Charcoal benötigt keine »«-2 Bytes. Erläuterung:

Nθ

Lesen Sie die Eingabe als Ganzzahl in θ.

⁼θ¹

Sonderfall: Wenn die Eingabe 1 ist, drucken Sie a -.

A²ηW¬‹θη«

η stellt die Anzahl der Karten dar, die zum Erstellen der nächsten Ebene benötigt werden, zunächst 2. Eine while-Schleife wird wiederholt, solange genügend Karten für die Ebene vorhanden sind.

←÷η³↓→/…\/÷η³↙

Drucken Sie die linke Hälfte der nächsten Ebene. (Ich wollte die rechte Hälfte drucken, konnte sie aber aus irgendeinem Grund nicht richtig wiedergeben.) Die Anzahl der -s ist ein Drittel der Anzahl der Karten in der Ebene, abgerundet. (Siehe auch meine Antwort auf Teil 1.)

A⁻θηθA⁺³ηη»

Subtrahieren Sie die Anzahl der Karten von der eingegebenen Nummer und addieren Sie drei Karten zu der Anzahl, die für die nächste Ebene erforderlich ist.

‖M

Spiegeln Sie das Haus so weit. (Damit wird auch die -in --für den Fall von 1 - Karte.)

M÷η³→

Bewegen Sie den Cursor rechts neben das Haus.

Fθ

Wiederholen Sie dies für jede verbleibende Karte (falls vorhanden).

≡﹪鳦

Wenn die Karte Modulo 3 ist:

¹«↗←\/»

1, dann drucken Sie ein Paar Karten;

²«↑P²»

2, dann drucken Sie eine horizontale Karte;

«

Andernfalls überspringen Sie die Karte (da zu diesem Zeitpunkt ein Paar benötigt wird).

Neil
quelle
Sehr schöne Antwort! Hast du angefangen, es zu schreiben, bevor ich den Fall von 1 Karte geändert habe? Dieser Fall muss ausgegeben werden --(eine flache Karte), aber wenn Sie Ihr Programm gestartet haben, bevor ich diese Anforderung geändert habe, überspringe ich das ...
Charlie
@CarlosAlejo Nein, ich hatte diesen Fall gerade vergessen. Das tut mir leid. Jetzt behoben.
Neil
1
@Neil bist du sicher, dass du keine Holzkohle gemacht hast? Weil ich anfange, dir nicht zu glauben.
Magic Octopus Urn
@MagicOctopusUrn D: Hey (aber ja, Neils Charcoal-Fähigkeiten sind erstaunlich, wahrscheinlich sogar besser als meine, haha)
ASCII-only
Ups sorry, wird im nächsten Commit behoben
ASCII-
2

Python 2 , 167 182 Bytes

167 Bytes

f=lambda x,y=0:y<x<2and"--"or~-x>y*3and f(x-2-y*3,y+1)or d(y,x)
d=lambda h,r,v=0:h and d(~-h,max(r-3,1),-~v)+" "*-~v+"--"*(h-(r<3))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"or""

182 Bytes

f=lambda x,y=0:[x>1+y*3and f(x-2-y*3,y+1)or d(y,x),"--"][2>x>y]
d=lambda h,r,v=0:d(h-1,r-3*(r>2)-2*(r==2),v+1)+" "*(v+1)+"--"*(h-1+(r>2))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"if h+r else""

Erläuterung (167-Byte-Version)

f=lambda x,y=0:
    "--" if y<x<2         # handle case where x is 1 on step 0 (only one card) 
    else f(x-2-y*3,y+1)   # recursive call with one full triangular level accounted for
    if x>= 2+y*3          # one full level requires 2+3y cards (2, 7, 15...)
    else d(y,x)           # if no more full levels can be constructed, draw
d=lambda h,r,v=0:         # (h)eight to draw, (r)emaining cards, (v)ertical height already drawn (to determine leading white space)
    d(h-1,          ,v+1) # recursive call to draw upper lines
          max(r-3,1)      # subtract remainder cards used in this iteration
    +" "*(v+1)            # leading whitespace for -- row
    +"--"*(       )+"\n"  # -- line. 
           h-(r<3)        # horizontal card count is equal to the remaining count of levels to draw, minus 1, 
                          # ...plus 1 if there are at least three remaining cards to add to the right
    +" "*v                # leading whitespace for /\ row
    +"/\\"*(       )+"\n" # /\ line
            h+(r>1)       # vertical card pair count equals remaining level count
                          # ...plus 1 if there are at least two extra cards
    if h                  # return above is there are levels to draw (h) 
    else ""               # else return nothing (ends recursion)

Probieren Sie es online aus!

  • Das fühlt sich unnötig lang an, aber ich sehe im Moment nichts zu entfernen ... zögern Sie nicht, Vorschläge zu kommentieren
Coty Johnathan Saxman
quelle
Vielen Dank für Ihre Antwort, aber Ihre Beispiele stimmen nicht mit den Testfällen überein. Sie legen mehr Karten in Ihre Häuser als Sie. Zum Beispiel können Sie bei 7 Karten ein Haus mit 4 Karten im ersten Stock, einer Brückenkarte und 2 weiteren Karten im zweiten Stock bauen. Aber du zeigst ein Haus mit 10 Karten (6 Karten im ersten Floow und 2 Bridge-Karten). Überprüfen Sie die Beispiele und die Art und Weise, wie die Häuser gebaut werden.
Charlie
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Coty Johnathan Saxman
Wenn Sie die Codeabschnitte, die direkt aufeinander folgen, trennen möchten, können Sie dies tun, indem Sie die <pre><code>... </code></pre>Tags um Ihre einzelnen Codeblöcke verwenden, anstatt 4 Leerzeichen einzurücken
Taylor Scott
1
Ich sehe, was passiert ist: Aus irgendeinem Grund wird bei Verwendung der <pre><code>Tags <3))+"\n"+" "*v+"/\\"*(h+(r>als anderes Tag erfasst und dieser Bereich der Lösung nicht angezeigt. Vielleicht könnte uns jemand in der Community, der dies ein wenig besser versteht, darüber informieren, wie wir das vermeiden können ... aber abgesehen davon ist Ihre aktuelle Formatierung perfekt lesbar und macht die Notwendigkeit dieser Art der Formatierung insgesamt zunichte
Taylor Scott
2
@ TaylorScott Ein wenig spät, aber Sie können es beheben, indem Sie sie durch HTML-Entitäten ersetzen: &lt;für <und &gt;für>
Business Cat