Переназначение ASCII

36

Вызов

Напишите программу, которая переупорядочивает символы ASCII!

Он должен вывести единственную строку, содержащую все печатные символы ASCII ровно один раз. Первому символу этой строки присваивается значение 1, второму символу - значение 2 и т. Д.

Если два символа обычно находятся рядом друг с другом (разница между их кодами символов равна 1), они могут не отображаться рядом друг с другом в выходных данных.

счет

Ваша оценка будет суммой значений для всех символов в вашем исходном коде, как диктуется выводом вашей программы.

Пожалуйста, смотрите раздел Подтверждение, чтобы рассчитать ваш счет.

Самый низкий балл побеждает!

правила

  • «Печатный ASCII» определен для обозначения кодов символов 32 - 126 включительно.

  • Вы можете написать полную программу или функцию.

  • Ваш код может содержать только печатные символы ASCII и символы новой строки.

  • Ваша программа может не принимать никаких данных.

  • Символы новой строки всегда будут иметь значение 1. Вывод вашей программы не должен включать перевод строки.

верификация

Используйте этот фрагмент стека, чтобы убедиться, что вывод вашего кода действителен, и рассчитать оценку кода!


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>

Leaderboard

Спасибо за этот пост за код лидеров!


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>

jrich
источник
12
Люблю проверочный фрагмент.
mynxomaτ
2
Не могли бы вы кратко объяснить, как рассчитывается оценка, чтобы мы знали, как оптимизировать наши ответы?
Роковой
@Fatalize По сути, идея состоит в том, чтобы написать программу, чей вывод назначает низкие значения используемым символам, помещая их в начало выводимой строки. «Значение» каждого символа ASCII определяется его основанным на 1 индексом в выводе вашего кода. Вместо того, чтобы считать каждого персонажа в вашем источнике как 1, как код-гольф, каждый персонаж в вашем источнике считается как его значение, как описано выше.
jrich
4
Похоже, это хорошее время для использования Whitespace в конкурсе по программированию ...
C0deH4cker,
3
@ C0deH4cker К сожалению, для этого потребуются вкладки, которые не являются печатными символами ASCII или символами новой строки, поэтому они будут недействительными.
января

Ответы:

21

CJam, 356 186 168 131 126 111 99 96 94

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

Попробуйте онлайн в интерпретаторе CJam .

Выход

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

идея

Используя разновидность метода, обычного в CJam-кинах, мы сортируем печатаемые символы ASCII по тому, появляются ли они в исходном коде, а не появившиеся - с двумя исключениями - по битам четности их кодовых точек.

При правильном расположении исходного кода нам также удается отсортировать символы исходного кода - за одним исключением - по их частоте.

Особое внимание следует уделить тому, чтобы два соседних символа не появлялись один за другим впервые в исходном коде, так как это могло бы сделать ответ недействительным.

Код

"             "_~  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.
Деннис
источник
Не удивлюсь, если CJam выиграет это, у Pyth нет встроенных простых кавычек и символов ASCII.
orlp
1
CJam также не имеет встроенных символов ASCII. Я использую одинарный диапазон, затем отбрасываю управляющие символы.
Деннис
14

Brainfuck, 1692 826 765

(Все еще) Неоптимизированный, я знаю. Я работаю над этим (оставьте опции в комментариях).

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

Выход:

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

Я уже использую переполнение для 8-битных ячеек в некоторой степени, но я думаю, что вы все еще можете оптимизировать его. Хотя это уменьшило бы использование дешевых символов :).

mınxomaτ
источник
2
Я получил 576 с очень наивной программой. Не стесняйтесь смешивать и сочетать мою идею. +1.
Уровень Река
12

Пиф, 173 170

Код

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

Выход

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

Жесткое кодирование строки, похожей на квин. Удобно, что "символ находится очень близко к началу сгенерированной строки. Печатает даже тогда нечетные символы после «quine».

Большое спасибо Деннису за то, что он сэкономил 3 балла и сделал код палиндомом!

Попробуй здесь

FryAmTheEggman
источник
Как примечание, я не думаю, что Pyth rдолжен возвращать список строк при использовании в этом режиме.
FryAmTheEggman,
1
Использование \~для диапазона символов улучшает ваш счет на 3 балла. (Это также позволяет сделать ваш код палиндромом.)
Деннис
@ Деннис Спасибо! Мне потребовалось слишком много времени, чтобы понять, что я могу просто записать ~часть «quine» вместо того, чтобы как-то добавить ее в диапазон ...: d
FryAmTheEggman
10

