Figur und Grund

32

Figur und Boden
Quelle: Wikipedia

Für diese Herausforderung sollten Sie zwei Programme schreiben, die der Figur und dem Grund des obigen Bildes ähneln , so dass eines von ihnen figureund das andere gedruckt werden ground. Speziell:

  1. Schreiben Sie ein Programm, das keine Eingaben macht und den String druckt figure. Die einzigen zulässigen Leerzeichen in Ihrem Programm sind Leerzeichen (Code-Punkt 0x20) und Zeilenumbrüche (Zeilenumbrüche, 0x0D, Zeilenvorschübe, 0x0A oder eine Kombination aus beiden).
  2. Ohne Berücksichtigung der Zeilenumbrüche müssen die Anzahl der Leerzeichen (Code-Punkt 0x20) und der Nicht-Leerzeichen gleich sein. Dies wäre beispielsweise ein gültiges Programm (in einer hypothetischen Sprache):

    ab c 
       d
    e f
    

    Beachten Sie, dass die erste Zeile ein Leerzeichen enthält.

  3. Wenn Sie das n- te Leerzeichen mit dem n- ten Nicht-Leerzeichen tauschen , sollte das Programm groundstattdessen drucken . Für das obige Beispiel würde das Programm so aussehen:

      a b
    cde 
     f 
    

    Beachten Sie, dass in der zweiten und dritten Zeile nachgestellte Leerzeichen vorhanden sind.

Sowohl die Zahl und die Boden - Lösungen sollten die vollständigen Programme in der gleichen Sprache sein , die auf STDOUT aus . In beiden Fällen können Sie eine einzelne optionale nachgestellte Zeile drucken. Sie können alles, was Sie wollen, an STDERR ausgeben, solange STDOUT korrekt ist.

Sie können jede Programmiersprache verwenden , beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind.

Das ist , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .

Hilfsskript

Sie können mit dieser CJam Skript zwischen einen konvertieren Figur und Grund - Programm. Fügen Sie einfach eine der beiden in das Eingabefeld ein und führen Sie das Programm aus. Außerdem erfahren Sie, ob die Anzahl der Leerzeichen und der Nicht-Leerzeichen nicht übereinstimmt.

Bestenliste

Martin Ender
quelle

Antworten:

20

Gelee , 20 Bytes

Zahl

“¦ĠȮ“©ụd» Ṃ         

Neun nachgestellte Leerzeichen. Probieren Sie es online!

Boden

         “ ¦ĠȮ“©ụd»Ṃ

Keine nachgestellten Leerzeichen. Probieren Sie es online!

Wie es funktioniert

Beachten Sie zunächst, dass Leerzeichen keine Atome sind, sodass die Leerzeichen außerhalb der Zeichenfolgenliterale das Programm in keiner Weise beeinflussen.

Die String-Literale verwenden die in Jelly integrierte wörterbuchbasierte String-Komprimierung , um die gewünschten Wörter zu erzeugen. Ein komprimiertes Zeichenfolgenliteral beginnt mit , endet mit »und wird intern verwendet, um ein Array von Zeichenfolgen zu erstellen.

In der Figur Programm, “¦ĠȮ“©ụd»ergibt die Zeichenfolge Paar ( „figure“, „Boden“) , und das Atom wählt das lexikographische Minimum, das heißt, „Figur“ .

“ ¦ĠȮ“©ụd»Ergibt im Ground-Programm stattdessen das String-Paar ("logicallyAbacs", "ground") . Das lexikografische Minimum ist jetzt "Boden" , der pflichtbewusst wählt.

In beiden Fällen gibt der Interpreter automatisch den letzten Rückgabewert - dh das ausgewählte Minimum - an STDOUT aus.

Dennis
quelle
14

Python 2, 53 Bytes

Ersetzen Sie ·in beiden Antworten durch Leerzeichen:

····················
print'······figureground'[6:12]#

Druckt figure.

print'figureground'[
······6:12]#····················

Druckt ground.

Lynn
quelle
14

05AB1E , 15 14 Bytes

Zahl

 'ŠÂ,'í¶      

Probieren Sie es online!

Boden

'       ŠÂ,'í¶

Probieren Sie es online!

Verwendet die CP-1252- Codierung. Beachten Sie die nachstehenden Leerzeichen. Im Figure- Programm handelt es sich um ein normales Programm ohne Fehler. Es dekomprimiert die folgenden Wörter:

'ŠÂ  ->  figure
'í¶  ->  ground

Das Komma druckt Pops und druckt das figureWort mit einem Zeilenumbruch. Da etwas gedruckt wurde, wird die Oberseite des Stapels nicht mehr gedruckt.

Im Ground- Programm gibt es einige Fehler, die in diesem Fall von Vorteil sind. Der folgende Teil:

'<space>

Drückt ein Leerzeichen auf den Stapel. Das Šdreht den Stapel, der eine Arität 3 hat . Es gibt nur ein Element auf dem Stapel und keine Eingabe, daher gibt es eine Ausnahme, nämlich das Löschen des Stapels. Die ÂGabel teilt die Oberseite des Stapels auf, dies hat jedoch die gleiche Geschichte wie der Rotationsoperator. Der ,Befehl gibt also im Grunde nichts aus.

Das heißt, das Programm gibt immer noch den oberen Bereich des Stapels aus 'í¶. Ergebnis in ground.

Adnan
quelle
9

Retina , 31 Bytes

Zahl:

|       
Zahl
 Boden
      

Boden:

 abbildung

|       
Boden

Figur und Grund . Beide Programme erfordern, dass STDIN leer gelassen wird, um gültige Figuren- oder Bodenprogramme zu sein.

FryAmTheEggman
quelle
9

Pyth, 30 Bytes

Zahl

"figure" "ground              

14 nachgestellte Leerzeichen.

Prüfung

Boden

Keine nachgestellten Leerzeichen

        "       figure""ground

Prüfung

Wie es funktioniert

Ziemlich hilfreich ist, dass ein Leerzeichen das Drucken in Pyth unterdrückt, während String-Literale ohne Abschluss "implizit geschlossen werden.

Das erste Programm besteht daher aus zwei Zeichenfolgen "figure"und "ground ". Die erste Zeichenfolge wird implizit gedruckt, und das Drucken der zweiten Zeichenfolge wird unterdrückt, was bedeutet, dass gerade figuregedruckt wird.

Das zweite Programm besteht aus zwei Zeichenfolgen " figure"und "ground". Das Drucken des ersten wird unterdrückt, und das zweite wird implizit gedruckt, was bedeutet, dass nur groundgedruckt wird.

TheBikingViking
quelle
6

MATL , 37 Bytes

Erstes Programm

'figure'         
%x'ground'         

Jede Zeile enthält 9 nachgestellte Leerzeichen.

Probieren Sie es online!

Zweites Programm

    'figure'%
      x'ground'

Hier gibt es keine Traling-Räume.

Probieren Sie es online!

Erläuterung

Nichts schrecklich schickes ...

  • Leerzeichen und Zeilenumbrüche zwischen Anweisungen werden von MATL ignoriert.
  • % ist das Kommentarsymbol, das den Rest der Zeile ignoriert.
  • x löscht die Oberseite des Stapels.
  • Der Stapel wird implizit am Ende des Programms gedruckt.
Luis Mendo
quelle
6

Java, 180 Bytes

Durch .Leerzeichen ersetzen .

Drucke "Figur":

class
A{public
static
void
main(String[]a){System.out.println(
//"ground"
//
.....
........
......
....
...................................
..
........
..........
....
"figure");}}

Drucke "Boden":

.....
........
......
....
...................................
..........
..
class
A{public
static
void
main(String[]a){System.out.println(
//
"ground"
//"figure"
);}}
............
Arnaud
quelle
5

Befunge, 54 Bytes

Abbildung ( Online ausprobieren! )

#v "erugif" v>
      : #, _ @>         
"dnuorg"

Zehn Leerzeichen in der zweiten Zeile.

Ground ( Online ausprobieren! )

  # v "erugif" v 
>: #, _ @> "dnuorg"
        

Ein Leerzeichen in der ersten Zeile und acht Leerzeichen in der dritten Zeile.

James Holderness
quelle
4

Mathematica, 50 34 Bytes

Verwendet eine REPL-Umgebung. (Das Hinzufügen eines Print[]Wrappers mit der gleichen Anzahl von Leerzeichen würde die Byteanzahl um 14 erhöhen.) Die beiden Programme sind

01figure+0 1ground                

(mit 16 nachgestellten Leerzeichen) und

          0       1figure+01ground

Der Schlüssel hierbei ist, dass Mathematica die Ziffernkonkatentation ohne Leerzeichen als eine einzige Zahl behandelt, dazwischenliegende Leerzeichen jedoch als nachbarschaftliche Multiplikation interpretiert werden, ebenso wie die Verkettung von Zahlen und beliebigen Variablennamen. Der erste Ausdruck 1*figure+0*1*groundergibt also, was ist figure; der zweite Ausdruck 0*1*figure+1*groundergibt, was ist ground.

Greg Martin
quelle
4

PHP, 44 42 Bytes

Abbildung: (16 nachgestellte Leerzeichen, 5 Leerzeichen zwischen Abbildung &;)

echo''?ground:figure     ;                 

Boden: (20 führende Felder)

                     echo' '?ground:figure;

