Ponowne mapowanie ASCII


36

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>


12
Uwielbiam fragment sprawdzania poprawności.
mınxomaτ

2
Czy możesz krótko wyjaśnić, w jaki sposób obliczany jest wynik, abyśmy wiedzieli, jak zoptymalizować nasze odpowiedzi?
Fatalize

@Fatalize Zasadniczo chodzi o napisanie programu, którego wynik przypisuje niskie wartości do używanych znaków, umieszczając je na początku generowanego ciągu. „Wartość” każdego znaku ASCII jest określana na podstawie jego 1-indeksu w danych wyjściowych kodu. Zamiast liczyć każdą postać w twoim źródle jako 1, jak w golfa kodowego, każda postać w twoim źródle jest liczona jako jej wartość, jak opisano powyżej.
jrich

4
Wydaje się, że to dobry moment na użycie
białych znaków w

3
@ C0deH4cker Niestety wymagałoby to zakładek, które nie są drukowalnymi znakami ASCII ani znakami nowej linii, więc byłyby nieprawidłowe.
jrich

Odpowiedzi:


21

CJam, 356 186 168 131 131 126 111 99 96 94

"_|`'~,Y/G>z`|"_~

Wypróbuj online w interpretatorze CJam .

Wydajność

"_|`'~,Y/G>z[ \$&(*.02468:<@BDFHJLNPRTVXZ^bdfhjlnprtvx!#%)+-13579;=?ACEIKMOQSUW]acegikmoqsuwy{}

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

"             "_~  Push a string, duplicate it and evaluate the copy.
 _|                Perform the set union of the original string with itself.
                   This is just an "excuse" to introduce the underscore.
   `               Inspect the string (surrounds it with double quotes).
    '~,            Push the string of Unicode characters before the tilde.
       Y/          Divide it into pairs.
         G>        Discard the first 16 pairs (control characters).
           z       Zip. This interleaves the pairs, ordering the characters
                   by their code points' parities.
            `      Inspect the array, i.e., push its string representation.
             |     Perform set union with the string of source code characters.

Nie byłoby zaskoczeniem, że CJam to wygrał, Pyth nie ma prostych znaków ani znaków ASCII we wbudowanym.
orlp

1
CJam również nie ma wbudowanego znaku ASCII. Używam jednoargumentowego zakresu, a następnie odrzucam znaki kontrolne.
Dennis

14

Brainfuck, 1692 826 765

(Nadal) Niezoptymalizowany, wiem. Pracuję nad tym (zostaw komentarz w komentarzach).

++[------>+<]>.++.---[-->+++<]>-.[->+++++++++<]>.--[----->+<]>.[-->+++<]>+.++.>+++[<---------->-]<-[-->+<]>-++.>++[>+++<-]>[<<++.>>-]<<++++.++.++.++.++.++.++++>>++++[<++++++++>-]<[<++.>-]<---.++.-->+++[>+++++<-]>-[<<--.>>-]<<---->++++[>+++++<-]>++[<<--.>>-]<<------.--.--.--.--.

Wydajność:

+->.<[] "$&(*,02468:@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~{}ywusqomkigeca_YWUSQOMKIGECA?=;97531/)'%#!

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 :).


2
Mam 576 z bardzo naiwnym programem. Zapraszam do mieszania i dopasowywania mojego pomysłu. +1.
Level River St

12

Pyth 173 170

Kod

-so%CN2rd\~p"p~\dr2NC%os-

Wydajność

p~\dr2NC%os- "$&(*,.0468:<>@BDFHJLPRTVXZ^`bfhjlntvxz|!#')+/13579;=?AEGIKMOQSUWY[]_acegikmquwy{}

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


Na marginesie, nie sądzę, że Pyth rpowinien zwrócić listę ciągów znaków, gdy jest używany w tym trybie.
FryAmTheEggman

1
Korzystanie \~z zakresu postaci poprawia wynik o 3 punkty. (Pozwala to również na uczynienie twojego kodu palindromem.)
Dennis

@Dennis Thanks! Zbyt długo zajęło mi uświadomienie sobie, że mogę po prostu napisać fragment ~„quine” zamiast konieczności dodawania go do zakresu ...: d
FryAmTheEggman

10

Java, 3518 3189 2692

Prosta 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.

void A(){for(char A=31;A!=126;System.out.print(A+=2))A=A==125?30:A;}

Dane wyjściowe to:

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