Ява, 3518 3189 2692

Простой цикл, который печатает четные символы, а затем шансы. Я попробовал несколько вещей, чтобы оптимизировать более ранние ASCII, но большинство закончилось тем, что оно увеличилось в целом и получило более высокий балл.

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

Выход:

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

Изменить: сначала неправильно понял выигрыш. После того, как он сначала переключился на нечетное, а затем четное, он стал намного лучше.

Geobits
источник
10

Октава, 628

Код

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

Выход:

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

Два диапазона неявно преобразуются в строку. Не уверен, что возвращение как Ans приемлемо, также выдает предупреждение о неявном преобразовании. Пробовал некоторые другие векторы диапазона, но не мог найти ничего более эффективного.

Йорген
источник
Возвращение ответа приемлемо, хорошая работа!
jrich
8

C, 42 байта, оценка 1539

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

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

C 39 байт, оценка 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;[{<\|=]}>^~?_ @`

В обоих случаях iинициализируется количество строк в командной строке (поскольку аргументы не приводятся, это 1.)

Первая версия делает вещи очевидным образом, увеличивая на 2, беря по модулю 95 и, прежде всего, печатая все коэффициенты, а затем все четные.

Вторая версия использует тот факт, что putchar возвращает напечатанный символ. Поскольку 32 взаимно простое с 95, мы можем циклически проходить через символы. Поскольку C содержит много строчных символов, я надеялся, что это, помимо того, что оно будет короче, будет иметь меньшую оценку, но, к сожалению, это не так.

Уровень реки St
источник
i;main(){for(;i<3990;i+=42)putchar(i%95+32);}счет 1472, я думаю
брезгливый оссифраж
@squeamishossifrage хорошо заметили, это действительно так! Сколько времени понадобилось, чтобы найти этот? Я устал от C, мой ответ на этот вопрос намного лучше.
Уровень Река St
Просто копаясь в сценарии Perl, который я использовал для генерации этого ответа :-)
брезгливое оссифражирование
Вы можете понизить свой счет, используя в aкачестве имени переменной, а не iв обоих случаях.
409_конфликт
8

Befunge-93, 801 797 724 699 627 612

Код:

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

Выход:

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

Вы можете попробовать это здесь, если хотите.

Он работает, выводя 32-126 четных, а затем 33-125 шансов. Если кто-то хочет объяснений, я был бы готов.

Я играл в гольф до тех пор, пока не стал лучше, чем брейнфот ***, который я считал самым низким из возможных. Что касается стратегии игры в гольф, я генерировал персонажей ascii, а затем пытался заменить дорогих персонажей более дешевыми (например, 1 на 2). Я узнал, поскольку это gбыло так дорого, лучше вычислять 126 на каждую итерацию. Я также обернул вокруг вершины, так как ^был дешевле, чем v.

801 -> 797 : недавнее изменение удалило лишние пробелы, которые были реликтовыми от использования g.

797 -> 724 : я менял вычисление 126 каждый раз, чтобы просто читать тильду, используя "~". это также позволило убрать пробелы (и я снова бью один из ответов BF)

724 -> 699 : аналогично последнему изменению, "" - чрезвычайно дешевый (4 балла) способ получения 32

699 -> 627 : Поскольку я проходил второй проход только один раз, я просто изменил его на настройку 33 вместо сохранения другого значения в стеке и добавления одного.

627 -> 612 : сдвинули столько, сколько я мог, для ввода строки. Я почти уверен, что дизайн должен был бы кардинально измениться, чтобы дальше играть в гольф.

Вероятно, это последняя итерация, если только один из языков, не относящихся к гольфу, не получит более низкое решение.

Кевин В.
источник
7

Хаскелл, 830

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

Оценивает строку:

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

Вдохновленный ответом @ Jørgen и совершенно не похожий на мой .

Ними
источник
7

Brainfuck, оценка 576 667

Подумав об этом, 576 показалось мне хорошим, чтобы быть правдой: я сделал небольшую оценку и определил, что мой результат составляет около 95 * 6 + 45 * 2 = 660. Что-то должно было пойти не так, когда я в первый раз запустил валидатор. Правильный результат ближе к моей оценке. Это все еще не плохой счет.

+++++++++++++++++++++++++++++++++++++++++++++.--.+++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.---.++.----.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.---.--.--.--.--.--.--.+++.--.++++.++.++.

Будь проще.

В основном просто идет вверх и вниз набор ASCII, печатая символы. Три символа, используемые в программе, печатаются первыми. Оборачиваться с обоих концов было немного сложно.

-+.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~{}ywusqomkigeca_][YWUSQOMKIGECA?=;97531/,*(&$" #!%')
Уровень реки St
источник
6

Ruby 2.2, 1157

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

Выход:

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

Это довольно глупое решение (и я не уверен, что srand не должен быть стандартной лазейкой, тем более что это значительно снижает мобильность). Перемешивает (большую часть) байты в своем собственном исходном коде, перемешивает остальные, затем объединяет и объединяет массивы. Используется случайное начальное число, выбранное таким образом, чтобы вывод был законным (тот факт, что это одна цифра, является чистой удачей).

histocrat
источник
1
Интересное решение! Я классифицирую это как легальное, потому что оно всегда будет давать один и тот же результат (если я правильно понял) при одинаковом начальном значении. Кроме того, наличие различных подходов всегда более интересно.
3
5

CBM BASIC V2, 2553

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

вывод (преобразованный в ASCII с помощью скрипта Python на ПК):

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

Выход

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

использование

Скопируйте и вставьте следующее в вашу консоль
(mawk не будет работать, потому что он слишком строг с 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

Символ < /dev/nullконца указывает на конец ввода, поэтому будет выполнен блок END.

Я в основном переплетал персонажей, идущих снизу и сверху. Затем я проанализировал, какие символы использовались чаще всего в программе, и распечатал их сначала в порядке частоты. Затем я должен был убедиться, что ни один символ не будет напечатан более одного раза. Переплетение в противоположных направлениях увеличило вероятность того, что уже использованный символ не приведет к печати соседей. Но они встретились посередине в P, так что мне пришлось печатать это тоже в начале. Потом были некоторые проблемы с символами, которые используются в регулярных выражениях ... Затем я дешево переименовал переменные и сделал все заново. Затем я нашел несколько символов, которые мог заменить в своей программе, и сделал все заново. И так далее ... Я, наконец, немного подправил строку предпочтительными символами, протестировав.

Я думаю, что я сделал :D

Во время процесса я никогда не выполнял программу из командной строки, но создал строку, которую выполнил из скрипта, которая проанализировала бы вывод на предмет корректности и дала бы мне оценку и прочее. Этот результат очень помог. Конечно, я перепроверил здесь (вы никогда не знаете), но это дало мне тот же результат.

Там программа выглядит так

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)
Cabbie407
источник
5

Матлаб, 763

Конечно, в MATLAB невозможно превзойти решение Octave, поскольку в нем нет "«раннего» диапазона ASCII. Тем не менее, я решил стать немного творческим и решил злоупотреблять randperm. Я признаю, что это немного глупо, и некоторые могут подумать, что это обман, но я думаю, что это приятное прикосновение. Сначала программа и вывод:

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

Для расчета подходящего семени я использовал следующую программу, которую я запускал до тех пор, пока seed = 4648029 (то есть, пока не были сделаны блюда)

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

Возможно, один из способов улучшить программу - это опробовать семена с плавающей запятой, например, 2.3e4 увеличит количество семян без увеличения длины семян. Если кому-то хочется создать программу для вычисления всех n-символьных чисел, представляемых Matlab ....;)

Sanchises
источник
Я думаю, что это отличное решение. Тем не менее, ['' 32: 2: 126 33: 2: 125] (с одинарными кавычками) является действительным и короче на 728 баллов :-)
Йорген
@ Йорген Я знаю, но я хотел попробовать другой подход;). Я думаю, это дало бы более интересные результаты, если бы randpermне было такого длинного имени функции.
Санчиз
4

Хаскелл, 1660 1376

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

Определяет функцию, aкоторая возвращает строку:

 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

Ява, 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);}}

На самом деле не совсем оптимально, но фактически переопределяет символы (а не просто распечатывает набор измененных символов).

Ungolfed:

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

Выход

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

Он упорядочивает символы, используя тот же метод, что и ответ Geobits , и выполняет что-то похожее на этот ответ, чтобы изменить символы.

Pokechu22
источник
3

BBC BASIC, 2554

Код

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

Выход

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Бета распад
источник
3

Фортран 90, 1523 1519 1171

Это вложенный цикл вывода, похожий на другие ответы. Не слишком уверен, что много улучшений возможно ...

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

Выход:

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

Изменить: Забыл, что Fortran 90 необходим для этого кода, 77 требует кода для запуска в 7-м столбце. С другой стороны, язык нечувствителен к регистру, что позволяет легко его улучшить. Счетчики циклов Jи Lпотому, что это первые две буквы в выходной строке, неявно объявленные Fortran как целые числа.

сигма
источник
3

Perl, 1089 922

Оказывается, что печать значений ASCII с шагом 42 58 дает наименьшую оценку при таком подходе:

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

Выход:

 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..94уже набирает 925 баллов, а 42, скорее всего, больше не является оптимальным.
Деннис
Спасибо @Dennis - я понятия не имел, что вы могли бы написать циклы таким образом.
брезгливое оссифраж
Если вы замените пробелы переводом строки, получите print chr$_*63%95+32for 31..125799 баллов.
Деннис
3

JavaScript, 3169 2548 2144 2104 2071 1885 1876 1872

Код

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

Выход

ti^SH=2'{peZOD9.#wlaVK@5*~sh]RG<1&zodYNC8-"vk`UJ?4)}rg\QF;0%yncXMB7,!uj_TI>3(|qf[PE:/$xmbWLA6+ 
Mwr247
источник
Является ли v+частью (v,i)=>v+i*3%95+32необходимости? Мне кажется, что он просто добавляется 0каждый раз, так как массив заполнен 0s ....
jrich
@ UndefinedFunction Кажется, нет. Не слишком сосредоточился на оптимизации, так как я работал над альтернативным методом, который все равно оказался короче. Благодарность! =)
Mwr247
for(w=95;w-->0;)может быть for(w=95;w--;), потому что 0это фальшивка и 1, 2, 3...правдива.
января
@ Неопределенная функция Ух ты, как я об этом не подумала! Вы только что сбили 56 очков из моих лучших, доведя их до 2144 теперь: D Все еще пытаясь получить это ниже 2000, хотя ...
Mwr247
Легкое улучшение: используйте новые строки вместо точек с запятой для разделения операторов. Новые строки считаются за 1.
15:09
3

Python 2, 72 байта (3188), 116 байтов (1383) (1306) (1303)

спасибо @FryAmTheEggman за трюк соединения;)

