Więc ... to trochę zawstydzające. Ale nie mamy prostego „Witaj, świecie!” wyzwanie jeszcze (pomimo 35 oznaczonych tagiem hello-world i wciąż rośnie). Chociaż nie jest to najciekawszy golf w popularnych językach, znalezienie najkrótszego rozwiązania w niektórych esolangach może być poważnym wyzwaniem. Na przykład, o ile wiem, nie wiadomo, czy udało się znaleźć najkrótsze możliwe rozwiązanie Brainfuck.
Co więcej, podczas gdy cała Wikipedia (wpis w Wikipedii został usunięty, ale jest archiwum na archive.org
), esolangs i Rosetta Code mają listy „Witaj, świecie!” programy, żaden z nich nie jest zainteresowany najkrótszym językiem dla każdego języka (istnieje również repozytorium GitHub ). Jeśli chcemy być znaczącą witryną w społeczności golfistów kodu, myślę, że powinniśmy spróbować stworzyć ostateczny katalog najkrótszego „Hello, World!” programy (podobnie jak nasze podstawowe wyzwanie quine zawiera jedne z najkrótszych znanych quines w różnych językach). Zróbmy to!
Zasady
- Każde zgłoszenie musi być pełnym programem.
- Program nie może pobierać żadnych danych wejściowych i drukować
Hello, World!
do STDOUT (ten dokładny strumień bajtów, w tym wielkie litery i interpunkcja) oraz opcjonalny końcowy znak nowej linii i nic więcej.
- Program nie może zapisywać niczego do STDERR.
Jeśli ktoś chce to nadużyć, tworząc język, w którym drukuje pusty program Hello, World!
, a następnie gratulacje, po prostu utorował drogę do bardzo nudnej odpowiedzi.
Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka.
- Zgłoszenia są oceniane w bajtach , w odpowiednim (wcześniej istniejącym) kodowaniu, zwykle (ale niekoniecznie) UTF-8. Niektóre języki, takie jak Foldery , są trudne do zdobycia - w razie wątpliwości zapytaj na Meta .
- Tu nie chodzi o znalezienie się języka z najkrótszych „Hello, World!” program. Chodzi o znalezienie najkrótszego „Cześć, świecie!” program w każdym języku. Dlatego nie oznaczę żadnej odpowiedzi jako „zaakceptowana”.
- Jeśli wybrany przez ciebie język jest trywialną odmianą innego (potencjalnie bardziej popularnego) języka, który ma już odpowiedź (pomyśl dialekty BASIC lub SQL, powłoki uniksowe lub trywialne pochodne Brainfuck, takie jak Alphuck), rozważ dodanie uwagi do istniejącej odpowiedzi, że to samo lub bardzo podobne rozwiązanie jest również najkrótsze w innym języku.
Na marginesie, proszę nie głosować nudnych (ale ważnych) odpowiedzi w językach, w których nie ma wiele do golfa - są one nadal przydatne w tym pytaniu, ponieważ próbuje skompilować katalog tak kompletny, jak to możliwe. Jednak zrobić głównie upvote odpowiedzi w językach gdzie autorzy rzeczywiście musiał włożyć wysiłek w golfa kod.
Aby uzyskać inspirację, sprawdź kolekcję Hello World .
Katalog
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](https://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 55422; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body {
text-align: left !important;
display: block !important;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 500px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
"Hello, World!"
, jest najkrótszy w wielu różnych i niepowiązanych językach, czy należy go opublikować osobno?Odpowiedzi:
Utknął, 0 bajtów
Cóż, nie można uzyskać krótszy niż ... Pusta wyjście programu wola
Hello, World!
w Stuck .źródło
Hello, World!
Rzeczą było po prostu coś, co włożył w postaci zastępczego wczesnej fazie rozwoju. Nie zamierzałem tego tak długo zostawiać, po prostu nigdy nie zabrałem się do jego usuwania.PHP, 13 bajtów
Tak. To działa.
źródło
<?php
w kodzie, przez co w ogóle nie jest interpretowany przez PHP :)Brainfuck, 78 bajtów
Nagroda otwarta: jeśli ktokolwiek może poprawić ten wynik, przekażę nagrodę (+500).@KSabznalazł7672 bajtowe rozwiązanie!Wypróbuj online!
Pierwsze 28 bajtów
--<-<<+[+[<+>--->->->-<<<]>]
inicjuje taśmę z następującą relacją powtarzalności (mod 256):f n = 171 · (-f n-1 - f n-2 - f n-3 + 1) , przy f 0 = 57 , f 1 = 123 , a f 2 = 167 .
Współczynnik 171 powstaje, ponieważ 3 -1 ≡ 171 (mod 256) . Kiedy bieżąca wartość jest tłumaczona, jedna komórka wstecz (przez
<+>---
) odejmując 3 za każdym razem skutecznie pomnaża tę wartość przez 171.Przy n = 220 wartość do tłumaczenia wynosi zero, a iteracja zatrzymuje się. Dziesięć bajtów poprzedzających punkt zatrzymania to:
Zawiera wszystkie elementy niezbędne do produkcji
Hello, World!
, w stylu polowania i dziobania, z drobnymi poprawkami.Znalazłem również alternatywne rozwiązanie 78-bajtowe:
Wypróbuj online!
Uważam, że ten jest lepszy od pierwszego z kilku powodów: zużywa mniej komórek pozostawionych z domu, modyfikuje w sumie mniej komórek i kończy się szybciej.
Więcej szczegółów
Relacje nawrotów mają zaskakująco zwięzłe reprezentacje w Brainfuck. Ogólny układ jest następujący:
które reprezentuje:
f n = c 1 · f n-1 + c 2 · f n-2 + c 3 · f n-3 + ... + k
z
f 0 = s 1 , f 1 = s 2 + c 1 · f 0 + k , f 2 = s 3 + c 2 · f 0 + c 1 · f 1 + k itp.
Dodatkowo
<+>
można zmienić, aby pomnożyć zakres przez stałą bez wpływu na punkt zatrzymania, a przed>{k}
przesunięciem zakresu o stałą można dodać wyraz , ponownie bez wpływu na punkt zatrzymania.Inne przykłady
Ciąg Fibonacciego
N-gonal Numbers
Trójkątne Liczby
Zdefiniowane jako f n = 2 · f n-1 - f n-2 + 1 , przy f 0 = 0 , f 1 = 1 .
Liczby kwadratowe
Liczby pięciokątne
itp.
BF Crunch
Opublikowałem kod, którego użyłem do znalezienia niektórych z tych rozwiązań na github . Wymaga .NET 4.0 lub wyższej.
Dane wyjściowe podano w trzech wierszach:
Na przykład końcowy wynik dla
bfcrunch "hello world" 70 -r -i23
:Odpowiada to pełnemu programowi:
Inne rekordy
Witaj świecie!
Opakowanie, 78 bajtów :
lub
Nieopakowanie , 87 bajtów (wcześniej 92 bajty (mitch) ):
Witaj świecie!
Opakowanie, 80 bajtów :
Bez opakowania, 81 bajtów (wcześniej 92 bajty (hirose) ):
Witaj świecie!
Opakowanie, 74 bajty :
Bez opakowania, 84 bajtów :
Wersja Esolangs
Witaj świecie! \ N
Opakowanie, 76 bajtów :
To wykorzystuje jedną komórkę pozostawioną z domu, a zatem byłoby uważane za 77.
Bez opakowania, 83 bajty :
Rdebath zatwierdzony . wyjście profilbf:
inversed.ru (Peter Karpov)
Witaj świecie!
Opakowanie, 70 bajtów (wcześniej 78 1 ):
Bez opakowania, 77 bajtów (wcześniej 89?):
Autor twierdzi, że najkrótszy ręcznie kodowany „Hello World!” ma 89 bajtów, ale nie zawiera odniesienia. Niniejszym również twierdzę, że jest to rekord.
Witaj świecie!
Opakowanie, 65 bajtów (wcześniej 66 bajtów):
W rzeczywistości jest to również ręcznie kodowane (najlepsze, co udało mi się znaleźć dzięki crunchowi, to 68 bajtów ). Pierwsza komórka jest inicjowana do 259 (3) i zmniejszana o 7 w każdej iteracji, zapętlając 37 razy. Następna komórka jest zmniejszana o 6, co daje 256 - 6,37 = 34 . Reszta komórek jest zmniejszana za każdym razem o 4, dodając jedną komórkę za każdym razem, a każda nowa komórka jest inicjowana do 252 (-4). Wynik jest następujący:
1 Podane rozwiązanie (79 bajtów) można w prosty sposób zredukować o jeden:
źródło
interface a{static void main(String[]A){System.out.print("No!");}}
ArnoldC , 71 bajtów
Tylko dla loli ..
źródło
IT'S SHOWTIME
iTALK TO THE HAND
powinien być na pierwszej i ostatniej linii.Seed ,
601642344203 bajtówPowstały program Befunge-98 (oparty na tym ) jest
źródło
Mornington Crescent ,
36143568 bajtówDzięki NieDzejkob za zapisanie 46 bajtów przy użyciu krótszych nazw linii.
Wypróbuj online!
Jest to z pewnością suboptymalne, ale jest o połowę mniejsze niż rozwiązanie na esolangach.
Hello, World
jest konstruowany przez pocięcie następujących nazw stacji i połączenie wyników:Na koniec obliczam kod znaku
!
as(2<<4)+1 == 33
. Wszystkie te części są połączone w Paddington i ostatecznie wydrukowane w Mornington Crescent.Uwaga: język nie określa, czy możliwe jest podróżowanie do tej samej stacji dwa razy z rzędu, ale tłumacz na to pozwala, więc skorzystałem z niej.
źródło
zło , 70 bajtów
Wykorzystuje następujące cztery polecenia:
źródło
pieprzenie mózgu, 72 bajty
Wypróbuj online!
I oryginalne rozwiązanie bez bajtów o wielkości 76 bajtów :
Wypróbuj online!
Inne najkrótsze znane (według mojej wiedzy) rozwiązania, które znalazłem
'Witaj świecie!' 77 bajtów:
Wypróbuj online!
'Witaj świecie!' 70 bajtów:
Wypróbuj online!
Zostały one znalezione przy użyciu programu c ++, który napisałem tutaj: https://github.com/ksabry/bfbrute
Uwaga: pierwotnie chciałem wyczyścić ten kod, zanim go opublikowałem, aby uczynić go w pewnym stopniu czytelnym i użytecznym, ale ponieważ nie dotarłem do niego od ponad roku, sądzę, że po prostu go opublikuję. W dużym stopniu wykorzystuje szablony i stałe czasowe kompilacji do wszelkich potencjalnych optymalizacji i ma sporo skomentowanych kodów z moich testów, ale nie ma pomocnych komentarzy, przepraszam, ale to trochę okropne.
W kodzie nie ma nic strasznie sprytnego, jego rdzeń jest brutalny, ale jest dość zoptymalizowany. Główną optymalizacją jest to, że najpierw iteruje wszystkie programy bez pętli (nie
[
lub]
) do określonej długości (obecnie 16) i buforuje tablicę wszystkich zmian, które wprowadzi w tablicy danych. Będzie przechowywał tylko jeden program dla każdej unikalnej tablicy zmian, więc na przykład tylko jedna>+<<->
i<->>+<
będzie przechowywany. Następnie iteruje wszystkie możliwe programy, które składają się z dowolnego programu w tej pamięci podręcznej, z dowolną kombinacją pętli między nimi. Po wykonaniu każdego programu wykonuje proste chciwe polowanie i dziobanie znaków i dołącza je na końcu programu.Po przejrzeniu tego w przestrzeni wszystkich programów zauważyłem, że prawie wszystkie najkrótsze programy (do długości ~ 19) były w formie
*[*[*]*]
. Ograniczenie wyszukiwania do programów tego formularza znacznie przyspieszyło wyszukiwanie. Obecny rekordzista został znaleziony na długości 27. Ten faktycznie obliczono na długość 74, ale zauważyłem szczególną sekwencję,.>.>.>.
która miała szczęście mieć 0 w komórce danych po prawej stronie, pozwalając na uproszczenie[.>]<
jej obniżenia do 72.Pozwoliłem mu działać przez jakiś czas i zakończyłem wyszukiwanie przy użyciu bieżących parametrów do długości 29, podejrzewam, że trudno będzie pokonać bieżący, po prostu idąc wyżej, myślę, że najbardziej obiecującym podejściem byłoby prawdopodobnie zwiększenie przestrzeni wyszukiwania w jakiś inteligentny sposób.
źródło
Piet, 90 kodów
To jest zdjęcie 30 na 3. Alternatywnie, przy rozmiarze kodu 10:
Używa 3-poziomowego układu, więc muszę tylko raz wskaźnik. Jeśli nadal można grać w golfa, prawdopodobnie mógłbym ogolić co najwyżej inną kolumnę, ponieważ jest tam push-pop no-op.
Edycja: 84 kodelowe rozwiązanie @ primo .
źródło
Stóg siana , 17 bajtów
Haystack to język programowania 2D, który działa, dopóki nie znajdzie igły w stogu siana
|
, wszystko podczas wykonywania operacji opartych na stosie. Wszystkie programy zaczynają się od lewego górnego rogu i mogą używać znaków kierunkowych><^v
do poruszania się po programie. Kierunek jest dziedziczony, więc nie musisz używać>
go, aby iść w prawo, kierunek zmieni się tylko, gdy trafi on inną postać kierunkową.Domyślnie interpreter czyta od lewej górnej strony w prawo, dzięki czemu możemy po prostu wpisać „Witaj, świecie!” na stosie, użyj go
o
do wydrukowania, a następnie umieść igłę, aby zakończyć wykonywanie.Bonus: bardziej ekscytująca wersja:
źródło
o
to wynik liczbowy. Czy nie powinno byćc
na końcu? Czy jest gdziekolwiek odpowiednia dokumentacja? To jest bardzo interesujące!o
wypisuje element najwyższego stosu w stanie, w jakim się znajduje, tzn. jeśli istnieje liczba, drukuje go.c
po prostu rzuciłoby to na char. Tak więc, jeśli masz ciąg znaków lub znak na górze stosu,o
będzie to, czego chcesz :) W końcu te dokumenty zostaną zaktualizowane ..Pomoc, WarDoq! , 1 bajt
WarDoq nie tylko pomaga! mają wbudowany typowy zapis frazy, nawet spełnia naszą zwykłą definicję języka programowania.
Wypróbuj w oficjalnym tłumaczu online (kod wchodzi w Input ).
źródło
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."
Możesz więc mieć tylko komentarze do spacji? Przypuszczam, że nawet najbardziej użyteczny język na świecie musi mieć jedną niepotrzebną funkcję +1,MarioLANG ,
259249242240235 bajtówZostało to przetestowane w implementacji Ruby .
Po zaciemnieniu „Witaj, świecie!” w MarioLANG trochę zagrałem w golfa. Powyżej jest najkrótszy, jaki do tej pory znalazłem.
Tak jak poprzednio zacząłem od rozwiązania Brainfuck, które ustawia cztery komórki do najbliższej wielokrotności 10 znaków
He,
i spacji i przekształciłem je w MarioLANG . Następnie można nieco skrócić kod, korzystając z dodatkowej podłogi w pętli, która prawie o połowę zmniejsza szerokość pętli. Zauważ, że dno jest wykonywane tylko raz mniej niż góra, więc nie otrzymujesz już dokładnych wielokrotności początkowego licznika we wszystkich 4 komórkach.Wreszcie chciałem wykorzystać zmarnowaną przestrzeń przed pętlą, więc dodałem kilka wind, aby wykorzystać tam przestrzeń pionową. I wtedy zdałem sobie sprawę, że mogę złożyć kod po pętli (patrz poprzednia wersja) poniżej pętli, aby wykorzystać trochę więcej miejsca w pionie, co pozwoliło zaoszczędzić pięć dodatkowych bajtów.
Prawdopodobnie jest to wciąż dalekie od ideału, ale myślę, że to znaczna poprawa w stosunku do naiwnego rozwiązania.
Metagolf
Czas na automatyzację ...
Zacząłem konfigurować solver w Mathematica, aby znaleźć optymalne rozwiązanie. Obecnie zakłada się, że struktura kodu jest stała: licznik ustawiony na 12, 4 komórki do drukowania, ze stałym przypisaniem do
He,<space>
i taką samą kolejnością tych komórek. To, co się zmienia, to liczba+
s w pętli, a także niezbędne późniejsze poprawki:Okazuje się, że dla początkowego licznika 12 moje ręcznie wykonane rozwiązanie jest już optymalne. Jednak użycie 11 zamiast tego oszczędza dwa bajty. Próbowałem wszystkich wartości liczników od 6 do 20 (włącznie) z następującymi wynikami:
Uwaga: Ten solver zakłada, że kod liniowy po pętli znajduje się w górnym wierszu, a powyższy kod to rozwiązanie złożone. Ogólne rozwiązanie może być krótsze, informując solver o złożeniu, ponieważ teraz dostaję 3 dodatkowe
+
s w pierwszej części za darmo, a kolejne 4 instrukcje kosztują tylko 1 bajt zamiast 2.źródło
Ciemny , 106 bajtów
Pozwolę, że niektóre cytaty ze specyfikacji języka mówią o blasku tego esolangu:
źródło
Szef kuchni , 465 bajtów
Przetestowano przy pomocy interpretera Ruby. Robi zupę alfabetu.
Starałem się być tak zgodny z oryginalną specyfikacją, jak tylko mogłem, więc nawet jeśli użyty przeze mnie interpreter pozwala upuścić
the
s wPour contents
instrukcji, nie zrobiłem tego.Miska do miksowania jest dość droga, więc może być lepsze podejście. Próbowałem użyć konwersji bazowej do zakodowania wiadomości, ale niestety specyfikacja nie wyjaśnia, czy
Divide
używa podziału na liczby całkowite, czy zmiennoprzecinkowe, a mój interpreter używa tego drugiego. Nie ma również operatora modulo, co też nie pomaga.źródło
Homespring , 58 bajtów
Końcowa przestrzeń jest znacząca.
Pozwól, że opowiem ci historię. Kiedyś istniała elektrownia, która zasilała pobliską wylęgarnię łososi. Wylęgarnia łososia wykluła młodego bezdomnego łososia, który wyruszył w podróż w górę rzeki, by znaleźć źródło. Znalazła taką wiosnę, o poetyckiej nazwie „Witaj, świecie!”, Gdzie dojrzała i zrodziła nowego młodego łososia. Obie ryby pływały teraz w dół rzeki w poszukiwaniu szerokiego oceanu. Ale tuż przy ujściu rzeki znajdowała się sieć w rzece - dojrzała ryba została złapana i tylko młodej udało się przepłynąć i dotrzeć do oceanu i reszty wszechświata. W międzyczasie wylęgarnia wykluczyła więcej łososia, który również podróżował w górę rzeki i rozmnożył się, i tak dalej.
Jednak ogromne ilości topniejącego śniegu wędrowały po innym brzegu rzeki. I zaraz po naszym pierwszym młodym łososiu ze źródeł „Witaj, świecie!” dotarł do oceanu, topniejący śnieg uderzył we wszechświat i ... och ... zniszczył go. I żyli długo i szczęśliwie ... albo chyba nie.
To była właściwie semantyka powyższego programu. Homespring jest dziwny.
źródło
Piet, 84 kodeksów
28x3, tutaj pokazano z szerokością kodu 10.
Utworzono za pomocą PietDev , przetestowano z npiet . Układ programu jest następujący:
Żółte wypełnienie wskazuje kody, w których ścieżka się pokrywa, pomarańczowe wypełnienie wskazuje kody, które muszą być tego samego koloru, do celów kontroli przepływu.
Aby pomóc w stworzeniu tego, napisałem podstawowy interpreter dla języka opartego na stosie z komendami podobnymi do pieta, które nazwałem „pasm” ( źródło ). Dane wyjściowe z tego interpretera (z tym wejściem ) są następujące:
Nie są używane żadne polecenia wskaźnika, przełącznika ani przewijania. Nie marnuje się też żadnych kodów; w rzeczywistości dwa są ponownie wykorzystywane.
źródło
Biała spacja ,
192150146 bajtówBiałe znaki potrzebują tylko spacji, tabulatorów i linii, podczas gdy inne znaki są ignorowane.
Które mogą być kłopotliwe do wyświetlenia tutaj.
W poniższym kodzie spacje i tabulatory zostały zastąpione.
I „;” został umieszczony przed liniami dla jasności.
Aby uruchomić kod, najpierw zamień. oraz> spacje i tabulatory.
Hexdump kodu
Kod zestawu białych znaków:
Uwagi:
Musiałem napisać program, aby obliczyć, że dodanie 107 daje optymalną grę w golfa. Ponieważ wielkość bajtów, jaką przyjmuje liczba całkowita, zmienia się kod. : 4 + int (abs (log2 ($ n)))
Kod nadal będzie działał bez etykiety „e:” i części wyjściowej na whitespace.kauaveel.ee . Ale to może spowodować, że kod białych znaków będzie nieprawidłowy w innych kompilatorach białych znaków. Tak więc te bajty nie zostały oderwane od rozwiązania.
Należy zauważyć że
Jak zauważył Kevin Cruijssen w komentarzach, zezwalając na „wyjście przez błąd” według meta, biała spacja może zostać zakodowana w golfie do 126 znaków.
Montaż:
źródło
SSN
(wartość błędu) zamiastSSSN
(push 0 ), co jest dozwolone zgodnie z meta . Wypróbuj online (z dodanym podświetleniem i objaśnieniami) lub wypróbuj online w trybie raw .dup jumpz e
ie: exit
usuniętym. Ale przynajmniej na whitespace.kauaveel.ee ciągle się zapętla, aż przeglądarka narzeka. Wolę nie zmieniać mojej wersji na to, pomimo niższego golfa i meta pozwalającego na „wyjście przez błąd”. Ale możesz przesłać swoją wersję jako nową odpowiedź.SSN
na początku, w którym to przypadku występuje błąd z Can't do Infix Plus, gdy ma on tylko jeden przedmiot na stosie (107). ( Wypróbuj online. ) Zostawię tutaj swój komentarz, gdy ktoś ma taką samą sugestię. I myślę, że już dawałem +1 twojej odpowiedzi około rok temu. ;)Java, 79
Wcześniejsze wersje Javy mogły pozwalać na użycie bloku statycznego (51 bajtów), ale obecnie nie znam sposobu na obejście tej
main
metody.źródło
enum
zamiastclass
.interface
i porzuceniupublic
specyfikatora. Odrzuciłem poniższe zasady edycji , ale ponieważ nie mogą komentować, pomyślałem, że dam Ci znać, abyś mógł z nich skorzystać, jeśli chcesz.CSS, 30 bajtów
Kaskadowe arkusze stylów (CSS) nie są typowym językiem programowania, ale mogą całkiem dobrze naprawić ustalone wyniki. Odbywa się to poprzez utworzenie pseudoelementu po każdym elemencie z zawartością
Hello, World!
. Tak więc<html>
wybrany jest tylko jeden element ( ), przy założeniu, że używamy najbardziej podstawowego dokumentu HTML, tjDziała to w większości głównych przeglądarek, z godnym uwagi wyjątkiem Firefoksa, który stosuje selektor do elementów
<html>
i<body>
. Dlatego też fragmenty stosu nie działają, ponieważ zawsze istnieje element ciała, który również jest stylizowany. Poniżej znajduje się nieco zmodyfikowana wersja do przetestowania.źródło
* *
aby wybraćbody
.* :after
wydawało się, że działa.HTML, 13 bajtów
Tekst jest automatycznie wstawiany do
<body>
i wyświetlany.źródło
Kod maszynowy x86_64 dla systemu Linux, 32 bajty
Kiedy Linux rozpoczyna nowy proces, wszystkie rejestry (oprócz RSP) są zerowe, więc możemy uzyskać RAX = 1 tylko poprzez modyfikację niskiego bajtu. X86-64 System V ABI nie gwarantuje tego, ale tak właśnie robi Linux. Ten kod działa tylko jak
_start
w statycznym pliku wykonywalnym.Instrukcja call wypycha na stos następny adres zawierający ciąg hello world. Wpisujemy adres ciągu
rsi
.Następnie pozostałe argumenty są tworzone przez
syscall
Dosys_write
, która drukuje ciąg.Program kończy się od
syscall
dosys_exit
.sys_write
zwraca liczbę zapisanych bajtów, więc górne bajty RAX mają zero po pierwszymsyscall
(chyba że zwrócił błąd), więcmov al, 60
daje nam RAX =__NR_exit
tylko w 2 bajtach.Możesz sprawić, by ten program działał poprawnie, zamykając jego stdout (
./a.out >&-
), więcsys_write()
powróci-EBADF
, drugisyscall
powróci-ENOSYS
, a następnie wykonanie zakończy się niepowodzeniem. Ale nie musimywrite()
wdzięcznie obsługiwać błędów.źródło
__NR_write
jest 1. Nie jest to standard w różnych systemach uniksowych x86-64. Jesteś również zależny od zachowania Linuksa polegającego na wyzerowaniu wszystkich rejestrów oprócz RSP przed wejściem w nowy proces (więc działa to tylko wtedy, gdy zbudujesz go jako statyczny plik wykonywalny, w przeciwnym razie dynamiczny linker pozostawi śmieci w górnych bajtach,rax
a ty ' Dostanę-ENOSYS
). X86-64 System V ABI mówi, że rejestry mogą przechowywać dowolne wartości śmieci przy wejściu_start
, samo jądro Linux wybiera je zero, aby uniknąć wycieku informacji.mov al, 1
/mov edi, eax
(2 bajty), zamiast potrzebować prefiksu REX dla DIL, ponieważ__NR_write == STDOUT_FILENO = 1
mov esi, msg
(NASM) akamov esi, OFFSET msg
(GAS.intel_syntax
) . Umieść swój ciąg po ostatnimsyscall
.call/pop
jest 1 bajt krótszy niż 64-bitowy LEA zależny od RIP, ale mov jest najlepszy.Sześciokąt ,
3732 bajtówWypróbuj online!
Z dumą prezentuję swój drugi język programowania 2D i (o ile mi wiadomo) pierwszy w historii język 2D na siatce heksagonalnej.
Kod źródłowy nie wygląda bardzo 2D, prawda? Cóż, białe znaki są opcjonalne w Hexagony. Najpierw kod źródłowy jest dopełniany do następnej wyśrodkowanej liczby heksagonalnej za pomocą no-ops (
.
). Następna taka liczba to 37, więc na końcu wstawiamy pięć no-ops. Następnie kod źródłowy jest przestawiany na zwykły sześciokąt:Można to również uruchomić. Wypróbuj online!
Sześciokąty mają wiele całkiem funkcyjnych funkcji, w tym 6 różnych wskaźników instrukcji i układ pamięci, który jest wykresem liniowym sześciokątnej siatki, ale ten kod używa tylko jednego adresu IP i jednej krawędzi pamięci, więc nie martwmy się tym na razie.
Oto przegląd odpowiednich poleceń:
;
wypisuje bieżącą wartość, modulo 256, jako bajt do STDOUT./
to zwierciadło, które zachowuje się tak, jak można się spodziewać (powodując, że IP skręca o 120 stopni).@
kończy program.Teraz ostatni haczyk polega na tym, że źródło otacza wszystkie 3 pary krawędzi. Ponadto, jeśli IP opuści siatkę przez jeden z sześciu rogów, istnieją dwa możliwe rzędy, do których można przeskoczyć. To, który zostanie wybrany, zależy od tego, czy bieżąca wartość jest dodatnia czy dodatnia. Poniższa wersja z adnotacjami pokazuje, gdzie adres IP jest wprowadzany ponownie za każdym razem, gdy opuszcza siatkę:
Jeśli więc usuniemy wszystkie zmiany kierunku, program sprowadza się do następującego kodu liniowego:
Co znajduje się
Q2
,P0
iP1
? Listy są drukowane łatwo, ponieważ możemy po prostu ustawić krawędź na odpowiednią wartość. W przypadku przecinka, spacja i wykrzyknik to nie działa. Nie możemy też po prostu ustawić swoją wartość z44
,32
,33
, odpowiednio, ponieważ krawędź pamięć jest niezerowe, aby rozpocząć, a ze względu na semantykę poszczególnych cyfr, które sieją spustoszenie wszelkiego rodzaju. Gdybyśmy chcieli to zrobić, musielibyśmy zresetować wartość krawędzi do zera za pomocą czegoś takiego*
, jak+
,-
,&
lub^
pierwszy. Ponieważ jednak wartość jest pobierana modulo 256 przed wydrukowaniem, nie musimy ustawiać wartości dokładnie na 44, 32 lub 33. Na przykładQ2
ustawimy wartość krawędzi na81*10 + 2 = 812
, która jest44
po przyjęciu modulo256
. W ten sposób możemy zapisać bajt każdego z tych trzech znaków. (Niestety, to nie jest możliwe, aby dostać się tam z jednej cyfry od wartości komórka ma już. Amusingly, gdzie to nie praca jest , bo to może być również uzyskane z ).o
wWorld
W9
Możesz użyć tego skryptu CJam, aby znaleźć wszystkie kombinacje liter i cyfr, które dają dany znak.
Nie jestem pewien, czy jest to optymalne. Wątpię, czy można to zrobić w sześciokącie o długości boku 3 (gdzie miałbyś tylko 19 znaków), ale może być możliwe rozwiązanie tego w sześciokącie o długości boku 4 z mniej niż 32 poleceniami, takimi jak że na końcu siatki jest więcej no-opów.
źródło
Q2
,P0
IP1
jest bardzo mądry. Nie znałem części modulo 256.M8;
(lubg4;
), z czego korzystałem kilka razy od tego czasu. Do tej pory nigdy nie przyszło mi do głowy, aby ponownie przeczytać tę odpowiedź po dokonaniu tej zmiany.H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Malbolge, 112 bajtów
Zobaczę, czy jest krótszy. Mam lepszy komputer od ostatniego razu, więc mogę generować nieco szybciej.
Na pokaz oto „Hello World!” bez przecinka.
źródło
Fourier , 15 bajtów
DUŻE ZMIANY w Fourier!
Wypróbuj na FourIDE!
Tak, dni wpisywania kodu ASCII każdego znaku już minęły na zawsze: Fourier już trochę obsługuje ciągi. Gdy umieścisz ciąg znaków w backticks, ciąg ten zostanie wyprowadzony.
Zauważ, że nie możesz zrobić nic innego niż wyprowadzenie tego ciągu: nie możesz go zapisać w zmiennej, nie jest on przechowywany w akumulatorze i nie ma żadnych narzędzi do manipulacji ciągiem.
Tutaj znajdziesz wrak pociągu, który był starym Fourierem. ;)
Wypróbuj online!
Teraz niektórzy z was prawdopodobnie będą mieli spotkali już Fouriera i być może znają ten język. Cały język oparty jest na akumulatorze: zmiennej globalnej, z której korzystają prawie wszyscy operatorzy.
Najważniejszą częścią kodu jest
a
operator. Pobiera to wartość liczbową akumulatora i konwertuje go na znak przy użyciu kodu Pythonchr(accumulator)
. To jest następnie drukowane do STDOUT.Niestety nie miałem jeszcze okazji użyć Fouriera ( szturchanie , mrugnięcie, mrugnięcie ), głównie ze względu na brak łańcuchów i operatorów smyczkowych. Mimo to nadal nadaje się do wielu innych wyzwań (patrz sekcja przykładów na stronie EsoLangs).
Zauważ, że jest to krótszy czas niż mój wpis na listę Esolangs ponieważ tak naprawdę nie sądziłem, że mógłbym już grać w golfa. A potem, pisząc wyzwanie golfa Fouriera, zdałem sobie sprawę, że mogę iść nieco krócej.
Uwaga
Jeśli zastanawiasz się nad składnią zmiennych, Geobits napisał program, który używa zmiennych i ma tę samą długość:
Wypróbuj online!
źródło
C-- , 155 bajtów
Niestety, jedyny znany kompilator C - Quick C-- nie jest już obsługiwany. Budowanie to boli w szyję, ale jest możliwe ...
źródło
C, 30 bajtów
Dość waniliowy, ale nie potrafię wymyślić powszechnie stosownego sposobu, aby zrobić to krócej (chyba że może zadziała jakaś surowa sztuczka asm?). Nadal bije większość esolangów!
źródło
main(){puts("Hello, World!");return 0;}
i 53#include <stdio.h> int main(){puts("Hello, World!");}
bajty. Nieco więcej, jeśli uważasz, że główny (void) jest wymagany.main(){return!puts("Hello, World!");}
jest o dwa bajty krótszy.h
jest o 29 bajtów krótszy. Uwaga: będziesz musiał go skompilować z-Dh='main(){puts("Hello, World!");}'
tym, że w połowie trolluję, w połowie bawię się nadużyciami kompilatora.__FILE__
(8 bajtów) i nazwać plikmain(){puts("Hello, World!");}
. Wtedy to zupełnie nie oszukuje;)Nieczytelny ,
843755732666645629577 bajtówNieczytelne programy powinny być wyświetlane czcionką o zmiennej szerokości, więc honorują nazwę języka. Jestem nieco rozczarowany, że moje bardziej wyrafinowane podejście okazało się znacznie dłuższe. Pętle są niesamowicie drogie w Nieczytelne ...
Wypróbuj online!
Jak to działa
Nieczytelny ma tylko dziesięć funkcji; sześć z nich jest używanych w tym kodzie:
Po użyciu mojej notacji jednoznakowej i dodaniu spacji i komentarzy powyższy kod wygląda następująco. Instrukcje wieloliniowe są wykonywane od dołu do góry.
Wygenerowałem rzeczywisty kod źródłowy, uruchamiając niekomentowaną wersję powyższego pseudokodu za pomocą tego programu CJam .
źródło
Befunge 98 ,
1918 bajtówNowa odpowiedź (z podziemnego kolejki)
Wyjaśnienie
"
uruchamia tryb strunowyHello, World!@,kc
"
ponownie, kończąc tryb strunowyc
)k
przyjmuje najwyższą wartość stosu i wykonuje następne polecenie, które wskaźnik instrukcji może zobaczyć wiele razy,
wyskakuje wartość ze stosu i wysyła ją jako znak. Został on wykonany 12 razy przez ostatniąk
instrukcję i jeszcze raz, gdy tłumacz faktycznie czyta,
instrukcję@
kończy programRóżnica w stosunku do starej odpowiedzi polega na tym, że sprytnie wykorzystujemy
"
postać, używając zachowania pętli Befunge, gdy trafi ona na koniec linii. Ponieważ może to być mniej intuicyjne, pozwalam również staremu. Być może zauważyłeś, że stos nadal będzie zawierał pewne postacie (ck,@
) z powodu tej fajnej sztuczki, pozostawiając trochę bałaganu, jeśli kiedykolwiek będziemy chcieli coś zrobić później.Stara odpowiedź
Działa to dla funge i befunge 98
Wyjaśnienie
""
jest odkładane na stos. ('H'
jest teraz na górze).c
(12) jest wypychany na stosk
przyjmuje najwyższą wartość stosu i wykonuje następne polecenie, które wskaźnik instrukcji może zobaczyć wiele razy.,
wyskakuje wartość ze stosu i wysyła ją jako znak. Został on wykonany 12 razy przez ostatniąk
instrukcję i jeszcze raz, gdy tłumacz faktycznie czyta,
instrukcję@
kończy programźródło
k
c
do93+
."ck,@!dlroW ,olleH
"
aby rozpocząć ciąg, dodaje całą resztę linii do tego ciągu, owija się i uderza to samo,"
aby zakończyć ciąg. Teraz cały program oprócz tego"
został wypchnięty na stos, z!dlroW ,olleH
na górze. Następnie drukuje 12 najlepszych znaków w taki sam sposób, jak twój i zatrzymuje się na@
.JSFuck ,
629362896277 bajtówMoże to zostać wymienione jako jeden z najdłuższych „najkrótszych programów Hello, World! ” (Tak naprawdę nie wiem, czy jest to optymalne, ale jest to najkrótsze, jakie udało mi się uzyskać).
Ostrzeżenie: działa tylko w przeglądarce Firefox i Safari
Istnieje również nieco dłuższa wersja (+4 bajty), która działa również w Chrome i Microsoft Edge:
Pokaż fragment kodu
Dla tych, którzy nie są zaznajomieni z JSFuck, chodzi o pisanie JavaScript tak, jakby było tylko sześć znaków, i czasami może być dość szalony.
Ta tabela pokazuje, w jaki sposób postacie użyte w Hello, World! program jest zakodowany w JSFuck. Zwykły kod tekstowy jest po prostu
alert("Hello, World!")
.Tutaj łańcuchy
"fill"
,"fontcolor"
itp musi być zapisana jako"f"+"i"+"l"+"l"
,"f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"
być zakodowany.Globalne identyfikatory
self
,atob
ibtoa
napisz jakFunction("return self")()
.Function
samo powinno być[]["fill"]["constructor"]
.Przecinek
","
jest trudny, nie jestem w 100% pewien, jak to działa, ale używa[]["concat"]
funkcji do utworzenia tablicy. Opublikuję aktualizację, gdy będę mieć czas na wykonanie dalszych testów.Zakodowałem to za pomocą JScrewIt - podziękowania dla GOTO 0 za stworzenie tak zaawansowanego narzędzia:
alert("Hello, World!")
Różni się to od mojej odpowiedzi na to pytanie dotyczące obecności przecinka po „Cześć”.
Co ciekawe, składnia ES6
zajmuje więcej bajtów do zakodowania (+1500 lub więcej) ze względu na większą złożoność kodowania dwóch odwrotnych znaków zamiast
("
i")
.źródło
Pada ,
8368 bajtówUważam, że jest to optymalne dla programu liniowego (tj. Takiego, który nie korzysta z operatorów przepływu sterowania
?
i*
). To może być ogólnie optymalne, ale nie wiem, jak korzystać z tych dodatkowych operatorów w tak małej ilości kodu (ani jak programowo odkrywać możliwości).Język ostatnio przeszedł pewne zmiany po tym, jak zacząłem omawiać go z autorem przez e-mail. Jednak w zeszłym tygodniu napisałem implementację referencyjną dla bieżącego stanu specyfikacji języka, więc powyższy kod jest w rzeczywistości uruchamialny.
Metagolf
Początkowo wykorzystałem wyniki mojej referencyjnej implementacji do tego wyzwania i na tej podstawie stworzyłem ręcznie wykonane rozwiązanie. Było to jednak podejście heurystyczne.
Zamiast tego napisałem solver w Mathematica, który tak naprawdę wie o strukturach danych i operatorach Pada, aby znaleźć optymalne rozwiązanie. Średnio rośnie liniowo wraz z długością łańcucha (chociaż niektóre kombinacje znaków są nieco wolniejsze niż inne) i zajęło to około 1,5 godziny
Hello, World!
.Jak więc zacząłem pisać solver. Po pierwsze zauważamy, że musimy wziąć pod uwagę tylko 6 operatorów:
~.oOqQ
(oraz niezbędnew
dla każdego z drukowanych znaków). Używanie stosów lub blokad bitowych nie jest przydatne w kodzie liniowym i nie wierzę w to?
i*
można je skutecznie wykorzystać w mniej niż 68 bajtach.Stan Pady (ignorując stosy i zamki) składa się z 7 przełączników i 8 bitów, ułożonych w następujący sposób:
To możliwe stany. Moim pierwszym krokiem przetwarzania wstępnego było ustawienie ukierunkowanego wykresu stanów, w których każda krawędź odpowiada jednej operacji. Oznacza to, że wykres ma 32768 wierzchołków, z których każdy ma stopień zewnętrzny 6 (jedna krawędź wychodząca dla każdej z 6 rozważanych operacji). Możemy użyć tego wykresu, aby znaleźć najkrótszą ścieżkę między dowolnymi dwoma stanami (sam ten wykres może być bardzo przydatny do gry w golfa Pada).
215 = 32768
Teraz dla każdej postaci chcemy osiągnąć stan, w którym
w
drukuje tę postać. Ile jest takich stanów?w
odczytuje bajt z bitu, na który jest upuszczany (cyklicznie). Istnieje więc 8 możliwych rotacji bitów znaku, które wszystkie mogą wydrukować ten znak. Dla każdego z tych obrotóww
ustawione są trzy przełączniki (w celu uzyskania spadku we właściwej pozycji). Pozostawia to 4 dowolne przełączniki. Mamy więc możliwe stany dla każdego w naszym kodzie.8 * 24 = 128
w
Za ich pomocą możemy rozwiązać kolejny problem z grafem: zbuduj wykres, który ma wierzchołek źródłowy, następnie jedną „warstwę” dla każdego znaku i wierzchołek zlewu. Warstwy składają się ze 128 stanów dla każdego wierzchołka, węzeł źródłowy odpowiada początkowemu stanowi programu (wszystkie przełączniki w lewo i wszystkie bity są zerowe). Węzeł sink nie odnosi się w szczególności do żadnego stanu. Mamy skierowane krawędzie z każdego wierzchołka w jednej warstwie do każdego wierzchołka w następnej warstwie, gdzie ciężar krawędzi to odległość między dwoma stanami na naszym wcześniejszym wykresie. Wagi krawędzi od ostatniej warstwy do zlewu wynoszą wszystkie 0. Oznacza to, że możemy wstępnie obliczyć wszystkie te grubości krawędzi. Jest to najdroższy krok obliczeń i zajął 1,5 godziny
Hello, World!
.Po skonfigurowaniu tego wykresu możemy dość szybko znaleźć najkrótszą ścieżkę od źródła do zlewu (zajęło mi 0,05 s na moim komputerze). Do
Hello, World!
pożądanych stanów należą:gdzie najmniej znaczące 7 bitów odpowiada przełącznikom, a najbardziej znaczące 8 bitów bitom Pady.
Teraz wracamy do pierwszego wykresu i znajdujemy rzeczywiste krawędzie (tj. Operacje) odpowiadające najkrótszej ścieżce między każdą parą kolejnych stanów i kończymy każdą z nich za pomocą
w
. Voilà, optymalne rozwiązanie (oparte na powyższych założeniach).Oto pełna Mathematica, jeśli ktoś chce metagolfować inny ciąg w Pada:
źródło