Twój szef prosi cię o napisanie programu „witaj świecie”. Ponieważ zarabiasz za wiersze kodu, chcesz uczynić go tak złożonym, jak to możliwe. Jednak jeśli dodasz po prostu nonsensowne wiersze lub oczywiście bezużyteczne lub zaciemniające rzeczy, nigdy nie uzyskasz tego poprzez przegląd kodu. Dlatego wyzwaniem jest:
Napisz program „witaj świecie”, który jest tak złożony, jak to tylko możliwe, pod warunkiem, że możesz podać „uzasadnienie” dla każdej złożoności kodu.
Wymagane zachowanie programu to wypisanie jednego wiersza „Hello world” (bez cudzysłowów, ale z nową linią na końcu), a następnie pomyślne zakończenie.
„Uzasadnienia” obejmują:
- kompatybilność z modnym hasłem („Nowoczesne oprogramowanie jest zorientowane obiektowo!”)
- ogólnie przyjęte dobre praktyki programistyczne („Każdy wie, że należy oddzielić model i widok”)
- łatwość konserwacji („Jeśli zrobimy to w ten sposób, łatwiej zrobimy XXX później”)
- i oczywiście wszelkie inne uzasadnienia, jakie możesz sobie wyobrazić, używając (w innych sytuacjach) prawdziwego kodu.
Oczywiście głupie uzasadnienia nie będą akceptowane.
Musisz także „uzasadnić” swój wybór języka (więc jeśli wybierzesz z natury pełny język, musisz uzasadnić, dlaczego jest to „właściwy” wybór). Zabawne języki, takie jak Unlambda lub Intercal, są niedopuszczalne (chyba że możesz podać bardzo dobre uzasadnienie ich używania).
Wynik zakwalifikowanych zgłoszeń jest obliczany w następujący sposób:
- 1 punkt za każde oświadczenie (lub cokolwiek równoważnego oświadczeniu w wybranym języku).
- 1 punkt za każdą definicję funkcji, typu, zmiennej itp. (Z wyjątkiem głównej funkcji, w stosownych przypadkach).
- 1 punkt za każdą instrukcję użycia modułu, plik zawiera dyrektywę, przestrzeń nazw za pomocą instrukcji lub podobnego.
- 1 punkt za każdy plik źródłowy.
- 1 punkt za każdą niezbędną deklarację przekazania (jeśli możesz się jej pozbyć poprzez zmianę kodu, musisz „uzasadnić”, dlaczego wybrana przez ciebie umowa jest „właściwa”).
- 1 punkt za każdą strukturę kontroli (jeśli, podczas, za, itp.)
Pamiętaj, że musisz „uzasadnić” każdą pojedynczą linię.
Jeśli wybrany język jest na tyle inny, że nie można zastosować tego schematu (i można podać dobre „uzasadnienie” jego zastosowania), proszę zasugerować metodę punktacji, która najbardziej przypomina powyższy dla wybranego języka.
Uczestnicy proszeni są o obliczenie wyniku swojego wpisu i wpisanie go w odpowiedzi.
źródło
Odpowiedzi:
C ++, trollpost
Mój mózg nie może usprawiedliwić napisania dłuższego :)
źródło
Przedstawię tutaj moc i użyteczność języka skryptowego o nazwie Python , rozwiązując dość złożone zadanie w zgrabny i skuteczny sposób, poprzez wspomniane wcześniej operatory języka skryptowego na i generatory struktur danych, takich jak listy i słowniki .
Obawiam się jednak, że nie rozumiem w pełni użycia wyrażeń „złożony jak to możliwe” i „uzasadnienie”. Niemniej jednak, podsumowanie mojej zwykłej, dość zrozumiałej i bezpośredniej strategii, a następnie faktyczna implementacja w Pythonie, którą znajdziesz, jest całkiem zgodna z zabawną, uporządkowaną naturą języka:
Zdefiniuj alfabet - oczywisty pierwszy krok. Aby rozszerzyć, wybieramy cały zakres ascii. Zwróć uwagę na użycie wbudowanego generatora list, który może zaoszczędzić nam wielu godzin żmudnej inicjalizacji listy.
powiedz, ile każdej litery w alfabecie będziemy używać. Jest to po prostu reprezentowane jako kolejna lista!
Połącz te dwie listy w jeden przydatny słownik, w którym klucze są punktami ascii, a wartości są pożądaną wartością.
Jesteśmy teraz gotowi do tworzenia postaci! Zacznij od utworzenia ciągu znaków ze słownika. Będzie zawierał wszystkie potrzebne nam znaki w końcowej wersji i odpowiednią liczbę każdego z nich!
Zadeklaruj pożądaną kolejność znaków i zainicjuj nową listę, która będzie zawierać naszą ostateczną produkcję. Za pomocą prostej iteracji umieścimy wygenerowane postacie na ich końcowej pozycji i wydrukujemy wynik!
Oto rzeczywista implementacja
Ok, właśnie wybrałem krótki, ale głupiutki i dodałem sporo tekstu zamiast rozwiązania TL; DR
źródło
n
tutaj liczy się jako 1 linia czy 11?Dart's Hello World skompilowany do JS (2936 012)
http://code.google.com/p/dart/issues/detail?id=14686
(Pozwolę jednak Google to uzasadnić)
źródło
Scala, ocena: 62
Okej, wrzucam kapelusz na ring.
ContentProvider.scala:
HWCChain.scala:
HHWCChain.scala:
eHWCChain.scala:
theLThing.scala:
indexedLHWCChain.scala:
theOThing.scala:
zindeksowanyOHWCChain.scala:
BlankHWCChain.scala:
WHWCChain.scala:
rHWCChain.scala:
dHWCChain.scala:
TermHWCChain.scala:
HelloWorldCharChainChecker.scala:
Oczywiście, dla czysto funkcjonalnego podejścia, 0 śmierdzących zmiennych. Wszystko jest ułożone w systemie typów i proste. Sprytny kompilator może go zoptymalizować do zera.
Program jest przejrzysty, prosty i łatwy do zrozumienia. Jest łatwy do przetestowania i ogólny i pozwala uniknąć pułapki nadmiernej inżynierii (mój zespół chciał przekodować indeksowany OHWCChain i indeksowany LHWCChain do wspólnej cechy drugorzędnej, która ma szereg celów i pole długości, ale byłoby to po prostu głupie!).
źródło
complex
jak wymagają tego oryginalne pytania. To jest po prostu bardzoverbose
. Jest różnica.Pure Bash bez widelca (niektóre liczą, wydają się być około 85 ...)
Funkcje :
gzip
iuuencode
przezperl
(częściej instalowane niżuudecode
)Całkowite przepisanie (poprawki błędów, rysunek ascii-art i dwupoziomowy plik):
(Użyty klucz też
V922/G/,2:
jest opartyHelloWorld
, ale to nie ma znaczenia;)Wynik (zgodnie z życzeniem):
Istnieje inna wersja:
Używanie tego samego klucza i może renderować coś takiego:
źródło
Wszyscy wiedzą, że prawo Moore'a zmieniło się i że wszystkie prawdziwe postępy w dziedzinie mocy obliczeniowej w następnej dekadzie pojawią się w procesorach graficznych. Mając to na uwadze, użyłem LWJGL do napisania niesamowicie szybkiego programu Hello World, który w pełni wykorzystuje procesor graficzny do wygenerowania ciągu „Hello World”.
Ponieważ piszę java, idiomatyczne jest zacząć od skopiowania i wklejenia cudzego kodu, użyłem http://lwjgl.org/wiki/index.php?title=Sum_Example
źródło
Montaż (x86, Linux / Elf32): 55 punktów
Wszyscy wiedzą, że jeśli chcesz szybkiego programu, musisz pisać w asemblerze.
Czasami nie możemy polegać na
ld
prawidłowym wykonywaniu zadania - w celu uzyskania optymalnej wydajności lepiej jest zbudować własny nagłówek Elf dla naszego pliku wykonywalnego hello world. Ten kod wymaga jedynienasm
kompilacji, więc jest bardzo przenośny. Nie zależy od zewnętrznych bibliotek ani środowisk uruchomieniowych.Każda linia i instrukcja jest absolutnie niezbędna do poprawnego działania programu - nie ma cruft, nic nie można pominąć.
Co więcej, jest to naprawdę najkrótszy sposób na zrobienie tego bez użycia linkera - nie ma niepotrzebnych pętli ani deklaracji, które mogłyby przesadzić z odpowiedzią.
Punktacja
org
,db
,dw
,dd
,equ
,global _start
): 37dd _start
,dd filesize
,dw ehdrsize
,dw phdrsize
: 4ehdr:
,phdr:
,section .data,
,section .text
,_start:
): 5źródło
PHP / HTML / CSS (88pkt.)
Cały kod jest dostępny tutaj: https://github.com/martin-damien/code-golf_hello-world
index.php
autoload.php
zajęć / Page.php
zajęć / Title.php
klas / XMLElement.php
design / stylesheets / hello_world.css
design / templates / layouts / pagelayout.twig
design / templates / pages / hello_world.twig
źródło
Brainfuck
Wyrażenie 369, 29 gdy pętle = 398
Dane wyjściowe pochodzą z K&R Przykład języka programowania C:
źródło
Ti-Basic 84, 1 punkt
Ti-Basic jest dość prosty. Ale jeśli naprawdę potrzebujesz uzasadnionego wyjaśnienia, oto:
:
uruchamia każde polecenie, funkcję, instrukcję, strukturę, podprogram, nazwij jeDisp
to predefiniowana funkcja wyświetlająca parametr na ekranieaka
whitespace
Powoduje, że funkcjaDisp
wie, że została wywołana i że parametr powinien podążać za pojedynczym znakiem białej spacji, który faktycznie wkleja się wraz zDisp
"
Zaczyna definiować literał ciąguHELLO WORLD
Część tekstu w dosłownym ciągu!
Chociaż jest silnym operatorem matematycznym, nie jest analizowany, ponieważ znajduje się w dosłownym ciągu znaków"
Kończy definicję literału łańcuchowegoźródło
Więc mam bardzo ... ... ... osobliwego kierownika. Ma dziwny pomysł, że im prostszy program, tym piękniejszy, tym bardziej artystyczny. Ponieważ
Hello World
jest to prawdopodobnie jeden z najłatwiejszych programów do napisania, poprosił o coś tak wspaniałego, że mógłby powiesić na ścianie. Po przeprowadzeniu badań nalegał, aby napisać to w Piecie.Teraz nie jestem kimś, kto kwestionuje zalety najbardziej inteligentnej osoby, która kiedykolwiek zaszczyciła wyższe kierownictwo, więc miałem za zadanie „napisać” ten program, który można uruchomić na tym internetowym tłumaczu piet. Może czas poszukać bardziej rozsądnego menedżera ...
źródło
Lipogram C:
Th ky btwn 'w' i 'r' na moim komputr jest brokn. Powoduje problemy z niektórymi językami. Prawie wszystkie pr-compilr dirctivs w C us that lttr. Ten dorsz wyrzuca ostrzeżenia o niejawnej deklaracji printf (), sinc I nie może nam #includ (stdio.h), ale działa fin.
źródło
Umieszczę to w celach informacyjnych jako wiki społeczności. Jest to C # jeden ze złymi praktykami. Definiuję własną strukturę danych ascii. Nie chcę, żeby to był konkurent, ale raczej „Dzieciaku, widzisz tamtego człowieka ... jeśli nie zjesz warzyw, staniesz się taki jak on”.
JEŚLI SĄ ŁATWE ZAKŁÓCENIA PRZEZ ZŁY KOD, PATRZ TERAZ
Zwykle używam tego, aby przestraszyć dzieci w Halloween. Należy również zauważyć, że nie mogłem zmieścić tutaj wszystkich moich 256 znaków ascii, ponieważ łączna liczba znaków wynosi około 40 000. Nie próbuj tego odtwarzać z 2 powodów:
Więc uhh… tak „ciesz się!”. Również jeśli lubisz czyścić i ulepszać kaszel z przeglądem kodu, kaszel może sprawić, że będziesz zajęty przez chwilę, jeśli szukasz nierentownego zawodu.
źródło
Później dodam kilka komentarzy.
źródło
main
klasyMain
:ConsoleDisplay
nie ma członka o nazwiegetInstance
. Miałeś na myśliConsoleDisplayFactory
? BTW, proszę wyraźnie podać język (chyba Java) i punkty.Punkty: 183
System
? W każdym razie powiedzmy 0.MustOverride
, który policzę.Razem: 62 + 43 + 0 + 1 + 1 + 76 = 183
Wejście
Dokumentacja
OptimizedStringFactory
Posiada zoptymalizowane sznurki. Ma pamięć podręczną, która pozwala na użycie referencji do wydajnychIEnumerable(Of Char)
s, unikając przy tym nieodłącznych problemów z referencjami. Zwrócono mi uwagę, że .NET zawiera pewną pulę ciągów. Jednak wbudowane buforowanie nie wie wystarczająco dużo o obiektach, których używamy - jest zawodne, więc stworzyłem własne rozwiązanie.ConcurrentOutputCharacter
Klasa pozwala na łatwą synchronizację wielowątkowych, wyjście jednego znaku. Zapobiega to zniekształceniu danych wyjściowych. Zgodnie z najlepszymi praktykami programowania obiektowego jest on zadeklarowany,MustInherit
a każdy znak lub ciąg wyjściowy jest z niego uzyskiwany, a także deklarowanyNotInheritable
. Zawiera kilka stwierdzeń zapewniających przekazywanie prawidłowych danych.*Character
zawiera jeden znak dla naszego konkretnego przypadku wyjściowego ciągu znaków.Piękny, nie?
Jest nawet rozszerzalny ze względu na wspomniane pętle i dziedziczenie, a także dynamiczne, oparte na odbiciu ładowanie klas. Zapobiega to również nadmiernemu zaciemnieniu, więc nikt nie może żądać naszego kodu, zaciemniając go. Aby zmienić ciągi, po prostu utwórz słownik, który odwzorowuje znaki wejściowe na różne klasy znaków wyjściowych, zanim kod odbicia załaduje je dynamicznie.
źródło
JavaScript, wiele punktów
No to ruszamy:
źródło
Program C dla Hello World: 9 (?)
Kombinacja znaków ASCII i tablicy znaków zawierającej liczbę całkowitą! Zasadniczo drukowanie każdej cyfry w formacie znakowym.
źródło
Python używa instrukcji if-else
Wyjaśnienie
Spowoduje to utworzenie słownika wartości ASCII i powiązanych z nimi znaków, ponieważ pozwoli to kodowi używać tylko tych wartości i nic więcej. Zapewniamy, że odwołujemy się do samogłosek na osobnej liście, a następnie informujemy, że przedostatni znak powtarza się w obu ciągach.
Po wykonaniu tej czynności tworzymy listę słowników z ustawionymi regułami określającymi długość słowa, jego pierwsze, ostatnie i powtarzające się znaki, a następnie ustawiamy także instrukcję true / false dla sprawdzania, czy powtórzenia są sprawdzane.
Po wykonaniu tej czynności skrypt iteruje listę słowników i przekazuje ją przez funkcję, która tworzy wszystkie możliwe permutacje znaków ze słownika referencyjnego, w razie potrzeby dodając powtarzające się znaki.
Następnie jest podawany przez drugą funkcję, która tworzy jeszcze więcej permutacji dla każdej permutacji, ale ustawia maksymalną długość. Ma to na celu zapewnienie, że znajdziemy słowa, które chcemy przeżuć. Podczas tego procesu przekazuje go następnie przez funkcję, która wykorzystuje kombinację instrukcji if-else, która określa, czy warto go wypluć. Jeśli permutacja jest zgodna z żądaniami instrukcji, wyrzuca instrukcję prawda / fałsz, a funkcja, która ją wywołała, dodaje ją do listy.
Po wykonaniu tej czynności skrypt pobiera pierwszy element z każdej listy i łączy je w stan „witaj świecie”.
Dodałem też kilka funkcji debugowania, aby poinformować Cię, jak wolno działa. Zdecydowałem się to zrobić, ponieważ nie musisz pisać „hello world”, aby wypluł „hello world”, jeśli wiesz, jak skonstruować zdanie.
źródło
Cóż, to dobrze.
źródło
Golf-Basic 84, 9 punktów
Wyjaśnienie
Zapytaj użytkownika, czy chce wyjść
Zapisz ich odpowiedź
Jeśli tak naprawdę chcą zakończyć, to się kończy
Jeśli się nie skończyły, drukuje Hello World.
źródło
Zaszyfrowuje, a następnie brutalna siła usuwa znaki z „Cześć, świecie!”, Dodaje je do
StringBuilder
logów i rejestruje to za pomocą Loggera.źródło
C # - 158
Mówię wam teraz, programiści, nie zwracając uwagi na zasady SOLID. Ludzie w dzisiejszych czasach zaniedbują, jak ważne jest prawidłowe wykonywanie nawet prostych zadań.
Najpierw musimy zacząć od wymagań:
Najpierw zacznijmy od lokalizacji. Aby poprawnie zlokalizować ciągi, potrzebujemy aliasu, aby ciąg mógł być używany w programie, oraz ustawienia regionalne, w których chcemy ciąg. Oczywiście musimy przechowywać te dane w łatwo współdziałającym formacie XML. Aby poprawnie wykonać XML, potrzebujemy schematu.
StringDictionary.xsd
To określa naszą strukturę XML i zapewnia nam dobry początek. Następnie potrzebujemy samego pliku XML zawierającego ciągi znaków. Ustaw ten plik jako zasób osadzony w swoim projekcie.
Aby tego uniknąć, jedną rzeczą, której absolutnie nie chcemy, jest napisanie na stałe napisów w naszym programie. Użyj programu Visual Studio, aby utworzyć zasoby w projekcie, które wykorzystamy na nasze łańcuchy. Pamiętaj, aby zmienić,
XmlDictionaryName
aby pasowała do nazwy pliku ciągów XML zdefiniowanego wcześniej.Ponieważ jesteśmy inwersją zależności, potrzebujemy kontenera zależności do obsługi rejestracji i tworzenia naszych obiektów.
IDependencyRegister.cs
IDependencyResolver.cs
Możemy zapewnić prostą implementację obu tych interfejsów razem w jednej klasie.
DependencyProvider.cs
Zaczynając od najniższego poziomu i rozwijając się, potrzebujemy sposobu na odczytanie XML. Zgodnie z
S
orazI
w SOLID definiujemy interfejs, z którego korzysta nasz słownik słowników ciągów XML:Myślenie o właściwym projekcie pod kątem wydajności. Odzyskanie tych ciągów będzie na krytycznej ścieżce naszego programu. I chcemy mieć pewność, że zawsze pobieramy prawidłowy ciąg. W tym celu użyjemy słownika, w którym kluczem jest skrót nazwy łańcucha i ustawień regionalnych, a wartość zawiera nasz przetłumaczony ciąg. Po raz kolejny, zgodnie z zasadą pojedynczej odpowiedzialności, nasz słownik ciągów nie powinien dbać o to, jak ciągi znaków są haszowane, dlatego tworzymy interfejs i zapewniamy podstawową implementację
IStringHasher.cs
Sha512StringHasher.cs
Dzięki temu możemy zdefiniować nasz magazyn ciągów XML, który odczytuje plik XML z osadzonego zasobu i tworzy słownik zawierający definicje ciągów
EmbeddedXmlStringStore.cs
I powiązana
StringInfo
struktura do przechowywania informacji o ciągu:StringInfo.cs
Ponieważ możemy mieć kilka sposobów wyszukiwania ciągów, musimy odizolować resztę programu od tego, jak dokładnie ciągi są pobierane, w tym celu definiujemy
IStringProvider
, które będą używane w pozostałej części programu do rozwiązywania ciągów:ILocaleStringProvider.cs
Z wdrożeniem:
StringDictionaryStoreLocaleStringProvider.cs
Teraz do obsługi ustawień regionalnych. Definiujemy interfejs, aby uzyskać bieżące ustawienia narodowe użytkownika. Wyizolowanie tego jest ważne, ponieważ program działający na komputerze użytkownika może odczytać ustawienia narodowe tego procesu, ale na stronie internetowej ustawienia narodowe użytkownika mogą pochodzić z pola bazy danych powiązanego z jego użytkownikiem.
ILocaleProvider.cs
I domyślna implementacja korzystająca z bieżącej kultury procesu, ponieważ ten przykład jest aplikacją konsolową:
Reszta naszego programu tak naprawdę nie obchodzi, czy obsługujemy zlokalizowane ciągi, czy nie, więc możemy ukryć wyszukiwanie lokalizacji za interfejsem:
IStringProvider.cs
Nasza implementacja StringProvider jest odpowiedzialna za korzystanie z dostarczonych implementacji
ILocaleStringProvider
iILocaleProvider
zwracanie zlokalizowanego łańcuchaDefaultStringProvider.cs
Wreszcie mamy punkt wejścia do programu, który zapewnia katalog główny kompozycji i pobiera ciąg, drukując go na konsoli:
Program.cs
I w ten sposób piszesz gotowy do użytku, mikroserwis dla przedsiębiorstw, program Hello World.
Wyniki: Pliki: 17 Przestrzeń nazw Zawiera: 11 klas: 14 zmiennych: 26 metod: 17 instrukcji: 60 Przepływ sterowania: 2 deklaracje do przodu (elementy interfejsu, typy xsd złożone): 11 Razem: 158
źródło
iX2Web
źródło