Перероблення 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>

Таблиця лідерів

Дякуємо цій публікації за код лідерів!


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
Люблячий фрагмент перевірки.
mınxomaτ

2
Чи можете ви пояснити коротко, як обчислюється бал, щоб ми знали, як оптимізувати наші відповіді?
Фаталізувати

@Fatalize В основному ідея полягає в тому, щоб написати програму, вихід якої призначає низькі значення символам, які вона використовує, поставивши їх до початку виведеного рядка. "Значення" кожного символу ASCII визначається його індексом на основі 1 у вихідному коді. Замість того, щоб рахувати кожного символу у вашому джерелі як 1, як код-гольф, кожен символ у вашому джерелі рахується як його значення, як описано вище.
jrich

4
Це здається гарним часом для використання Whitespace у конкурсі програмування ...
C0deH4cker

3
@ C0deH4cker На жаль, для цього знадобляться вкладки, на яких не можна друкувати символи ASCII або нові рядки, тому це буде недійсним.
jrich

Відповіді:


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.
орл

1
У CJam також немає вбудованого символу ASCII. Я використовую одинарний діапазон, а потім відкидаю контрольні символи.
Денніс

14

Brainfuck, 1692 826 765

(Досі) Неоптимізований, я знаю. Я над цим працюю (залиште опції в коментарях).

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

Вихід:

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

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


2
Я отримав 576 з дуже наївною програмою. Не соромтеся змішувати і відповідати моїй ідеї. +1.
Рівень Рівер Сент

12

Піта, 173 170

Код

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

Вихідні дані

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

Жорстке кодування рядка, подібного до квінта. Зручно, що "символ знаходиться близько до початку створеного рядка. Друкує навіть незвичайні символи після "quine".

Велика подяка Деннісу за те, що він заощадив 3 бали та зробив код паліндомом!

Спробуйте тут


Як побічна примітка, я не думаю, що Pyth's rповинні повертати список рядків при використанні в цьому режимі.
FryAmTheEggman

1
Використання \~для діапазону символів покращує вашу оцінку на 3 бали. (Це також дозволяє зробити свій код паліндром.)
Денніс

@Dennis Дякую! Мені знадобилося занадто багато часу, щоб зрозуміти, що я міг просто записати ~частину "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|~

Редагувати: спочатку неправильно зрозуміли бали. Після перегортання його спочатку непарно, а потім навіть, це набагато краще.


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 до 95, ми можемо проїхати символи. Оскільки С містить багато малих символів, я сподівався, що це, крім того, що буде коротшим, матиме нижчу оцінку, але, на жаль, це не так.


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}бали 1472, я думаю
кричуще костене

@squeamishossifrage добре помічений, це дійсно! Скільки часу знадобилося, щоб знайти його? Мені набридло С, моя відповідь на голову набагато краща.
Рівень річки Св

Просто нудлінг навколо з 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 коефіцієнтів. Якщо хтось хоче пояснення, я б хотів.

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

801 -> 797 : нещодавні зміни видаляли зайві пробіли, які були реліквією g.

797 -> 724 : Я обчислював обчислення 126 кожного разу, щоб просто прочитати тильду, використовуючи "~". це також дозволило скоротити пробіл (і я знову б'ю один із відповідей BF)

724 -> 699 : Подібно до останньої зміни, "" - це надзвичайно дешевий (4 бали) спосіб отримання 32

699 -> 627 : Оскільки я проходжу лише один раз через 2-й рядок, я просто змінив його на встановлення 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/,*(&$" #!%')

6

Рубін 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 не повинен бути стандартною лазівкою, тим більше, що це різко знижує портативність). Переміщує (більшу частину) байти у власному вихідному коді та переміщує решту, потім об'єднує і об'єднує масиви. Використовується випадкове зібране насіння, щоб результат був законним (той факт, що це одна цифра - це чиста удача).


1
Цікаве рішення! Я класифікую це як легальне, тому що воно завжди буде отримувати однаковий результат (якщо я правильно зрозумів) з одним і тим же насінням. Крім того, мати різноманітність різних підходів завжди цікавіше.
jrich

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

The < /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)

5

Матлаб, 763

Звичайно, перемогти рішення Octave в MATLAB зовсім неможливо, оскільки "в діапазоні ASCII немає «раннього». Однак я вирішив трохи творчо і подумав зловживати randperm. Я визнаю, що це трохи хакіт, і деякі можуть вважати це обманом, але я думаю, що це приємний штрих. По-перше, програма та вихід:

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

Вихід:

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

Для обчислення відповідного насіння я використав наступну програму, яку я запускав до насіння = 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 ....;)


Я думаю, що це відмінне рішення. Однак ['' 32: 2: 126 33: 2: 125] (з одинарними цитатами) дійсний і коротший на 728 балів :-)
Йорген

@ Jørgen Я знаю, але хотів спробувати інший підхід;). Я думаю, це дало б більш цікаві результати, якби randpermне така довга назва функції.
Санчіз

4

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

Насправді не є оптимальним взагалі, але він фактично переосмислює символи (а не просто роздруковує набір модифікованих символів).

Безголівки:

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|~

Він наказує символів, використовуючи той самий метод , що і відповідь Геобітса , і робить щось подібне до цієї відповіді для зміни знаків.


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

Перл, 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..125досягнете рахунку 799.
Денніс

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+ 

Чи потрібна 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...є правдоподібними.
jrich

@UndefinedFunction Нічого собі, як я про це не подумав! Ви тільки що поголили 56 балів з моїх найкращих, довівши це до 2144 зараз: D Все ж намагаюся отримати його нижче 2000, хоча ...
Mwr247

Легке вдосконалення: використовуйте нові рядки замість крапки з комою для роздільних операцій.
Нові рядки

3

Пітон 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 .


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. Я намагався друкувати у зворотному порядку, але це значно збільшило бал. Інші шаблони можливі, просто змінивши множник і критерій циклу.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.