Blockbox das Hex?

11

Schreiben Sie ein Programm oder eine Funktion in einer beliebigen Programmiersprache, die eine 6-stellige hexadezimale Eingabe / Argumentation verwendet. Die Eingabe / das Argument kann 6 Werte oder eine 6-stellige Zeichenfolge sein.

Ihr Programm sollte einen genau 8 Zeichen breiten rechteckigen Zeichenblock ausgeben, der nur die mitgelieferten Hexadezimalzahlen in Kombination mit Leerzeichen enthält (+ Zeilenvorschub). Der rechteckige Block ist eine Kombination kleinerer Blockformen, eine für jeden der 6 angegebenen Werte.

Hier folgen 2 demostrative Stichprobeneingaben und Stichproben gültige Ausgaben:

Probeneingang :

"464fa6" or [4, 6, 4, 15, 10, 6]

Eine gültige Lösung Ausgabe :

44 66 ff
44 66 ff
   66 ff
aa     f
aaa ffff
aa  ffff
aaa     
    6 44
66666 44

Probeneingang :

"35bf12"

Eine gültige Lösung Ausgabe :

55555 22

bbbbbbbb
b b b   
      33
fffff  3
ff  ff  
ffffff 1

Regeln:

  1. Die Ausgabe muss eine rechteckige Form haben

  2. Die Ausgabe kann eine beliebige vertikale Höhe haben, muss jedoch genau 8 Zeichen breit sein

  3. Die "inneren Blöcke", die als "Blockformen" bezeichnet werden, können keine Verbindung zu einer anderen Blockform herstellen. Die Blockformen müssen durch eine Wand aus Leerzeichen mit genau 1 Zeichen Breite horizontal, vertikal und diagonal getrennt sein.

  4. Die Wand von Leerzeichen kann nicht parallel zu den Außenkanten verlaufen, an den Ausgabekanten können nur 1 Zeichen breite Wandkanten vorhanden sein. An der äußersten Rechteckkante der Ausgabe sollten keine verknüpften Leerzeichen vorhanden sein.

  5. Die Breite der Wand von Leerzeichen sollte zu keinem Zeitpunkt 1 Zeichen überschreiten.

  6. Die inneren Blockformen sollten mit der Fläche von x Zeichen einheitlich sein, wobei x der angegebene Hexadezimalwert ist, und die Form sollte aus dem Zeichen x bestehen, wobei x das Hexadezimalzeichen ist, das repräsentativ ist.

  7. Die inneren Blockformen können eine beliebige Form haben, solange alle Formzeichen vertikal oder horizontal verbunden sind und die Regeln für die Wand von Leerzeichen nicht bewertet werden.

  8. Die 6 Blockformen können in einer beliebigen internen "Reihenfolge" innerhalb des ausgegebenen Rechtecks ​​platziert werden.

  9. Gültiger Eingabebereich: 1 ... 15 ("1" ... "f") für jede Form. Die Eingabe in Ihr Programm sollte keine anderen Informationen als die 6 Hexadezimalzahlen enthalten, und die Eingabe sollte nicht anders als in den Beispielen sortiert werden, bevor sie Ihrem Programm / Ihrer Funktion zugeführt wird. Teilen Sie uns mit, welches Eingabeformat Ihre Lösung verwendet (die Eingabe darf keine anderen Informationen als die Hexadezimalwerte enthalten).

  10. Eine innere Blockform kann hohl sein. Das Loch sollte aus Leerzeichen bestehen, die als Wand aus Leerzeichen gelten. Dies bedeutet, dass das Loch in einer hohlen Innenblockform nicht breiter als 1 Zeichen sein darf.

Drei Beispiele für gültige Hohlformen:

aaa
a aaa
aaa

999
9 9
999
9

ffffff
f   ff
ffffff

Ein Beispiel für eine ungültige Hohlform:

ffffff
f   f
f   f
fffff

Ich gehe davon aus, dass es nicht möglich ist, alle Eingabekombinationen gemäß den obigen Regeln zu "lösen". Daher liste ich 10 Beispieleingaben auf, die Ihr Programm "lösen" sollte (alles ist nachweislich lösbar):

 1. 464fa6 (same as the first sample)
 2. 35bf12 (second example input seen above)
 3. 111126
 4. ff7fff
 5. 565656
 6. abcdef
 7. 1357bd
 8. 8c6a42
 9. ab7845