спасибо @nim (я неправильно прочитал текст?: P)

спасибо @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])

выход:

 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))и"".join(a[::2]+a[1::2])
FryAmTheEggman
1
Я думаю, что вы можете заменить некоторые из них на ;новые строки, которые считаются 1
nimi
1
Вы можете получить 3 очка, начав n='nr i(a…вместоn=' nri(a…
409_Conflict
3

PHP, 1217 1081

Код:

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

Поскольку переменные не инициализированы, необходимо подавить уведомления о запуске (PHP жалуется, но продолжает выполнение и использует значение по умолчанию, соответствующее контексту; 0в данном случае):

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

Его вывод:

 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

Примечания:

  • вывод начинается с пробела ( chr(32));
  • код печатает пробел, затем каждый 52-й символ, охватывая диапазон;
  • магическое число 52было «обнаружено» путем поиска во всем диапазоне (1..94) возможных смещений; 1 создает список печатных символов в порядке возрастания их кодов ASCII, 94 создает список в обратном порядке, оба являются плохими; кратные 5 и 19 (делители 95) производят короткие циклы и не охватывают весь диапазон значений (также плохо);
  • 52кажется волшебством; это лучшее смещение для этого кода; но он также является лучшим для некоторых вариантов кода (которые дают несколько большие оценки); вариации я пытался: использование while()вместо того for(), использование $f++, $f--или --$fвместо того ++$f, поменять местами операнды вокруг <и +операторов; сожмите модификацию $Tв 32+$T;
  • имена переменных ( $Tи $f) являются первыми буквами из выходных данных;
  • Я пытался инициализировать $Tс 4или, 11но оценки были хуже; начиная с 4делает $первый символ в выводе; это наиболее часто используемый символ в исходном коде PHP; 11приносит +впереди; $и +наиболее часто используемые символы в этом коде.

Код, тесты, инкрементные изменения, которые я пробовал, пока 52не нашел это решение, и скрипт, который тестировал все возможные значения шага (авторитетный поставщик как лучший шаг), можно найти на github .

axiac
источник
2

Фурье, 1236

В основном преобразование моей программы BBCB

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

Выход

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Бета распад
источник
0

AWK , 49 байт, оценка: 1755

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

Попробуйте онлайн!

Просто печатает каждый другой символ, а затем начинает заполнять пробелы. Первый напечатанный символ - f. Я пытался печатать в обратном порядке, но это значительно увеличило счет. Другие шаблоны возможны путем простого изменения множителя и критериев цикла.

Роберт Бенсон
источник