var QUESTION_ID=188988;
var OVERRIDE_USER=53748;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(d){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+d+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(d,e){return"https://api.stackexchange.com/2.2/answers/"+e.join(";")+"/comments?page="+d+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){answers.push.apply(answers,d.items),answers_hash=[],answer_ids=[],d.items.forEach(function(e){e.comments=[];var f=+e.share_link.match(/\d+/);answer_ids.push(f),answers_hash[f]=e}),d.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){d.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),d.has_more?getComments():more_answers?getAnswers():process()}})}getAnswers();var SCORE_REG=function(){var d=String.raw`h\d`,e=String.raw`\-?\d+\.?\d*`,f=String.raw`[^\n<>]*`,g=String.raw`<s>${f}</s>|<strike>${f}</strike>|<del>${f}</del>`,h=String.raw`[^\n\d<>]*`,j=String.raw`<[^\n<>]+>`;return new RegExp(String.raw`<${d}>`+String.raw`\s*([^\n,]*[^\s,]),.*?`+String.raw`(${e})`+String.raw`(?=`+String.raw`${h}`+String.raw`(?:(?:${g}|${j})${h})*`+String.raw`</${d}>`+String.raw`)`)}(),OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(d){return d.owner.display_name}function process(){var d=[];answers.forEach(function(n){var o=n.body;n.comments.forEach(function(q){OVERRIDE_REG.test(q.body)&&(o="<h1>"+q.body.replace(OVERRIDE_REG,"")+"</h1>")});var p=o.match(SCORE_REG);p&&d.push({user:getAuthorName(n),size:+p[2],language:p[1],link:n.share_link})}),d.sort(function(n,o){var p=n.size,q=o.size;return p-q});var e={},f=1,g=null,h=1;d.forEach(function(n){n.size!=g&&(h=f),g=n.size,++f;var o=jQuery("#answer-template").html();o=o.replace("{{PLACE}}",h+".").replace("{{NAME}}",n.user).replace("{{LANGUAGE}}",n.language).replace("{{SIZE}}",n.size).replace("{{LINK}}",n.link),o=jQuery(o),jQuery("#answers").append(o);var p=n.language;p=jQuery("<i>"+n.language+"</i>").text().toLowerCase(),e[p]=e[p]||{lang:n.language,user:n.user,size:n.size,link:n.link,uniq:p}});var j=[];for(var k in e)e.hasOwnProperty(k)&&j.push(e[k]);j.sort(function(n,o){return n.uniq>o.uniq?1:n.uniq<o.uniq?-1:0});for(var l=0;l<j.length;++l){var m=jQuery("#language-template").html(),k=j[l];m=m.replace("{{LANGUAGE}}",k.lang).replace("{{NAME}}",k.user).replace("{{SIZE}}",k.size).replace("{{LINK}}",k.link),m=jQuery(m),jQuery("#languages").append(m)}}
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}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/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners 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><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
void foo(char *c, size_t len)
jest zgodne z prawem, że przyjmuje jeden bufor wejścia / wyjścia i długość i nie ma żadnej wartości zwracanej, po prostu efekt uboczny na obiekcie, do którego ma wskaźnik.Odpowiedzi:
Malbolge , 20775 i 2334 bajtów
Prawdopodobnie nikogo nie pokonałem, ale zrobienie tego było niesamowicie przyjemne.
Wypróbuj online!
Jeśli wyzwanie nie wymagało zatrzymania w pewnym momencie (np. Eof), staje się dość trywialne, zdobywając 2334 bajty :
Wypróbuj online!
Wyjaśnienie
Poproszono mnie o wyjaśnienie, jak działa program. Wybiorę drugi, ponieważ łatwiej jest go wyjaśnić niż pierwszy, ale sposób, w jaki oba te działania są bardzo podobne.
Zacznijmy od odszyfrowania kodu. Jak ktoś w komentarzach zrobił, zanim zacząłem pracować nad wyjaśnieniem, więc naprawdę radzę ci to sprawdzić.
Nie ułatwia to czytania programu, ale zanim przejdziemy do kodu, przejrzyjmy podstawy Malbolge.
Maszyna wirtualna jest oparty na trits ( tri nary cyfrowy s ). Każde słowo maszynowe ma szerokość dziesięciu tritów, co daje zakres od 0 do 2222222222t (= 59048d). Każda pozycja pamięci zawiera słowo maszynowe; adresy mają również szerokość jednego słowa maszynowego. Zarówno dane, jak i kod dzielą tę samą przestrzeń pamięci.
Istnieją trzy rejestry, z których każdy zawiera jedno słowo maszynowe, początkowo 0: rejestr kodu C, który jest wskaźnikiem do instrukcji, która ma zostać wykonana, rejestr danych D wykorzystywany do manipulacji danymi oraz akumulator A wykorzystywany również przez kilka instrukcje manipulowania danymi.
Jeśli instrukcja wykonania nie mieści się w zakresie 33-126, wykonanie zostaje zatrzymane (interpreter referencyjny zawiesza się w tym przypadku z powodu błędu). W przeciwnym razie, w celu ustalenia rzeczywistej instrukcji do wykonania, wartość wskazywana przez rejestr C jest dodawana do samego rejestru C, a wynik dzielony przez 94, biorąc resztę.
Oto tabela wszystkich możliwych instrukcji.
Teraz, gdy kod jest bardziej zrozumiały i faktycznie można powiedzieć, co się tam dzieje, możemy przejść do ogólnego pojęcia o tym, co się tam dzieje.
Bez skoków programowanie Malbolge jest dość proste. Gdy używane są skoki, przed ponownym uruchomieniem tego kodu należy wykonać zadanie deszyfrowania. Za każdym razem, gdy instrukcja jest wykonywana, staje się natychmiast po zaszyfrowaniu, więc nie zachowuje się tak, jak wcześniej.
Aby zilustrować obejście, spójrzmy na znormalizowany program dla kotów Malbolge:
Więc jak widać, w drugiej linii mamy
/
i<
instrukcje do czynienia z I / O rzeczach. Wykorzystując fakt, żeC
rejestr jest wskaźnikiem instrukcji, możemy go zmodyfikować za pomocąi
instrukcji skutecznie tworząc gałąź. Zanim jednak nastąpi rozgałęzienie, musimy odszyfrować instrukcje, które zaledwie kilka cykli dalej odczytują i zapisują dane wyjściowe do i z TTY, w połączeniu ze skokiem. Ponieważ nie ma rzeczywistego sposobu skutecznego przechowywania stałych, musimy osadzić wiele niepowiązanych instrukcji i wykorzystać ich wartość do obliczenia innych potrzebnych stałych (wykorzystując fakt, że Malbolge nie rozdziela programu i danych)Uwaga: Części tej odpowiedzi pochodzą ze strony Malbolge na stronie Esolang wiki, licencjonowanej na podstawie CC0 - link .
Być może możesz chcieć sprawdzić moją drugą odpowiedź z udziałem Seed
źródło
pieprzenie mózgu , 6 bajtów
Wypróbuj online!
Tym razem naprawdę konkurencyjna odpowiedź w pieprzeniu mózgu. :-) Po prostu czyta ze standardowego wejścia (
,
), następnie zapętla się, gdy odczytany znak nie jest równy zero ([
), zapisuje znak odczytany dwa razy (..
) i na koniec odczytuje nowy znak (,
) przed powrotem do początku pętli (]
).Alternatywna 6-bajtowa odpowiedź:
Wypróbuj online!
źródło
Ziarno ,
60133942388438653848 bajtówWypróbuj online!
źródło
Galaretka , 1 bajt
Pełny program
Wypróbuj online!
źródło
Ḥ
ż`F
), podczas gdy mój nie mogę w to uwierzyć)Język programowania Szekspira ,
139129109106 bajtów-3 bajty dzięki Jo King
Wypróbuj online!
Wyrzuca ostrzeżenia i kończy się z błędem. Sobie z tym poradzić.
źródło
Haskell ,
151413 bajtówWypróbuj online!
lub czytelnie:
Objaśnienie: Listy są
Monad
w Haskell, a użycie operatora powiązania>>=
to aconcatMap
, wykonanie funkcji, która pobiera element i zwraca listę dla każdego elementu listy, a następnie konkatenuje wynikowe listy w jedną dużą listę.Teraz po prostu musimy budować funkcję, która, biorąc pod uwagę wartość, zwraca listę tej wartości dwa razy, co jest realizowane przez
(<$"dd")
, które można odczytać jako „Take listę['d','d']
i zastąpić każdy element z argumentem tej funkcji."dd"
Może być każde wyrażenie, które skutkuje listą dokładnie dwóch elementów, ale jest to najkrótszy z możliwych.źródło
<$
było czymś, o czym nigdy bym nie pomyślał05AB1E , 2 bajty
Ok, poddaję się. Nie mogę znaleźć 1-bajtowego rozwiązania tego problemu. Jednak ładunki 2-bajtowe ...
Wypróbuj
ø˜
online lub WypróbujøS
online .Wypróbuj
ζ˜
online lub WypróbujζS
online .Wypróbuj
€D
online lub Wypróbuj€Â
online .Wypróbuj
.ι
online.Wypróbuj
ºS
online.Wypróbuj
·S
online lub WypróbujxS
online .Wypróbuj
+S
online.I / O jako lista znaków.
Wyjaśnienie:
Jedyny program, który działa tak samo w obu wersjach 05AB1E. :)
Ta wersja działa w zasadzie tak samo jak powyższa dla nowej wersji. W starej wersji potrzebujesz
‚
najpierw jawnej pary , a następnie możesz ją spakować / przetransponować. Tylkoζ
na liście 1D nie będzie żadnego działania w starszej wersji 05AB1E.W nowej wersji 05AB1E zachowuje wszystkie wartości na stosie na liście wynikowej podczas tworzenia mapy. Natomiast w starszej wersji 05AB1E zachowałaby tylko najwyższą wartość. Dlatego działają one tylko w nowej wersji.
To wbudowane jeszcze nie było w starszej wersji 05AB1E.
W starszej wersji 05AB1E
∞
zamiast niego wbudowane byłoby lustro poziomeº
. Jednak∞S
nie działa w starszej wersji, ponieważ domyślnie przekształciłby listę w ciąg rozdzielany znakiem nowej linii przed całkowitym odbiciem lustrzanym ( Wypróbuj tutaj ), po czymS
zawierałby również te nowe znaki.Double jest skrótem od
2*
. W nowej wersji 05AB1E, wbudowanej w Elixir, działa to tylko na wartościach liczbowych. Starsza wersja 05AB1E została jednak zbudowana w języku Python, więc2*
działa podobnie i powtarza znak.Ponownie, ponieważ starsza wersja 05AB1E została zbudowana w Pythonie,
"a"+"a"
skutkuje tym"aa"
, że+
nie można jej używać do dołączania ciągów w nowej wersji. (PS: Istnieje dodatek do ciągów, który działa w obu wersjach, to znaczy«
, ale podając dwa argumenty listy, połączy je razem zamiast scalić każdy ciąg przy tych samych indeksach, jak program powyżej ( Wypróbuj tutaj ).)źródło
ζ˜
dla nowoczesnego 05AB1E.ø˜
, więc nie zawracałem sobie głowy dodaniem go. Dodałem go (jak równieżøS
/ζS
/xS
).Schemat piramidy ,
229 218213 bajtówWypróbuj online!
To może być zdecydowanie krótsze. Dane wejściowe są pobierane za pomocą argumentów wiersza poleceń. Odpowiada to w zasadzie:
Z kilkoma zastrzeżeniami, jak na przykład drukowanie jest obsługiwane zarówno w stanie pętli, jak i w korpusie pętli.
Alternatywnie 215 bajtów:
Wypróbuj online!
źródło
set
Można przesuwać w górę iw lewo bez ingerowania w cokolwiek. Wypróbuj online!Galaretka , 1 bajt
Pełny program drukujący wynik.
Wypróbuj online!
W jaki sposób?
Używa funkcji
błędu...„Podwójny” atom Jelly
Ḥ
jest zaimplementowany z Pythonem*
i wektoryzuje, podczas gdy listy znaków Jelly (jej jedyne „ciągi”) są implementowane jako listy ciągów Pythona, które zwykle mają tylko jeden znak - to znaczy dopóki nie zdamy sobie sprawy, że w Pythonie'blah'*2='blahblah'
...źródło
ḤṾV
$ echo -n "Ḥ" | hexdump -C
00000000 e1 b8 a4 |...|
af
,Ḥ
to tylko wizualna reprezentacja tego bajtu, zobacz Jelly za kod-page (również połączony w nagłówku POST).Galaretka, 1 bajt
Wypróbuj online!
Przepraszam za brak doświadczenia, dopiero zaczynam pracę z Jelly. Moim zdaniem dzieje się tak, że zdefiniowaliśmy łańcuch dyadyczny, który traktuje pojedynczy argument zarówno jako argument lewy, jak i prawy. W tym przypadku łańcuch składa się z „zip; przeplata x i y”, przeplatając sam łańcuch wejściowy.
Ktoś już opublikował 1-bajtowe rozwiązanie Jelly, więc mam nadzieję, że publikowanie moich nie jest złe.
źródło
Pyton,
3425 bajtówWypróbuj online! Kolejny, który zwraca ciąg zamiast listy znaków:
Wypróbuj online!
źródło
lambda i:sum(zip(i,i),())
powinien zrobić dla -9.for i in input():print(i,end=i)
lambda i:''.join(c*2 for c in i)
32 bajty, ale zwraca ciąg, a nie listęlambda i:''.join(c*2for c in i)
PowerShell ,
292321 bajtów-6 bajtów dzięki Andrei Odegov
-2 bajtów dzięki mazzy
Wypróbuj online!
Pobiera dane wejściowe poprzez rozpryskiwanie, co zasadniczo czyni z nich szereg znaków
źródło
8088 Montaż, IBM PC DOS,
1610 bajtówZmontowany
xxd
zrzut bajtówNiezmontowany wykaz:
Samodzielny plik wykonywalny DOS dla komputera PC. Wejście z
STDIN
, wyjście do konsoli.Interaktywne wejście konsoli:
Wejście rurowe:
Oryginalna 16-bajtowa odpowiedź:
Zmontowany
xxd
zrzut bajtówNiezmontowany wykaz:
Samodzielny plik wykonywalny DOS dla komputera PC. Wejście z wiersza poleceń, wyjście do konsoli.
źródło
LODSW
zamierza umieścić wiodącej przestrzeni (20H
) z81H
podAH
którym będzie oczywiście bałaganLOOP
, czy to wCH
... Bummer.sed ,
108 bajtówWypróbuj online!
Dzięki @manatwork za -2 bajty.
źródło
s/./&&/g
.JavaScript (Node.js) , 22 bajty
Pobiera dane wejściowe jako tablicę znaków.
Wypróbuj online!
JavaScript (ES6), 26 bajtów
Pobiera dane wejściowe jako ciąg.
Wypróbuj online!
Alternatywna wersja sugerowana przez @PabloLozano:
Wypróbuj online!
Robienie tego w sposób rekurencyjny jest równie długie:
Wypróbuj online!
źródło
s=>s.replace(/./gs,c=>c+c)
dzięki czemu.
pasuje również do nowych liniijoin('')
Trzeba o to zadbać. Z drugiej strony może to zwiększać wydajność w niestandardowy sposób, co może nie być poprawne.["aa","bb","cc"]
jest jednak listą ciągów, ani ciągiem, ani listą samych znaków. Dodanie złączenia lub spłaszczenia go do listy znaków jest poprawne, ale należy je liczyć do liczby bajtów.Haskell , 8 bajtów
Wypróbuj online!
Dowolny ciąg dwóch znaków działa zamiast
"x2"
.źródło
Brachylog , 2 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Befunge-98 (PyFunge) , 6 bajtów
Wypróbuj online!
źródło
C (gcc) , 40 bajtów
Wypróbuj online!
Zakłada
t
się, że bufor jest wystarczająco duży, aby przechowywać dane wyjściowe.Prawdopodobnie nie jest zgodny ze standardami, ale działa na TIO.
źródło
J ,
63 bajty-3 bajty dzięki Richardowi Donovanowi
Wypróbuj online!
K (oK) ,
84 bajtów-4 bajty dzięki ngn!
Wypróbuj online!
źródło
{2}#
APL (dzaima / APL) , 2 bajty SBCS
Anonimowa ukryta funkcja prefiksu.
Wypróbuj online!
⌿
to „replikacja” :-)źródło
Haskell , 15 bajtów
Tutaj
(:)<*>pure
pobiera argument i zwraca listę zawierającą ten argument dwa razy. Następnie>>=
odwzorowuje tę funkcję na każdy wpis listy danych wejściowych (w naszym przypadku jest to ciąg znaków) i spłaszcza wynik (listę list) z powrotem do listy.Wypróbuj online!
źródło
Rdza ,
8346 bajtówWypróbuj online!
Nie podoba mi się to, ale to nie oszustwo .
źródło
Labirynt , 12 bajtów
Wypróbuj online!
Właśnie odkryłem ten język, więc odpowiedź ta może zostać znacznie poprawiona ...
źródło
","
zamiast"",
), udało mi się teraz jedenastu - czy może być dziesięć lub więcej?Stax , 2 bajty
Uruchom i debuguj na staxlang.xyz!
Kopiuj. Zamek błyskawiczny. Druk niejawny.
źródło
Siatkówka , 4 bajty
Wypróbuj online!
Dopasowuje pusty ciąg (tj. Pozycję przed / po każdym znaku) i wstawia ciąg między tym a poprzednim dopasowaniem (zawsze jest to dokładnie poprzedni znak; z wyjątkiem pierwszego dopasowania, w którym nic nie robi).
źródło
Java 8, 27 bajtów
Wypróbuj online.
Stare 31 bajtów odpowiada przed zmianą reguł:
UWAGA: Sugestia @EmbodimentOfIgnorance (
\n|.
zamiast(?s).
została cofnięta, ponieważ nie powiedzie się, jeśli dane wejściowe zawierają\r
. Dziękujemy za zgłoszenie do @ OlivierGrégoire .Wypróbuj online.
Wyjaśnienie:
Wyjaśnienie Regex:
źródło
(?s).
można zastąpić przez\n|.
\n|.
Wersja nie działa poprawnie z wejściem"\r"
.(?s).
Wersja działa poprawnie\r
, choć.\n
jest to drukowalne, ale nie jest częścią zakresu drukowalnego ASCII.Pyth , 2 bajty
Wypróbuj online!
.i
nterleasuje dwie kopie danych wejściowych razem. Dane wejściowe są niejawne, więc „pełna” wersja tego programu byłaby tam.iQQ
, gdzieQ
jest dane wejściowe programu.źródło
MarioLANG ,
23 2017 bajtówWypróbuj online!
W przeciwieństwie do pieprzenia mózgu, MarioLANG zwraca -1 na EOF, więc musimy zwiększyć odczytaną wartość przed porównaniem jej do zera, a następnie zmniejszyć przed wydrukowaniem. Jest to prawdopodobnie najkrótsza możliwa odpowiedź w MarioLANG.
źródło
Brain-Flak , 48 bajtów
Wypróbuj online!
Ten kod ma dwie główne sekcje. Pierwszy po prostu odwraca ciąg:
Drugi jest prawie identyczny, odwraca ciąg i podwaja znaki na miejscu
Powodem, dla którego musimy odwrócić sytuację, jest to, że musimy dotknąć każdego elementu ciągów, aby uzyskać wynik. Ponieważ Brain-Flak używa modelu stosu, dotykając każdą postać, oznacza strzelanie do wszystkich elementów i popychanie ich. Ze względu na sposób stosu FIFO oznacza to, że za każdym razem, gdy jest to wykonywane, odwracamy ciąg. Problem cofania nie występuje poniżej w kanale dymowym.
Brain-Flueue , 28 bajtów
Wypróbuj online!
Ponieważ kolejki są pierwsze na końcu, wszystko, co musimy zrobić w Brain-Flueue, to iteracja przez cały ciąg znaków, podwajając każdą postać na miejscu. Utrudnia to jednak iterację całego stosu. W Brain-Flak mogliśmy po prostu iść, aż wysokość stosu wyniesie zero, jednak z kolejką, pchanie czegoś stawia go na dnie kolejki, zasadniczo go tracąc. Zamiast tego używamy drugiej kolejki do śledzenia liczby potrzebnych operacji. To sprawia, że główna pętla wygląda następująco:
Zawartość jest skromna
Dla zabawy obie odpowiedzi mogłyby być znacznie krótsze, gdyby na wejściu nie było bajtów zerowych (wartość ascii zero)
Brain-Flak , 26 bajtów
Wypróbuj online!
Brain-Flueue , 14 bajtów
Wypróbuj online!
źródło