10. 349a67

Ihr Programm sollte in der Lage sein, alle 10 Sameneingänge in vernünftiger Zeit zu lösen. Übersetzen Sie die vernünftige Zeit auf einem Standard-Desktop-Computer auf 1 Stunde. Sagen Sie wie: 3 GHz Dual Core, 4 GB Speicher als Referenz.

Dies ist Code Golf, die kürzeste Lösung gewinnt. Die Lösung kann ein voll funktionsfähiges Programm oder eine Funktion sein

Plarsen
quelle
Was bedeutet Regel 7 über "Verbinden"? Ist dies nur eine Wiederholung der Regel 5-Einschränkung, die (meine Formulierung) die Existenz eines 2x2-Leerquadrats verbietet?
Peter Taylor
Es tut mir leid wegen einiger Anpassungen, aber Regel 7 ist eher eine Anpassung von Regel 6, bei der angegeben wird, dass die Formen einheitlich sein sollten. Mit anderen Worten, Regel 7 besagt, dass eine einzelne Form nicht in zwei separate kleinere Formen unterteilt werden kann.
Plarsen
6
Ich habe nicht die Absicht gemein zu sein, aber dieses Problem ist keineswegs faszinierend, interessant oder zeigt eine ästhetisch ansprechende Eigenschaft. Es ist nur eine abstrakte Herausforderung, und ich verstehe nicht, warum jemand die nötige Geduld haben würde, um alle Regeln zu lesen, natürlich nichts über die Lösung. Viel Glück bei deinem nächsten!
Bogdan Alexandru
1
Klarstellung: Das Leerzeichen kann eine beliebige Form bilden, solange es die Blöcke trennt und keinen 2x2-Block und keine zwei aufeinander folgenden Leerzeichenblöcke am äußeren Rand enthält.
John Dvorak
2
Diese Frage ist wirklich schwierig (oder vielleicht bin ich ein schlechter Problemlöser) ... haben Sie selbst eine Lösung, Plarsen? Wie auch immer, ich denke, es wäre interessanter gewesen, die Whitespace-Anforderungen fallen zu lassen und es zu einer Code-Herausforderung zu machen, bei der die Punktzahl sowohl von der Anzahl der Zeichen als auch von der Höhe des Blocks abhängt (was es vorteilhaft macht, viel zu packen, ohne es zu machen es ist eine harte Anforderung).
FireFly

Antworten:

1

Haskell, 156

Nun, dieser streckt die Regeln ein bisschen. Ich habe keine Leerraumwände außer den Zeilenumbrüchen, daher haben alle meine Wände eine Länge von 1.

import Data.List
r=replicate
main=getLine>>=putStrLn.concatMap(\b->unlines$s(head$elemIndices b"0123456789abcdef")b)
s n c|n<9=[r n c,""]|True=r 8 c:s(n-8)c

Ausgabe für 464fa6:

4444

666666

4444

ffffffff
fffffff

aaaaaaaa
aa

666666
Zaq
quelle
Sehr, sehr nah :) aber Regel 4 wird nicht erfüllt. Wenn Sie ein imaginäres Rechteck Ihrer Ausgabe erstellen, haben Sie mehr als 1 ausrichtendes Leerzeichen in einer Reihe am äußersten rechten Rand.
Plarsen
1

BrainF * ck - 134 (Newline intr

>>+[++++++++++>,----------]>++++++[<+++++>-]<++[<]<++++++[>+++++<-]>++>-
>..<<.>>>..<<<.>>>>..<<<.<........>.>>>>..>>>.<<..>>.<..[<]>>.

Ich denke, dass dies die einfachste Antwort ist

Die Eingabe erfolgt über 6 hexadezimale Zeichen in stdin, gefolgt von einer neuen Zeile zum Senden.

EDIT: Dies schlägt aufgrund von Regel 6 fehl, die ich bis jetzt nicht vollständig erkannt habe: /

Tyzoid
quelle