Edycja: na początku źle zrozumiał wynik. Po pierwszym ustawieniu na nieparzyste, a następnie parzyste, wyniki są znacznie lepsze.


10

Oktawa, 628

Kod

["" 32:2:126 33:2:125]

Wydajność:

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

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.


Zwrot odpowiedzi jest do przyjęcia, niezła robota!
jrich

8

C, 42 bajty, wynik 1539

main(i){for(;i-191;i+=2)putchar(32+i%95);}

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

C, 39 bajtów, wynik 1687

main(i){for(;i-96;)i=putchar(32+i%95);}

!Aa"Bb#Cc$Dd%Ee&Ff'Gg(Hh)Ii*Jj+Kk,Ll-Mm.Nn/Oo0Pp1Qq2Rr3Ss4Tt5Uu6Vv7Ww8Xx9Yy:Zz;[{<\|=]}>^~?_ @`

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.


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}wyniki 1472, myślę
skrzypiące kostkowanie

@ squeamishossifrage dobrze zauważony, rzeczywiście! Ile czasu zajęło znalezienie tego? Znudziło mnie C, moja pieprzona odpowiedź jest znacznie lepsza.
Level River St

Po prostu przeglądałem skrypt Perla, którego użyłem do wygenerowania tej odpowiedzi :-)
squeamish ossifrage

możesz obniżyć swój wynik, używając anazwy zmiennej zamiast iw obu przypadkach.
409_Conflict

8

Befunge-93, 801 797 724 699 627 612

Kod:

"!  "     ^
v     _@#$<
>:,2+:"~"`|
^         <

Wydajność:

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

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ż gbył 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 reliktemg .

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.


7

Haskell, 830

['!','#'..'}']++[' ','\"'..'~']

Ocenia ciąg:

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

Zainspirowany odpowiedzią @ Jørgen i zupełnie inny niż mój własny .


7

Brainfuck, wynik 576 667

Myś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.

-+.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~{}ywusqomkigeca_][YWUSQOMKIGECA?=;97531/,*(&$" #!%')

6

Ruby 2.2, 1157

eval s='srand 1;([*s.bytes].shuffle|[*33..0x7e].shuffle).map{|c|putc c}'

Wydajność:

f.p|cahu]xens7*0{)3tbmdy[}l1; r(o@&gN/MjzSVv~>D4I`L\KB92=i%PHE?5TQw,W-#6U'^Y!$R"XkO_q+CAGZF<8:J

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).


1
Ciekawe rozwiązanie! Sklasyfikuję to jako legalne, ponieważ zawsze będzie dawało to samo wyjście (jeśli dobrze zrozumiałem) przy tym samym nasieniu. Również różnorodność różnych podejść jest zawsze bardziej interesująca.
jrich

5

CBM BASIC V2, 2553

1FORI=0TO47:PRINTCHR$(32+I*2);:NEXT
2FORI=0TO47:PRINTCHR$(33+I*2);:NEXT 

dane wyjściowe (przekonwertowane w ASCII przez skrypt Pythona na PC):

<blank>"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

5

gawk, 2782 1988 1821

END{for(rrf=rrr="rf(3)+=;1\"$?:~ptoin[<-EN% ^.|P";fr++<333;$fr=(ff=sprintf("%c",fr))~"[[(]"?f:ff);for(;r++<33+13+1;rrf=f)printf(rrf)(rrr~(rr=$(31+1+r+r))?f:rr)(rrr~(rr=$(133-(3+3+r+r)))?f:rr)}

Wydajność

rf(3)+=;1"$?:~ptoin[<-EN% ^.|P}{&yw*u,sq02m4k68gec>a@_B]DFYHWJULSQORMTKVIXGZ\CA`bd9h7j5l/vx'z#!

Stosowanie

Skopiuj i wklej następujące elementy na konsolę
(mawk nie będzie działał, ponieważ jest zbyt ścisły w przypadku printf)

awk 'END{for(rrf=rrr="rf(3)+=;1\"$?:~ptoin[<-EN% ^.|P";fr++<333;$fr=(ff=sprintf("%c",fr))~"[[(]"?f:ff);for(;r++<33+13+1;rrf=f)printf(rrf)(rrr~(rr=$(31+1+r+r))?f:rr)(rrr~(rr=$(133-(3+3+r+r)))?f:rr)}' < /dev/null

Na < /dev/nullkoń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