Wirklich ziemlich einfach, funktioniert, weil ''es falsch und ' 'wahr ist. Verwenden Sie wie:

php -r "echo''?ground:figure     ;                "
php -r "                    echo' '?ground:figure;"

edit: 2 nachträglich sichtbare Bytes dank Martin Ender gespeichert

user59178
quelle
3

Haskell, 96 94 88 82 77 Bytes

Erstes Programm, druckt "figure":

main              =          putStr$idid"ground"
idid    _          ="figure"

Zweites Programm, druckt "ground":

    main=putStr$id id"ground"                   
    idid _="figure"         

Ruft eine von zwei unterschiedlich benannten konstanten Funktionen auf

Angs
quelle
3

Haskell, 88 65 Bytes

main=putStr
...........--
.."figure"..........
--"ground"........

und

...........
main=putStr..
--........"figure"--
.........."ground"

.zeigt ein Leerzeichen an. Nur ein paar Zeilen Kommentar (-> --) zum Jonglieren.

nimi
quelle
3

Python 2, 52 Bytes

........................
print"figure"
an
d
"ground"

.s geben Leerzeichen an. Die letzten drei Zeilen werden nach Fehlern aufgeteilt, ohne dass ein SyntaxErrorangezeigt wird, das die Ausführung des Codes verhindern würde.

In der Grundversion wird nur anddie zweite Zeichenfolge gedruckt.


Alternative (längere) Versuche:

.......
print(#"ground")#
"figure")...................


print"figure"""and"ground"
.............
.............
Sp3000
quelle
3

JavaScript (ES6), 56 Byte

alert('figure'
                //&&'ground'
           )
              
alert('figure'//            
&&'ground') 

Die Figur hat keine nachgestellten Leerzeichen.

Neil
quelle
Ich zähle 56 Bytes für jedes Programm, es sei denn, die Zeilenumbrüche zählen nicht. Ich bezweifle, dass es kürzer wird.
ETHproductions
@ETHproductions Ugh, das passiert, wenn man Bytes manuell zählt :-(
Neil
2

Schiene , 56 Bytes

Zahl

$'main'
 -[figure]o                
-          [ground]o

In der zweiten Zeile befinden sich 16 nachgestellte Leerzeichen. Das Programm bricht mit einem Fehler ab.

Probieren Sie es online!

Boden

       
$ 'main' - [figure] o
 - [Boden] o         

In der ersten Zeile befinden sich 7 Leerzeichen und in der letzten Zeile 9 nachgestellte Leerzeichen. Dieses Programm wird ebenfalls mit einem Fehler beendet.

Probieren Sie es online!

Erläuterung

Rail sucht nach einer Linie, die mit (Regex-Notation) beginnt \$.*'main', um einen Einstiegspunkt zu finden. Der Zug (Anweisungszeiger) fährt dann $in südöstlicher Richtung ab. Dinge, die mit dem Zug nicht erreichbar sind, können für das Programm komplett ignoriert werden. Dies schließt alles ein, was sich auf derselben Linie wie der Einstiegspunkt befindet. Da der -Südosten des $Zuges sofort nach Osten abbiegt, reduzieren sich beide Programme einfach auf:

 -[figure]o
 -[ground]o

[...]bezeichnet ein String-Literal und gibt oes aus. Normalerweise brauchen Sie ein #, um die Schiene zu beenden, aber wenn Sie es weglassen, wird das Programm trotzdem beendet (beschwert sich jedoch bei STDERR, dass der Zug abgestürzt ist).

Martin Ender
quelle
2

> <> 39 Bytes

Verwenden ·, um Leerzeichen darzustellen.

Zahl

v·
"·dnuo
e·
r·
u·
g··
i··
f···
"·
>·o·

Probieren Sie es online!

Boden

·v
·"····
·d
·n
·u
·oe
·ru
·gif
·"
·>·o

Probieren Sie es online!

Beide Programme werden mit einem Fehler beendet.

Erläuterung

Durch vertikales Schreiben des Codes konnte ich das gund das rzwischen beiden Lösungen sowie die Anführungszeichen und das >und ofür die Ausgabeschleife wiederverwenden .

In beiden Fällen ist das einzige Bit, das ausgeführt wird, die Spalte unter der v, die die Buchstaben des gewünschten Wortes in umgekehrter Reihenfolge auf den Stapel schiebt. Dann >leitet den Befehlszeiger auf der rechten Seite , wo es durch die Schlaufen o, Drucken der Zeichen , bis der Stapel leer ist.

Martin Ender
quelle
Ich habe gerade angefangen, an meiner eigenen> <> Version zu arbeiten, und bin dann auf Ihre gestoßen. Ich mag Ihre Idee, vertikal zu arbeiten, wirklich (meine ist sehr "normal").
Teal
@Tealpelican Ich habe mir das erst ausgedacht, als ich die Antwort von Fission herausgefunden hatte. Vorher war meine beste> <> Lösung 42 Bytes: !__|"druong">o<"figure"(Wo _sind Leerzeichen und die verbleibenden Leerzeichen stehen einfach am Ende der Zeile).
Martin Ender
Meine kürzeste aktuelle Version ist diese: ## "de nr uu og ri GF"> o! ~ ~! <## Was komisch genug ist, sind auch 42 Bytes! Meine Vorgängerversionen hatten eine Fehlerprüfung, konnten aber nur auf 53 Byte reduziert werden.
Teal
2

Spaltung , 37 Bytes

Verwenden ·, um Leerzeichen darzustellen.

Zahl

D·
"···
f··
i··
g·
u·
r·
e·ound
"·
;·

Probieren Sie es online!

Boden

·D
·"fi
·gu
·re
·o
·u
·n
·d····
·"
·;

Probieren Sie es online!

Erläuterung

Funktioniert im Prinzip genauso wie meine> <> Antwort (obwohl ich diese zuerst gefunden habe). Die einzigen Unterschiede sind, dass "die Zeichen sofort in Fission gedruckt werden, weshalb die Wörter nicht verkehrt herum geschrieben werden und wir das Programm nur mit ;am Ende beenden müssen.

Martin Ender
quelle
1

netzförmig, 46 Bytes

                      "ground""figure"" "?$$o;

Probieren Sie es online! Dies wird gedruckt ground.

"ground""figure"""?$$o                 ;      

Probieren Sie es online! Dies wird gedruckt figure.

Boden

Relevanter Code:

"ground""figure"" "?$$o;
................          push these two strings
                " "?$     pop " " off (since " " is truthy, `?` executes `$`)
                     $    pop TOS ("figure")
                      o;  output and terminate

Zahl

Relevanter Code:

"ground""figure"""?$$o;
................         push these two strings
                ""?$     doesn't activate
                    $    pop ""
                     o;  output and terminate
Conor O'Brien
quelle
1

Brian & Chuck , 55 53 Bytes

Zahl

erugif?dnuorg             
}<.<.<.<.<.<.             

