Вызов
Напишите программу, которая переупорядочивает символы 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>
Ответы:
CJam,
356186168131126111999694Попробуйте онлайн в интерпретаторе CJam .
Выход
идея
Используя разновидность метода, обычного в CJam-кинах, мы сортируем печатаемые символы ASCII по тому, появляются ли они в исходном коде, а не появившиеся - с двумя исключениями - по битам четности их кодовых точек.
При правильном расположении исходного кода нам также удается отсортировать символы исходного кода - за одним исключением - по их частоте.
Особое внимание следует уделить тому, чтобы два соседних символа не появлялись один за другим впервые в исходном коде, так как это могло бы сделать ответ недействительным.
Код
источник
Brainfuck,
1692826765(Все еще) Неоптимизированный, я знаю. Я работаю над этим (оставьте опции в комментариях).
Выход:
Я уже использую переполнение для 8-битных ячеек в некоторой степени, но я думаю, что вы все еще можете оптимизировать его. Хотя это уменьшило бы использование дешевых символов :).
источник
Пиф,
173170Код
Выход
Жесткое кодирование строки, похожей на квин. Удобно, что
"
символ находится очень близко к началу сгенерированной строки. Печатает даже тогда нечетные символы после «quine».Большое спасибо Деннису за то, что он сэкономил 3 балла и сделал код палиндомом!
Попробуй здесь
источник
r
должен возвращать список строк при использовании в этом режиме.\~
для диапазона символов улучшает ваш счет на 3 балла. (Это также позволяет сделать ваш код палиндромом.)~
часть «quine» вместо того, чтобы как-то добавить ее в диапазон ...: dЯва,
3518 31892692Простой цикл, который печатает четные символы, а затем шансы. Я попробовал несколько вещей, чтобы оптимизировать более ранние ASCII, но большинство закончилось тем, что оно увеличилось в целом и получило более высокий балл.
Выход:
Изменить: сначала неправильно понял выигрыш. После того, как он сначала переключился на нечетное, а затем четное, он стал намного лучше.
источник
Октава, 628
Код
Выход:
Два диапазона неявно преобразуются в строку. Не уверен, что возвращение как Ans приемлемо, также выдает предупреждение о неявном преобразовании. Пробовал некоторые другие векторы диапазона, но не мог найти ничего более эффективного.
источник
C, 42 байта, оценка 1539
C 39 байт, оценка 1687
В обоих случаях
i
инициализируется количество строк в командной строке (поскольку аргументы не приводятся, это 1.)Первая версия делает вещи очевидным образом, увеличивая на 2, беря по модулю 95 и, прежде всего, печатая все коэффициенты, а затем все четные.
Вторая версия использует тот факт, что putchar возвращает напечатанный символ. Поскольку 32 взаимно простое с 95, мы можем циклически проходить через символы. Поскольку C содержит много строчных символов, я надеялся, что это, помимо того, что оно будет короче, будет иметь меньшую оценку, но, к сожалению, это не так.
источник
i;main(){for(;i<3990;i+=42)putchar(i%95+32);}
счет 1472, я думаюa
качестве имени переменной, а неi
в обоих случаях.Befunge-93,
801797724699627612Код:
Выход:
Вы можете попробовать это здесь, если хотите.
Он работает, выводя 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 : сдвинули столько, сколько я мог, для ввода строки. Я почти уверен, что дизайн должен был бы кардинально измениться, чтобы дальше играть в гольф.
Вероятно, это последняя итерация, если только один из языков, не относящихся к гольфу, не получит более низкое решение.
источник
Хаскелл, 830
Оценивает строку:
Вдохновленный ответом @ Jørgen и совершенно не похожий на мой .
источник
Brainfuck, оценка
576667Подумав об этом, 576 показалось мне хорошим, чтобы быть правдой: я сделал небольшую оценку и определил, что мой результат составляет около 95 * 6 + 45 * 2 = 660. Что-то должно было пойти не так, когда я в первый раз запустил валидатор. Правильный результат ближе к моей оценке. Это все еще не плохой счет.
Будь проще.
В основном просто идет вверх и вниз набор ASCII, печатая символы. Три символа, используемые в программе, печатаются первыми. Оборачиваться с обоих концов было немного сложно.
источник
Ruby 2.2, 1157
Выход:
Это довольно глупое решение (и я не уверен, что srand не должен быть стандартной лазейкой, тем более что это значительно снижает мобильность). Перемешивает (большую часть) байты в своем собственном исходном коде, перемешивает остальные, затем объединяет и объединяет массивы. Используется случайное начальное число, выбранное таким образом, чтобы вывод был законным (тот факт, что это одна цифра, является чистой удачей).
источник
CBM BASIC V2, 2553
вывод (преобразованный в ASCII с помощью скрипта Python на ПК):
источник
gawk,
278219881821Выход
использование
Скопируйте и вставьте следующее в вашу консоль
(mawk не будет работать, потому что он
слишком строгс printf)Символ
< /dev/null
конца указывает на конец ввода, поэтому будет выполнен блок END.Я в основном переплетал персонажей, идущих снизу и сверху. Затем я проанализировал, какие символы использовались чаще всего в программе, и распечатал их сначала в порядке частоты. Затем я должен был убедиться, что ни один символ не будет напечатан более одного раза. Переплетение в противоположных направлениях увеличило вероятность того, что уже использованный символ не приведет к печати соседей. Но они встретились посередине в
P
, так что мне пришлось печатать это тоже в начале. Потом были некоторые проблемы с символами, которые используются в регулярных выражениях ... Затем я дешево переименовал переменные и сделал все заново. Затем я нашел несколько символов, которые мог заменить в своей программе, и сделал все заново. И так далее ... Я, наконец, немного подправил строку предпочтительными символами, протестировав.Я думаю, что я сделал
:D
Во время процесса я никогда не выполнял программу из командной строки, но создал строку, которую выполнил из скрипта, которая проанализировала бы вывод на предмет корректности и дала бы мне оценку и прочее. Этот результат очень помог. Конечно, я перепроверил здесь (вы никогда не знаете), но это дало мне тот же результат.
Там программа выглядит так
источник
Матлаб, 763
Конечно, в MATLAB невозможно превзойти решение Octave, поскольку в нем нет
"
«раннего» диапазона ASCII. Тем не менее, я решил стать немного творческим и решил злоупотреблятьrandperm
. Я признаю, что это немного глупо, и некоторые могут подумать, что это обман, но я думаю, что это приятное прикосновение. Сначала программа и вывод:Ouput:
Для расчета подходящего семени я использовал следующую программу, которую я запускал до тех пор, пока seed = 4648029 (то есть, пока не были сделаны блюда)
Возможно, один из способов улучшить программу - это опробовать семена с плавающей запятой, например, 2.3e4 увеличит количество семян без увеличения длины семян. Если кому-то хочется создать программу для вычисления всех n-символьных чисел, представляемых Matlab ....;)
источник
randperm
не было такого длинного имени функции.Хаскелл,
16601376Определяет функцию,
a
которая возвращает строку:источник
Ява, 15470
На самом деле не совсем оптимально, но фактически переопределяет символы (а не просто распечатывает набор измененных символов).
Ungolfed:
Выход
Он упорядочивает символы, используя тот же метод, что и ответ Geobits , и выполняет что-то похожее на этот ответ, чтобы изменить символы.
источник
BBC BASIC, 2554
Код
Выход
источник
Фортран 90,
152315191171Это вложенный цикл вывода, похожий на другие ответы. Не слишком уверен, что много улучшений возможно ...
Выход:
Изменить: Забыл, что Fortran 90 необходим для этого кода, 77 требует кода для запуска в 7-м столбце. С другой стороны, язык нечувствителен к регистру, что позволяет легко его улучшить. Счетчики циклов
J
иL
потому, что это первые две буквы в выходной строке, неявно объявленные Fortran как целые числа.источник
Perl,
1089922Оказывается, что печать значений ASCII с шагом
4258 дает наименьшую оценку при таком подходе:Выход:
источник
print chr$_*42%95+32for 0..94
уже набирает 925 баллов, а 42, скорее всего, больше не является оптимальным.print chr$_*63%95+32for 31..125
799 баллов.JavaScript,
31692548214421042071188518761872Код
Выход
источник
v+
частью(v,i)=>v+i*3%95+32
необходимости? Мне кажется, что он просто добавляется0
каждый раз, так как массив заполнен0
s ....for(w=95;w-->0;)
может бытьfor(w=95;w--;)
, потому что0
это фальшивка и1, 2, 3...
правдива.Python 2,
72 байта (3188),116 байтов(1383)(1306)(1303)спасибо @FryAmTheEggman за трюк соединения;)
спасибо @nim (я неправильно прочитал текст?: P)
спасибо @Mathias Ettinger
выход:
источник
a=map(chr,range(32,172))
и"".join(a[::2]+a[1::2])
;
новые строки, которые считаются 1n='nr i(a…
вместоn=' nri(a…
PHP,
12171081Код:
Поскольку переменные не инициализированы, необходимо подавить уведомления о запуске (PHP жалуется, но продолжает выполнение и использует значение по умолчанию, соответствующее контексту;
0
в данном случае):Его вывод:
Примечания:
chr(32)
);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 .источник
Фурье, 1236
В основном преобразование моей программы BBCB
Выход
источник
AWK , 49 байт, оценка: 1755
Попробуйте онлайн!
Просто печатает каждый другой символ, а затем начинает заполнять пробелы. Первый напечатанный символ -
f
. Я пытался печатать в обратном порядке, но это значительно увеличило счет. Другие шаблоны возможны путем простого изменения множителя и критериев цикла.источник
Perl 5 , 1069
Попробуйте онлайн!
источник