p=sprintf("END{"\
"for(rrf=rrr=%c%s%c;fr++<333;$fr=(ff=sprintf(%c%cc%c,fr))~%c[[(]%c?f:ff);"\
"for(;r++<33+13+1;rrf=f)printf"\
"(rrf)(rrr~(rr=$(31+1+r+r))?f:rr)(rrr~(rr=$(133-(3+3+r+r)))?f:rr)}"\
,34,s=sprintf("rf(3)+=;1%c%c$?:~ptoin[<-EN%c ^.|P",92,34,37),34,34,37,34,34,34)

5

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życiach randperm. 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:

rng(1194663);['' randperm(95)+31]

Ouput:

p2)[]913r~jZe:'Xf +b(Atd@LHT*7&xmN>6!?CJgwsaSh|/McO4_EkK=$5VP-%D<"Gz#Yq08n};WB`{.l\Quy^vR,IFoiU

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ń)

minscore=Inf;
for(seed=1:1e9)
    rng(seed)
    p=randperm(95)+31;
    if(any(abs(diff(p))==1))
        continue
    end
    codestring=sprintf('rng(%d);['''' randperm(95)+31]',seed);
    score=0;
    for(i=1:length(codestring))
        score=score + find(codestring(i)==p,1);
    end
    if(score<minscore)
        minscore=score;
        bestseed=seed;
    end
end

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 ....;)


Myślę, że to doskonałe rozwiązanie. Jednak [”32: 2: 126 33: 2: 125] (z pojedynczymi cudzysłowami) jest ważny i krótszy w 728 punktach :-)
Jørgen

@ Jørgen Wiem, ale chciałem spróbować innego podejścia;). Myślę, że przyniosłoby to bardziej interesujące wyniki, gdyby randpermnie tak długa nazwa funkcji.
Sanchises

4

Haskell, 1660 1376

""!_="O"
(a:b)!(c:d)=a:c:b!d
a=[' '..'N']!['P'..]

Definiuje funkcję azwracającą ciąg znaków:

 P!Q"R#S$T%U&V'W(X)Y*Z+[,\-].^/_0`1a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~O

4

Java, 15470

class A{public static void main(String[]I) throws Exception{java.lang.reflect.Field C=Character.class.getDeclaredClasses()[0].getDeclaredField("cache");C.setAccessible(true);Character[]E=(Character[])C.get(C);for(char A=31,G=31;A!=126;E[G++]=new Character(A+=2))A=A==125?30:A;for(char A=31;A!=126;A++)System.out.printf("%c", A);}}

Nie jest to wcale optymalne, ale w rzeczywistości odwzorowuje znaki (a nie tylko drukuje zestaw zmodyfikowanych znaków).

Nie golfowany:

public class Main {
    public static void main(String[] args) throws Exception {
        java.lang.reflect.Field feild = Character.class.getDeclaredClasses()[0].getDeclaredField("cache");
        feild.setAccessible(true);
        Character[] array = (Character[]) feild.get(args); //Since it's a static field, we can supply whatever we want here, and args is cheaper than null.

        char i = 31;
        for (char c = 31; c != 126; array[i++] = new Character(c += 2)) {
            c = c == 125 ? 30 : c;
        }

        for (char c = 31; c < 126; c++) {
            System.out.printf("%c", c);
        }
    }
}

Wydajność

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

Porządkuje znaki przy użyciu tej samej metody, co odpowiedź Geobitów i robi coś podobnego do tej odpowiedzi, aby zmienić znaki.


3

BBC BASIC, 2554

Kod

n=32
s$=""
REPEAT
  s$+=CHR$(n)
  n+=2
  IFn=128THENn=33
UNTILn=127
PRINTs$

Wydajność

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

3

Fortran 90, 1523 1519 1171

Jest to zagnieżdżona pętla wyjściowa, podobna do innych odpowiedzi. Nie jestem przekonany, że możliwa jest znaczna poprawa ...

PRINT*,((CHAR(J),J=L,126,2),L=32,33)
END

Wydajność:

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

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ą, Ja Lponieważ są to dwie pierwsze litery w ciągu wyjściowym, domyślnie zadeklarowane przez Fortran jako liczby całkowite.


3

Perl, 1089 922

Okazuje się, że wydrukowanie wartości ASCII w krokach 42 58 daje najniższy wynik przy takim podejściu:

print chr$_*58%95+32for 0..94

Wydajność:

 Z5oJ%_:tO*d?yT/iD~Y4nI$^9sN)c>xS.hC}X3mH#]8rM(b=wR-gB|W2lG"\7qL'a<vQ,fA{V1kF![6pK&`;uP+e@zU0jE

1
print chr$_*42%95+32for 0..94osiąga już wynik 925, a 42 prawdopodobnie nie jest już optymalne.
Dennis

Dzięki @Dennis - nie miałem pojęcia, że ​​możesz tak pisać pętle.
skrzypiący kostrzew

Jeśli zastąpisz spacje liniami, uzyskasz print chr$_*63%95+32for 31..125wynik 799.
Dennis

3

JavaScript, 3169 2548 2144 2104 2071 1885 1876 1872

Kod

t=''
i=S=95
while(i--)t+=String.fromCharCode(i*2291%S-
-32)
alert(t)

Wydajność

ti^SH=2'{peZOD9.#wlaVK@5*~sh]RG<1&zodYNC8-"vk`UJ?4)}rg\QF;0%yncXMB7,!uj_TI>3(|qf[PE:/$xmbWLA6+ 

Czy v+część jest (v,i)=>v+i*3%95+32konieczna? Wydaje mi się, że po prostu dodaje za 0każdym razem, gdy tablica jest wypełniona 0s ....
jrich

@UndefinedFunction Wydaje się, że nie. Nie skupiałem się zbytnio na optymalizacji, ponieważ pracowałem nad alternatywną metodą, która i tak była krótsza. Dzięki! =)
Mwr247,

for(w=95;w-->0;)może być for(w=95;w--;), ponieważ 0jest fałszem i 1, 2, 3...jest prawdomówny.
jrich

@UndefinedFunction Wow, jak o tym nie pomyślałem! Właśnie ogoliłeś mi 56 punktów, przynosząc go teraz do 2144: D Wciąż próbuję dostać go poniżej 2000 ...
Mwr247

Łatwa poprawa: do oddzielania instrukcji użyj znaku nowej linii zamiast średnika. Newlines liczą się jako 1.
jrich

3

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

n='nr i(a)2:]o[c=fh1+t"3egj,p.7'
a=[chr(r)for r in range(32,127)if not chr(r)in n]
print n+"".join(a[::2]+a[1::2])

wydajność:

 nr<blank>i(a)2:]o[c=fh1+t"3egj,p.7!$&*/469<?ACEGIKMOQSUWY\_bkmsvxz|~#%'-058;>@BDFHJLNPRTVXZ^`dlquwy{}

4
a=map(chr,range(32,172))i"".join(a[::2]+a[1::2])
FryAmTheEggman

1
Myślę, że możesz zastąpić niektóre ;z nowymi liniami, które liczą się jako 1
nimi

1
Możesz zdobyć 3 punkty, zaczynając od n='nr i(a…zamiastn=' nri(a…
409_Conflict 17.0915

3

PHP, 1217 1081

Kod:

for(;$T!=T;$T=($T+52)%95)echo chr(32+$T);

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; 0w tym przypadku):

$ php -d error_reporting=0 remapping-ascii.php

Jego wydajność:

 T)]2f;oDxM"V+_4h=qFzO$X-a6j?sH|Q&Z/c8lAuJ~S(\1e:nCwL!U*^3g<pEyN#W,`5i>rG{P%Y.b7k@tI}R'[0d9mBvK

Uwagi:

  • dane wyjściowe zaczynają się od białej spacji ( chr(32));
  • kod drukuje białe znaki, a następnie każdy 52 znak, owijając się wokół zakresu;
  • magiczna liczba 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);
  • 52wydaje 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życie while()zamiast for(), użytkowania $f++, $f--lub --$fzamiast ++$f, zamienić argumenty wokół <i +operatorów; wyciśnij modyfikację $Tdo 32+$T;
  • nazwy zmiennych ( $Ti $f) są pierwszymi literami na wyjściu;
  • Próbowałem zainicjować $Tz 4albo 11ale wyniki były gorsze; zaczynając od 4tworzy $pierwszy znak na wyjściu; jest najczęściej używanym znakiem w kodzie źródłowym PHP; 11stawia +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 52jako najlepszy krok) można znaleźć na github .


2

Fourier, 1236

Zasadniczo konwersja mojego programu BBCB

32~N127(Na^^~N{128}{33~N}N)

Wydajność

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

0

AWK , 49 bajtów, wynik: 1755

BEGIN{for(f=82;++f<178;)printf"%c",(2*f-1)%95+32}

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.