Wyzwanie
Napisz program, który zmieni kolejność znaków ASCII!
Powinien on wypisać pojedynczy ciąg zawierający wszystkie drukowalne znaki ASCII dokładnie raz. Pierwszy znak tego łańcucha ma wartość 1, drugi znak wartość 2 i tak dalej.
Jeśli dwa znaki zwykle znajdują się obok siebie (różnica między ich kodami znaków wynosi 1), mogą nie pojawić się obok siebie na wyjściu.
Punktacja
Twój wynik będzie sumą wartości wszystkich znaków w kodzie źródłowym, zgodnie z wynikami programu.
Zobacz sekcję Weryfikacja, aby obliczyć swój wynik.
Najniższy wynik wygrywa!
Zasady
„ASCII do wydruku” oznacza kody znaków 32–126 włącznie.
Możesz napisać pełny program lub funkcję.
Twój kod może zawierać tylko drukowalne znaki ASCII i znaki nowej linii.
Twój program może nie pobierać żadnych danych wejściowych.
Nowe linie zawsze będą miały wartość 1. Dane wyjściowe Twojego programu nie powinny zawierać nowej linii.
Weryfikacja
Użyj tego fragmentu stosu, aby sprawdzić, czy kod wyjściowy jest prawidłowy, i obliczyć wynik kodu!
var result = document.getElementById("result");document.getElementById("submit").onclick = function() {var code = document.getElementById("code").value;var output = document.getElementById("output").value;var values = [];for (var i = 0; i < output.length; i++) {var c = output[i];var v = c.charCodeAt();if (v < 32 || v > 126) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + v + ") is out of range.";return;}if (values.indexOf(c) >= 0) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + v + ") was repeated.";return;}if (i > 0) {var d = output[i - 1];var w = d.charCodeAt();if (Math.abs(v - w) == 1) {result.innerHTML = "Invalid output! Reason: `" + d + "` and `" + c + "` (codes " + w + " and " + v + ") cannot appear next to each other in the output.";return;}}values.push(c);}for (var j = 32; j <= 126; j++) {var c = String.fromCharCode(j);if (values.indexOf(c) < 0) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + j + ") was missing.";return;}}var score = 0;for (var k = 0; k < code.length; k++) {var s = values.indexOf(code[k]) + 1;if (s <= 0) s = 1;score += s}result.innerHTML = "Your score is " + score + "!";}
<textarea id="code" rows=10 cols=50>Enter your code here.</textarea><br/><textarea id="output" rows=1 cols=50>Enter your code's output here.</textarea><br/><button id="submit">Submit</button><br/><p id="result"></p>
Tabela liderów
Dzięki temu postowi dla kodu tabeli liderów!
var QUESTION_ID=57914,OVERRIDE_USER=42844;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.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(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;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="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <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><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><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>
Odpowiedzi:
CJam,
356186168131 131126111999694Wypróbuj online w interpretatorze CJam .
Wydajność
Pomysł
Stosując odmianę techniki powszechnej w quinach CJam, sortujemy drukowalne znaki ASCII według tego, czy pojawiają się w kodzie źródłowym, a nie pojawiające się - z dwoma wyjątkami - według bitów parzystości ich punktów kodowych.
Przy odpowiednim układzie źródłowym potrafimy również sortować znaki kodu źródłowego - z jednym wyjątkiem - według częstotliwości.
Należy zwrócić szczególną uwagę, aby dwa sąsiednie znaki nie pojawiły się po raz pierwszy w kodzie źródłowym, ponieważ unieważniłoby to odpowiedź.
Kod
źródło
Brainfuck,
1692826765(Nadal) Niezoptymalizowany, wiem. Pracuję nad tym (zostaw komentarz w komentarzach).
Wydajność:
Już do pewnego stopnia wykorzystuję przepełnienie 8-bitowych komórek, ale myślę, że nadal możesz to zoptymalizować. Choć zmniejszyłoby to użycie tanich znaków :).
źródło
Pyth
173170Kod
Wydajność
Zakodowane na stałe ciąg quine. Dogodnie
"
znak znajduje się bardzo blisko początku generowanego ciągu. Drukuje nawet nieparzyste znaki po „quine”.Ogromne podziękowania dla Dennisa za uratowanie 3 punktów i uczynienie kodu palindromem!
Wypróbuj tutaj
źródło
r
powinien zwrócić listę ciągów znaków, gdy jest używany w tym trybie.\~
z zakresu postaci poprawia wynik o 3 punkty. (Pozwala to również na uczynienie twojego kodu palindromem.)~
„quine” zamiast konieczności dodawania go do zakresu ...: dJava,
3518 31892692Prosta pętla, która drukuje nawet znaki, a następnie kursy. Próbowałem zoptymalizować wcześniejsze ASCII, ale większość z nich wydłużyła go ogólnie i uzyskała wyższy wynik.
Dane wyjściowe to:
Edycja: na początku źle zrozumiał wynik. Po pierwszym ustawieniu na nieparzyste, a następnie parzyste, wyniki są znacznie lepsze.
źródło
Oktawa, 628
Kod
Wydajność:
Dwa zakresy domyślnie konwertowane na ciąg. Nie jestem pewien, czy powrót jako Ans jest dopuszczalny, daje także ostrzeżenie o domniemanej konwersji. Próbowałem innych wektorów zasięgu, ale nie mogłem znaleźć nic bardziej wydajnego.
źródło
C, 42 bajty, wynik 1539
C, 39 bajtów, wynik 1687
W obu przypadkach,
i
jest inicjowany liczbą ciągów w linii poleceń (ponieważ nie podano żadnych argumentów, jest to 1.)Pierwsza wersja robi rzeczy w oczywisty sposób, zwiększając o 2, biorąc modulo 95, a następnie drukując wszystkie szanse, a następnie wszystkie wyrównania.
Druga wersja wykorzystuje fakt, że putchar zwraca wydrukowany znak. Ponieważ 32 to coprime do 95, możemy cyklicznie przewijać znaki. Ponieważ C zawiera wiele małych liter, miałem nadzieję, że oprócz tego, że będzie krótszy, będzie miał niższy wynik, ale niestety tak nie jest.
źródło
i;main(){for(;i<3990;i+=42)putchar(i%95+32);}
wyniki 1472, myślęa
nazwy zmiennej zamiasti
w obu przypadkach.Befunge-93,
801797724699627612Kod:
Wydajność:
Możesz spróbować tutaj, jeśli chcesz.
Działa poprzez wyprowadzenie 32-126 evens, a następnie 33-125 kursów. Jeśli ktoś chce wyjaśnienia, chętnie bym to zrobił.
Grałem w golfa, dopóki nie dostałem go lepiej niż mózg ***, który uważałem za najniższy, jaki mogłem przejść. Jeśli chodzi o strategie gry w golfa, wygenerowałem postacie ascii, a następnie spróbowałem zastąpić kosztowne postacie tańszymi (np. 1 z 2). Dowiedziałem się, ponieważ
g
był tak drogi, że lepiej było obliczyć 126 przy każdej iteracji. Owinąłem również górę, ponieważ^
było tańsze niżv
.801 -> 797 : Ostatnia zmiana polegała na usunięciu dodatkowych spacji, które były reliktem
g
.797 -> 724 : Za każdym razem zmieniłem obliczanie 126 na czytanie tylda za pomocą
"~"
. pozwoliło to również na wycięcie białych znaków (i znów biję jedną z odpowiedzi BF)724 -> 699 : Podobnie jak w przypadku ostatniej zmiany, „” to niezwykle tani (4 punkty) sposób na uzyskanie 32
699 -> 627 : Ponieważ przechodzę tylko przez drugi wiersz, raz zmieniłem go na ustawienie 33 zamiast utrzymywać inną wartość na stosie i dodawać jedną.
627 -> 612 : Przeniesiono jak najwięcej danych wejściowych. Jestem prawie pewien, że projekt musiałby drastycznie się zmienić, aby dalej grać w golfa.
Jest to prawdopodobnie ostatnia iteracja, chyba że jeden z języków innych niż golfa uzyska niższe rozwiązanie.
źródło
Haskell, 830
Ocenia ciąg:
Zainspirowany odpowiedzią @ Jørgen i zupełnie inny niż mój własny .
źródło
Brainfuck, wynik
576667Myśląc o tym, 576 wydawało się być prawdą: dokonałem niewielkiego oszacowania i wyliczyłem wynik na poziomie około 95 * 6 + 45 * 2 = 660. Coś musiało pójść nie tak przy pierwszym uruchomieniu walidatora. Prawidłowy wynik jest bliższy mojej ocenie. To wciąż niezły wynik.
Nie komplikuj.
Zasadniczo chodzi po zestawie ASCII, drukuje znaki. Trzy znaki użyte w programie są drukowane jako pierwsze. Zawracanie na obu końcach było trochę trudne.
źródło
Ruby 2.2, 1157
Wydajność:
Jest to dość głupie rozwiązanie (i nie jestem pewien, czy srand nie powinien być standardową luką, szczególnie, że drastycznie zmniejsza przenośność). Tasuje (większość) bajtów w swoim własnym kodzie źródłowym i tasuje resztę, a następnie łączy i łączy tablice. Używa losowego zbioru nasion, dzięki czemu dane wyjściowe są zgodne z prawem (fakt, że jest to jedna cyfra, jest czystym szczęściem).
źródło
CBM BASIC V2, 2553
dane wyjściowe (przekonwertowane w ASCII przez skrypt Pythona na PC):
źródło
gawk,
278219881821Wydajność
Stosowanie
Skopiuj i wklej następujące elementy na konsolę
(mawk nie będzie działał, ponieważ jest
zbyt ścisły wprzypadku printf)Na
< /dev/null
końcu sygnalizuje koniec wejścia, więc blok END zostanie wykonany.Zasadniczo przeplatałem postacie pochodzące z dołu i z góry. Następnie przeanalizowałem, które znaki były najczęściej używane w programie i wydrukowałem je najpierw, w kolejności częstotliwości. Potem musiałem się upewnić, że żadna postać nie jest drukowana więcej niż jeden raz. Tkanie w przeciwnych kierunkach sprawiło, że bardziej prawdopodobne jest, że już używana postać nie doprowadzi do drukowania sąsiadów. Ale spotkali się w środku
P
, więc musiałem to również wydrukować na początku. Potem były pewne problemy ze znakami, które są używane w wyrażeniach regularnych ... Potem zmieniłem nazwę zmiennych na tanio i zrobiłem wszystko od nowa. Potem znalazłem kilka znaków, które mógłbym zastąpić w moim programie, i zrobiłem to wszystko od nowa. I tak dalej. W końcu poprawiłem trochę preferowane postacie, testując.Myślę, że skończyłem
:D
Podczas tego procesu nigdy nie wykonywałem programu z wiersza poleceń, ale utworzyłem ciąg, który wykonałem ze skryptu, który analizowałby dane wyjściowe pod kątem poprawności i dawał mi wynik i rzeczy. Wynik ten bardzo pomógł. Oczywiście ponownie sprawdziłem tutaj (nigdy nie wiadomo), ale uzyskałem ten sam wynik.
Tam program wygląda tak
źródło
Matlab, 763
Oczywiście nie jest możliwe pokonanie rozwiązania Octave w MATLAB, ponieważ nie ma ono
"
„wczesnego” zakresu ASCII. Jednak zdecydowałem się na odrobinę kreatywności i pomyślałem o nadużyciachrandperm
. Przyznaję, że jest to trochę zuchwałe i niektórzy uważają to za oszustwo, ale myślę, że to miły akcent. Najpierw program i wyjście:Ouput:
Do obliczenia odpowiedniego materiału siewnego użyłem następującego programu, który działałem, aż nasiona = 4648029 (tj. Do czasu wykonania naczyń)
Być może jednym ze sposobów ulepszenia programu jest również wypróbowanie nasion zmiennoprzecinkowych, np. 2.3e4 zwiększa liczbę nasion bez dłuższej długości nasion. Jeśli ktoś ma ochotę stworzyć program do obliczania wszystkich liczb n-znakowych reprezentowanych przez Matlaba ....;)
źródło
randperm
nie tak długa nazwa funkcji.Haskell,
16601376Definiuje funkcję
a
zwracającą ciąg znaków:źródło
Java, 15470
Nie jest to wcale optymalne, ale w rzeczywistości odwzorowuje znaki (a nie tylko drukuje zestaw zmodyfikowanych znaków).
Nie golfowany:
Wydajność
Porządkuje znaki przy użyciu tej samej metody, co odpowiedź Geobitów i robi coś podobnego do tej odpowiedzi, aby zmienić znaki.
źródło
BBC BASIC, 2554
Kod
Wydajność
źródło
Fortran 90,
152315191171Jest to zagnieżdżona pętla wyjściowa, podobna do innych odpowiedzi. Nie jestem przekonany, że możliwa jest znaczna poprawa ...
Wydajność:
Edycja: Zapomniałem, że Fortran 90 jest niezbędny do tego kodu, 77 wymaga kodu, aby zaczął się w 7. kolumnie. Z drugiej strony w języku nie jest rozróżniana wielkość liter, co umożliwia łatwą poprawę. Liczniki pętli są,
J
aL
ponieważ są to dwie pierwsze litery w ciągu wyjściowym, domyślnie zadeklarowane przez Fortran jako liczby całkowite.źródło
Perl,
1089922Okazuje się, że wydrukowanie wartości ASCII w krokach
4258 daje najniższy wynik przy takim podejściu:Wydajność:
źródło
print chr$_*42%95+32for 0..94
osiąga już wynik 925, a 42 prawdopodobnie nie jest już optymalne.print chr$_*63%95+32for 31..125
wynik 799.JavaScript,
31692548214421042071188518761872Kod
Wydajność
źródło
v+
część jest(v,i)=>v+i*3%95+32
konieczna? Wydaje mi się, że po prostu dodaje za0
każdym razem, gdy tablica jest wypełniona0
s ....for(w=95;w-->0;)
może byćfor(w=95;w--;)
, ponieważ0
jest fałszem i1, 2, 3...
jest prawdomówny.Python 2,
72 bajty (3188)116 bajtów(1383)(1306)(1303)dzięki @FryAmTheEggman za lewę;)
dzięki @nim (Czy źle odczytałem tekst?: P)
dzięki @Mathias Ettinger
wydajność:
źródło
a=map(chr,range(32,172))
i"".join(a[::2]+a[1::2])
;
z nowymi liniami, które liczą się jako 1n='nr i(a…
zamiastn=' nri(a…
PHP,
12171081Kod:
Ponieważ zmienne nie są inicjowane, musi ukrywać powiadomienia podczas działania (PHP narzeka, ale kontynuuje wykonywanie i używa wartości domyślnej, która jest odpowiednia w kontekście;
0
w tym przypadku):Jego wydajność:
Uwagi:
chr(32)
);52
została „odkryta” poprzez przeszukanie całego zakresu (1..94) możliwych przesunięć; 1 tworzy listę drukowalnych znaków w porządku rosnącym według ich kodów ASCII, 94 tworzy listę w odwrotnej kolejności, oba są złe; wielokrotności 5 i 19 (dzielniki 95) dają krótkie cykle i nie obejmują całego zakresu wartości (także złych);52
wydaje się być magią; jest najlepszym przesunięciem dla tego kodu; ale jest również najlepszy dla niektórych odmian kodu (które dają nieco większe wyniki); wariacje próbowałem: użyciewhile()
zamiastfor()
, użytkowania$f++
,$f--
lub--$f
zamiast++$f
, zamienić argumenty wokół<
i+
operatorów; wyciśnij modyfikację$T
do32+$T
;$T
i$f
) są pierwszymi literami na wyjściu;$T
z4
albo11
ale wyniki były gorsze; zaczynając od4
tworzy$
pierwszy znak na wyjściu; jest najczęściej używanym znakiem w kodzie źródłowym PHP;11
stawia+
przed sobą;$
i+
są najczęściej używanymi znakami w tym kodzie.Kod, testy, przyrostowe zmiany, których próbowałem, aż doszedłem do tego rozwiązania, a skrypt sprawdzający wszystkie możliwe wartości kroków (autorytatywny dostawca
52
jako najlepszy krok) można znaleźć na github .źródło
Fourier, 1236
Zasadniczo konwersja mojego programu BBCB
Wydajność
źródło
AWK , 49 bajtów, wynik: 1755
Wypróbuj online!
Po prostu drukuje każdą inną postać, a następnie zaczyna wypełniać puste pola. Pierwszy wydrukowany znak to
f
. Próbowałem drukować w odwrotnej kolejności, ale to znacznie zwiększyło wynik. Inne wzory są możliwe po prostu poprzez zmianę mnożnika i kryteriów pętli.źródło
Perl 5 , 1069
Wypróbuj online!
źródło