Ihr Chef bittet Sie, ein "Hallo Welt" -Programm zu schreiben. Da Sie für Codezeilen bezahlt werden, möchten Sie diese so komplex wie möglich gestalten. Allerdings , wenn Sie nur Unsinn Linien hinzufügen oder offensichtlich nutzlos oder Verschleiern von Sachen, werden Sie nie es durch Code - Review bekommen. Daher ist die Herausforderung:
Schreiben Sie ein "Hallo Welt" -Programm, das so komplex wie möglich ist, unter der Bedingung, dass Sie für jede Komplexität im Code eine "Rechtfertigung" angeben können.
Das erforderliche Verhalten des Programms besteht darin, nur eine einzelne Zeile "Hallo Welt" (ohne die Anführungszeichen, aber mit einem Zeilenumbruch am Ende) auszugeben und dann erfolgreich zu beenden.
"Begründungen" umfassen:
- Schlagwortkompatibilität ("Moderne Software ist objektorientiert!")
- allgemein anerkannte gute Programmierpraktiken ("Jeder weiß, dass Sie Modell und Ansicht trennen sollten")
- Wartbarkeit ("Wenn wir es so machen, können wir es später einfacher machen XXX")
- und natürlich jede andere Rechtfertigung, die Sie sich vorstellen können, (in anderen Situationen) für echten Code zu verwenden.
Offensichtlich dumme Begründungen werden nicht akzeptiert.
Außerdem müssen Sie Ihre Wahl der Sprache "begründen" (wenn Sie also eine von Natur aus wörtliche Sprache wählen, müssen Sie begründen, warum dies die "richtige" Wahl ist). Unterhaltsame Sprachen wie Unlambda oder Intercal sind nicht akzeptabel (es sei denn, Sie können eine sehr gute Begründung für ihre Verwendung angeben ).
Die Punktzahl der qualifizierenden Einträge wird wie folgt berechnet:
- 1 Punkt für jede Aussage (oder was auch immer das Äquivalent zu einer Aussage in der Sprache Ihrer Wahl ist).
- 1 Punkt für jede Definition einer Funktion, eines Typs, einer Variablen usw. (mit Ausnahme der Hauptfunktion, sofern zutreffend).
- 1 Punkt für jede Modulverwendungsanweisung, Datei-Include-Anweisung, Namespace-Using-Anweisung oder ähnliches.
- 1 Punkt für jede Quelldatei.
- 1 Punkt für jede erforderliche Vorwärtsdeklaration (wenn Sie sie durch Umstellen des Codes beseitigen könnten, müssen Sie "begründen", warum die von Ihnen gewählte Vereinbarung die "richtige" ist).
- 1 Punkt für jede Kontrollstruktur (wenn, während, für usw.)
Denken Sie daran, dass Sie jede einzelne Zeile "begründen" müssen.
Wenn die gewählte Sprache so unterschiedlich ist, dass dieses Schema nicht angewendet werden kann (und Sie eine gute "Begründung" für seine Verwendung angeben können), schlagen Sie bitte eine Bewertungsmethode vor, die der oben für Ihre gewählte Sprache am nächsten kommt.
Die Teilnehmer werden gebeten, die Punktzahl ihres Beitrags zu berechnen und in die Antwort einzutragen.
quelle
Antworten:
C ++, Trollpost
Mein Gehirn kann es nicht rechtfertigen, einen längeren zu schreiben :)
quelle
Ich werde hier die Leistungsfähigkeit und Verwendbarkeit der Skriptsprache Python demonstrieren, indem ich eine recht komplexe Aufgabe auf elegante und effiziente Weise durch die Operatoren und Generatoren der oben genannten Skriptsprache für Datenstrukturen wie Listen und Wörterbücher löse .
Ich fürchte jedoch, ich verstehe die Verwendung der Ausdrücke "so komplex wie möglich" und "Rechtfertigung" nicht vollständig. Trotzdem folgt hier ein Überblick über meine übliche, recht selbsterklärende und unkomplizierte Strategie, gefolgt von der tatsächlichen Implementierung in Python, die Sie finden, und die der spielerischen, hochrangigen Natur der Sprache durchaus treu ist:
Definieren Sie das Alphabet - offensichtlicher erster Schritt. Für die Erweiterbarkeit wählen wir das gesamte ASCII-Sortiment. Beachten Sie die Verwendung des integrierten Listengenerators, mit dem Sie stundenlange Listeninitialisierungen sparen können.
Geben Sie an, wie viele Buchstaben des Alphabets verwendet werden sollen. Dies wird einfach als eine andere Liste dargestellt!
Führen Sie diese beiden Listen zu einem praktischen Wörterbuch zusammen, in dem die Schlüssel ASCII-Punkte und die gewünschten Werte sind.
Wir sind jetzt bereit, Charaktere zu machen! Erstellen Sie zunächst eine Zeichenfolge aus dem Wörterbuch. Dies wird alle Zeichen enthalten, die wir in unserer endgültigen Ausgabe brauchen, und die richtige Menge von jedem!
Deklarieren Sie die gewünschte Reihenfolge der Zeichen und starten Sie eine neue Liste, die unsere endgültige Ausgabe enthält. Mit einfacher Iteration setzen wir die generierten Zeichen an ihre endgültige Position und drucken das Ergebnis aus!
Hier ist die tatsächliche Implementierung
Ok, ich habe mich nur für eine kurze, aber dumme Sache entschieden und statt einer TL; DR-Codelösung eine Menge Text hinzugefügt
quelle
n
hier als 1 Zeile oder 11?Dart's Hello World zusammengestellt an JS (2 936 012)
http://code.google.com/p/dart/issues/detail?id=14686
(Ich lasse es jedoch von Google rechtfertigen.)
quelle
Scala, Ergebnis: 62
Okay, ich werfe meinen Hut in den Ring.
ContentProvider.scala:
HWCChain.scala:
HHWCChain.scala:
eHWCChain.scala:
theLThing.scala:
indexedLHWCChain.scala:
theOThing.scala:
indexedOHWCChain.scala:
BlankHWCChain.scala:
WHWCChain.scala:
rHWCChain.scala:
dHWCChain.scala:
TermHWCChain.scala:
HelloWorldCharChainChecker.scala:
Natürlich für einen rein funktionalen Ansatz, 0 stinkende Variablen. Alles ist im Typensystem angelegt und unkompliziert. Ein cleverer Compiler kann es bis auf den letzten Schliff optimieren.
Das Programm ist klar, einfach und leicht verständlich. Es ist einfach zu testen und generisch und vermeidet die Falle des Überentwickelns (mein Team wollte indexedOHWCChain und indexedLHWCChain in ein gemeinsames sekundäres Merkmal umkodieren, das eine Reihe von Zielen und ein Längenfeld enthält, aber das wäre einfach albern gewesen!).
quelle
complex
den ursprünglichen Fragenanforderungen. Es ist nur sehrverbose
. Da ist ein Unterschied.Pure Bash ohne Gabel (einige zählen, scheinen ca. 85 zu sein ...)
Eigenschaften :
gzip
unduuencode
viaperl
(häufiger installiert alsuudecode
)Komplettes Umschreiben (Fehlerkorrekturen, ASCII-Zeichnungen und zwei Levels):
(Der verwendete Schlüssel
V922/G/,2:
basiert auch aufHelloWorld
, aber das ist egal;)Ergebnis (wie gewünscht):
Es gibt eine andere Version:
Verwenden des gleichen Schlüssels und Rendern von so etwas wie:
quelle
Jeder weiß, dass Moores Gesetz eine neue Wendung genommen hat und dass alle wirklichen Fortschritte bei der Rechenleistung im nächsten Jahrzehnt in der GPU liegen werden. In diesem Sinne habe ich mit LWJGL ein unglaublich schnelles Hello World-Programm geschrieben, das die GPU voll ausnutzt, um die Zeichenfolge "Hello World" zu generieren.
Da ich Java schreibe, ist es idiomatisch, mit dem Kopieren und Einfügen von anderem Code zu beginnen. Ich habe http://lwjgl.org/wiki/index.php?title=Sum_Example verwendet
quelle
Assembly (x86, Linux / Elf32): 55 Punkte
Jeder weiß, dass man in Assembler schreiben muss, wenn man ein schnelles Programm haben will.
Manchmal können wir uns nicht darauf verlassen, dass wir
ld
unseren Job richtig machen. Für eine optimale Leistung ist es vorzuziehen, einen eigenen Elf-Header für die ausführbare Datei unserer Hello World zu erstellen. Dieser Code muss nur erstellt werdennasm
, ist also sehr portabel. Es stützt sich auf keine externen Bibliotheken oder Laufzeiten.Jede Zeile und Aussage ist absolut entscheidend für die korrekte Funktionsweise des Programms - es gibt keine Kruft, nichts kann weggelassen werden.
Darüber hinaus ist dies der kürzeste Weg, ohne den Linker zu verwenden - es gibt keine unnötigen Schleifen oder Deklarationen, um die Antwort auszublenden.
Wertung
org
,db
,dw
,dd
,equ
,global _start
): 37dd _start
,dd filesize
,dw ehdrsize
,dw phdrsize
: 4ehdr:
,phdr:
,section .data,
,section .text
,_start:
): 5quelle
PHP / HTML / CSS (88 Punkte)
Der gesamte Code ist hier verfügbar: https://github.com/martin-damien/code-golf_hello-world
index.php
autoload.php
Klassen / Page.php
Klassen / Title.php
classes / XMLElement.php
design / stylesheets / hello_world.css
design / templates / layouts / pagelayout.twig
design / templates / pages / hallo_welt.twig
quelle
Brainfuck
369 Ausdruck, 29 while-Schleifen = 398
Ausgabe von K & R Das Beispiel der Programmiersprache C:
quelle
Ti-Basic 84, 1 Punkt
Ti-Basic ist ziemlich einfach. Aber wenn Sie wirklich eine berechtigte Erklärung wünschen, hier ist es:
:
Startet jeden Befehl, jede Funktion, jede Anweisung, jeden Aufbau, jedes UnterprogrammDisp
ist eine vordefinierte Funktion, die einen Parameter auf dem Bildschirm anzeigtaka
whitespace
Lässt die FunktionDisp
wissen, dass sie aufgerufen wurde und dass ein Parameter dem einzelnen Leerzeichen folgen soll, das tatsächlich zusammen mit eingefügt wirdDisp
"
Beginnt mit der Definition des ZeichenfolgenliteralHELLO WORLD
Teil des Textes im String-Literal!
Obwohl es sich um einen faktoriellen mathematischen Operator handelt, wird er nicht ausgewertet, da er sich in einem Zeichenfolgenliteral befindet"
Beendet die Definition des String-Literalquelle
Also, ich habe einen sehr ... ... eigenartigen Manager. Er hat die seltsame Vorstellung, je einfacher ein Programm ist, desto schöner, desto künstlerischer sollte es sein. Da das
Hello World
wohl eines der am einfachsten zu schreibenden Programme ist, hat er nach etwas so Großartigem gefragt, dass er es an die Wand hängen könnte. Nachdem er einige Nachforschungen angestellt hatte, bestand er darauf, dass die Sache in Piet geschrieben wurde.Jetzt bin ich nicht derjenige, der die Verdienste der intelligentesten Person in Frage stellt, die jemals das obere Management befragt hat. Deshalb wurde ich beauftragt, dieses Programm zu "schreiben", das mit diesem Online-Piet-Interpreter ausgeführt werden kann. Vielleicht ist es Zeit, einen vernünftigeren Manager zu suchen ...
quelle
Ein Lipogramm in C:
Das W und R auf meinem Computer ist kaputt. Es verursacht Probleme mit einigen Sprachen. Fast alle pr-compilr-Anweisungen in C us, die lttr. Der obige Cod spuckt Warnungen über eine implizite Deklaration von printf () aus, da ich #includ (stdio.h) nicht verwenden kann, aber es läuft fin.
quelle
Ich werde dies als Community-Wiki verwenden. Es ist ein C # mit schlechten Praktiken. Ich definiere meine eigene ASCII-Datenstruktur. Ich möchte nicht, dass dies ein Konkurrent ist, sondern eher "Kid's, du siehst den Mann da drüben ... wenn du dein Gemüse nicht isst, wirst du wie er" ein Beispiel.
WENN SIE VOM SCHLECHTEN CODE LEICHT GESTÖRT WERDEN, SCHAUEN SIE JETZT WEG
Normalerweise benutze ich das, um Kindern an Halloween Angst zu machen. Sie sollten auch beachten, dass ich hier nicht alle meine 256 ASCII-Zeichen einfügen konnte, da die Gesamtzahl der Zeichen auf ungefähr 40.000 schießt. Versuchen Sie nicht, dies aus zwei Gründen zu reproduzieren:
Also äh ... ja "viel Spaß!". Auch wenn Sie gerne Reinigung und Code zu verbessern Husten Code - Review Husten könnte Sie beschäftigt für eine Weile halten , wenn Sie für einen nicht-profitable Beruf suchen.
quelle
Ich werde später einige Kommentare hinzufügen.
quelle
main
der KlasseMain
:ConsoleDisplay
hat kein Mitglied namensgetInstance
. Meinten SieConsoleDisplayFactory
? Übrigens, bitte geben Sie die Sprache (Java, denke ich) und die Punkte explizit an.Punkte: 183
System
? Na ja, sagen wir mal 0.MustOverride
, was ich zählen werde.Gesamt: 62 + 43 + 0 + 1 + 1 + 76 = 183
Eintrag
Dokumentation
OptimizedStringFactory
hält optimierte Saiten. Es verfügt über einen Cache, der die Verwendung von Verweisen auf effizienteIEnumerable(Of Char)
s ermöglicht, während die inhärenten Probleme von Verweisen vermieden werden. Ich wurde darauf aufmerksam gemacht, dass .NET eine Art String-Pool enthält. Das integrierte Caching weiß jedoch nicht genug über die von uns verwendeten Objekte - es ist unzuverlässig, daher habe ich meine eigene Lösung erstellt.ConcurrentOutputCharacter
Klasse ermöglicht die einfache Synchronisation von Multithread-Einzelzeichenausgaben. Dies verhindert, dass die Ausgabe verstümmelt wird. In den Best Practices der objektorientierten Programmierung wird es deklariertMustInherit
und jedes auszugebende Zeichen oder jede auszugebende Zeichenfolge wird daraus abgeleitet und auch deklariertNotInheritable
. Es enthält mehrere Zusicherungen, um sicherzustellen, dass gültige Daten übergeben werden.*Character
enthält ein einzelnes Zeichen für unseren speziellen Fall der Zeichenfolgenausgabe.Schön, nein?
Es ist aufgrund der oben erwähnten Schleifen und Vererbung sowie des dynamischen, reflexionsbasierten Ladens von Klassen sogar erweiterbar. Dies verhindert auch eine übereifrige Verschleierung, sodass niemand unseren Code beanspruchen kann, indem er verschleiert wird. Um die Zeichenfolgen zu ändern, erstellen Sie einfach ein Wörterbuch, das Eingabezeichen verschiedenen Ausgabezeichenklassen zuordnet, bevor der Reflektionscode sie dynamisch lädt.
quelle
Javascript, viele Punkte
Auf geht's:
quelle
C-Programm für Hello World: 9 (?)
Kombination von ASCII-Zeichen und Zeichenfeld mit Ganzzahl! Grundsätzlich Drucken jeder Ziffer im Zeichenformat.
quelle
Python mit if-else-Anweisungen
Erläuterung
Dadurch wird ein Wörterbuch mit ASCII-Werten und den zugehörigen Zeichen erstellt, da der Code nur diese Werte und sonst nichts verwenden kann. Wir stellen sicher, dass wir Vokale in einer separaten Liste referenzieren und dann bekannt geben, dass sich das vorletzte Zeichen in beiden Zeichenfolgen wiederholt.
Anschließend erstellen wir eine Liste von Wörterbüchern mit festgelegten Regeln, die die Wortlänge, das erste, das letzte und die wiederholten Zeichen definieren. Anschließend legen wir eine True / False-Anweisung fest, ob Wiederholungen überprüft werden sollen.
Sobald dies erledigt ist, durchläuft das Skript die Liste der Wörterbücher und füttert sie mit einer Funktion, die alle möglichen Permutationen von Zeichen aus dem Referenzwörterbuch erstellt. Dabei wird darauf geachtet, dass bei Bedarf wiederholte Zeichen hinzugefügt werden.
Anschließend wird es durch eine zweite Funktion geleitet, die für jede Permutation noch mehr Permutationen erstellt, jedoch eine maximale Länge festlegt. Dies geschieht, um sicherzustellen, dass wir die Wörter finden, die wir durchkauen möchten. Während dieses Prozesses wird es dann durch eine Funktion geleitet, die eine Kombination von if-else-Anweisungen verwendet, die bestimmen, ob es wert ist, ausgespuckt zu werden. Wenn die Permutation mit dem übereinstimmt, was die Anweisungen erfordern, wird eine True / False-Anweisung ausgespuckt und von der aufgerufenen Funktion einer Liste hinzugefügt.
Sobald dies erledigt ist, nimmt das Skript das erste Element aus jeder Liste und kombiniert sie, um "Hallo Welt" anzugeben.
Ich habe auch einige Debug-Funktionen hinzugefügt, um Sie wissen zu lassen, wie langsam es geht. Ich habe mich dazu entschieden, da Sie nicht "Hallo Welt" schreiben müssen, um "Hallo Welt" ausspucken zu lassen, wenn Sie wissen, wie man den Satz konstruiert.
quelle
Nun, das ist gut.
quelle
Golf-Basic 84, 9 Punkte
Erläuterung
Fragen Sie den Benutzer, ob er das Programm beenden möchte
Notieren Sie ihre Antwort
Wenn sie tatsächlich enden wollten, endet es
Wenn sie nicht geendet haben, wird Hello World gedruckt.
quelle
Hasht die Zeichen für "Hello, World!" Und entfernt sie mit Brute-Force, fügt sie einem hinzu
StringBuilder
und protokolliert sie mit einem Logger.quelle
C # - 158
Ich sage Ihnen was, Entwickler in diesen Tagen, ohne auf die SOLID-Prinzipien zu achten. Die Leute vernachlässigen heutzutage, wie wichtig es ist, auch die einfachen Aufgaben richtig zu erledigen.
Zunächst müssen wir mit den Anforderungen beginnen:
Beginnen wir zunächst mit der Lokalisierung. Um Zeichenfolgen richtig zu lokalisieren, benötigen wir einen Alias für die Zeichenfolge, die im Programm verwendet werden soll, und das Gebietsschema, in dem die Zeichenfolge gespeichert werden soll. Diese Daten müssen natürlich in einem leicht interoperablen Format, XML, gespeichert werden. Und um XML richtig zu machen, brauchen wir ein Schema.
StringDictionary.xsd
Dies definiert unsere XML-Struktur und bringt uns zu einem guten Start. Als nächstes benötigen wir die XML-Datei selbst, die die Zeichenfolgen enthält. Machen Sie diese Datei zu einer eingebetteten Ressource in Ihrem Projekt.
Eine Sache, die wir absolut nicht wollen, sind hartcodierte Zeichenfolgen in unserem Programm. Verwenden Sie Visual Studio, um Ressourcen in Ihrem Projekt zu erstellen, die wir für unsere Zeichenfolgen verwenden. Stellen Sie sicher, dass die Änderung
XmlDictionaryName
dem Namen Ihrer zuvor definierten XML-Zeichenfolgendatei entspricht.Da es sich um eine Abhängigkeitsinversion handelt, benötigen wir einen Abhängigkeitscontainer für die Registrierung und Erstellung unserer Objekte.
IDependencyRegister.cs
IDependencyResolver.cs
Wir können eine einfache Implementierung dieser beiden Schnittstellen in einer Klasse bereitstellen.
DependencyProvider.cs
Wir beginnen auf der untersten Ebene und arbeiten uns nach oben, um XML lesen zu können. Nach
S
undI
in SOLID definieren wir eine Schnittstelle, die unser XML-String-Dictionary-Code verwendet:Denken Sie an das richtige Design für die Leistung. Das Abrufen dieser Zeichenfolgen ist für unser Programm von entscheidender Bedeutung. Und wir möchten sicherstellen, dass wir immer die richtige Zeichenfolge abrufen. Dazu verwenden wir ein Wörterbuch, in dem der Schlüssel der Hash des Stringnamens und des Gebietsschemas ist und der Wert unseren übersetzten String enthält. Erneut sollte es unserem String-Wörterbuch nach dem Prinzip der Einzelverantwortung egal sein, wie die Strings gehasht werden. Daher erstellen wir eine Schnittstelle und stellen eine grundlegende Implementierung bereit
IStringHasher.cs
Sha512StringHasher.cs
Hiermit können wir unseren XML-Zeichenfolgenspeicher definieren, der eine XML-Datei aus einer eingebetteten Ressource liest und ein Wörterbuch mit den Zeichenfolgendefinitionen erstellt
EmbeddedXmlStringStore.cs
Und die zugehörige
StringInfo
Struktur, um die Zeichenfolgeninformationen aufzunehmen:StringInfo.cs
Da wir möglicherweise mehrere Möglichkeiten haben, nach Strings zu suchen, müssen wir den Rest des Programms von der Art und Weise isolieren, in der Strings abgerufen werden. Dazu definieren wir
IStringProvider
, welche Werte im Rest des Programms zum Auflösen von Strings verwendet werden:ILocaleStringProvider.cs
Mit einer Implementierung:
StringDictionaryStoreLocaleStringProvider.cs
Nun zum Umgang mit Gebietsschemas. Wir definieren eine Schnittstelle, um das aktuelle Gebietsschema des Benutzers abzurufen. Dies zu isolieren ist wichtig, da ein Programm, das auf dem Computer des Benutzers ausgeführt wird, das Gebietsschema des Prozesses lesen kann. Auf einer Website kann das Gebietsschema des Benutzers jedoch aus einem Datenbankfeld stammen, das dem Benutzer zugeordnet ist.
ILocaleProvider.cs
Und eine Standardimplementierung, die die aktuelle Kultur des Prozesses verwendet, da dieses Beispiel eine Konsolenanwendung ist:
Dem Rest unseres Programms ist es egal, ob wir lokalisierte Zeichenfolgen bereitstellen oder nicht, daher können wir die Lokalisierungssuche hinter einer Schnittstelle verbergen:
IStringProvider.cs
Unsere Implementierung von StringProvider ist für die Verwendung der bereitgestellten Implementierungen
ILocaleStringProvider
undILocaleProvider
die Rückgabe einer lokalisierten Zeichenfolge verantwortlichDefaultStringProvider.cs
Schließlich haben wir unseren Programmeinstiegspunkt, der das Wurzelverzeichnis der Komposition bereitstellt und den String abruft, indem er an die Konsole ausgegeben wird:
Program.cs
Und so schreiben Sie ein Enterprise-Microservice-fähiges Hello World-Programm, das die Ländereinstellung berücksichtigt.
Scores: Dateien: 17 Namespace Beinhaltet: 11 Klassen: 14 Variablen: 26 Methoden: 17 Anweisungen: 60 Kontrollfluss: 2 Forward-Deklarationen (Interface-Mitglieder, xsd complexTypes): 11 Gesamt: 158
quelle
iX2Web
quelle