In jeder Zeile befinden sich 13 nachgestellte Leerzeichen.

Probieren Sie es online!

Boden

             erugif?dnuorg
             }<.<.<.<.<.<.

Probieren Sie es online!

Erläuterung

Ah, es ist schon eine Weile her, dass ich Brian & Chuck das letzte Mal benutzt habe. Zur Erinnerung, Brian und Chuck sind zwei Brainfuck-ähnliche Instanzen, die den Quellcode des jeweils anderen als Band verwenden. Nur Chuck kann den Druckbefehl verwenden ., unter bestimmten ?Bedingungen zwischen den beiden Instanzen wechseln und }ist ähnlich wie [>]in Brainfuck. Unbekannte Befehle werden einfach ignoriert.

Da die Leerzeichen am Anfang der Programme ignoriert werden, sind die beiden Programme fast identisch. Der einzige Unterschied besteht darin, dass sich der Befehlszeiger nach dem Schaltbefehl ?bewegt, bevor der nächste Befehl ausgeführt wird. Daher wird der erste Befehl auf Chucks Band immer übersprungen. Der einzige wirkliche Unterschied besteht also darin, dass das Bodenprogramm das ausführt, }während das Figurenprogramm dies nicht tut. So funktioniert der Code:

?   Switch control to Chuck.
}   GROUND PROGRAM ONLY: Move the tape head on Brian to the end of the tape.
<.  Move the tape head left and print the character there.
... Do the same another five times to print the remainder of the string.
Martin Ender
quelle
0

WinDbg, 74 Bytes

Boden

                      ea2000000"      groundfigure";;;da       2000006  L6

Zahl

ea2000000"groundfigure          ";;;da                  2000006       L6  

Abbildung hat 2 nachgestellte Leerzeichen. Ich denke, dass mindestens 2 oder 4 Bytes golfbar sein sollten ...

Es funktioniert, indem eine Zeichenfolge in den Speicher geschrieben und 6 Zeichen daraus angezeigt werden. Die Zeichen in der Zeichenfolge werden neu angeordnet, sodass die angezeigten Zeichen zwischen den Programmen wechseln:

* Ground:
ea 2000000 "      groundfigure";     * Write string "      groundfigure" starting at 2000000
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, from 2000006, ie- ground

* Figure:
ea 2000000 "groundfigure          "; * Write string "groundfigure          " to memory
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, ie- figure

Ausgabe:

0:000>                       ea2000000"      groundfigure";;;da       2000006  L6
02000006  "ground"
0:000> ea2000000"groundfigure          ";;;da                  2000006       L6  
02000006  "figure"
Milch
quelle