Tekrar ASCII


36

Meydan okuma

ASCII karakterlerini yeniden düzenleyen bir program yazın!

Yazdırılabilir ASCII karakterlerinin tümünü bir kez içeren tek bir dizge çıkarmalıdır. Bu dizenin ilk karakterine 1, ikinci karaktere 2 ve benzerleri atanır.

İki karakter normalde yan yana ise (karakter kodları arasındaki fark 1'dir), çıktıda yan yana görünmeyebilirler.

puanlama

Puanınız, programınızın çıktısının belirttiği şekilde, kaynak kodunuzdaki tüm karakterlerin değerlerinin toplamı olacaktır.

Puanınızı hesaplamak için lütfen Doğrulama bölümüne bakın.

En düşük puan kazanır!

kurallar

  • "Yazdırılabilir ASCII", 32 - 126 karakter kodları dahil olmak üzere tanımlanmıştır.

  • Tam bir program veya bir fonksiyon yazabilirsiniz.

  • Kodunuz yalnızca yazdırılabilir ASCII karakterleri ve yeni satırlar içerebilir.

  • Programınız herhangi bir giriş yapamaz.

  • Newlines her zaman 1 değerine sahip olacaktır. Programınızın çıktısı yeni bir satır içermemelidir.

Doğrulama

Kodunuzun çıktısının geçerli olduğunu doğrulamak ve kodunuzun puanını hesaplamak için bu yığın pasajını kullanın!


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>

Liderler Sıralaması

Büyük afiş için bu yazıya teşekkürler !


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
Doğrulama snippet'ini sevmek.
mınxomaτ

2
Skorun nasıl hesaplandığını kısaca açıklayabilir misiniz, bu yüzden cevaplarımızı nasıl optimize edeceğimizi biliyoruz?
15'te

@Fatalize Temel olarak fikir, çıktısını, çıkarılan dizenin başına doğru koyarak, kullandığı karakterlere düşük değerler veren bir program yazmaktır. Her ASCII karakterinin "değeri", kodunuzun çıktısındaki 1 tabanlı dizini ile belirlenir. Kaynağınızdaki her karakteri kod golf gibi 1 olarak saymak yerine, kaynağınızdaki her karakter yukarıda açıklandığı gibi değeri olarak sayılır.
jrich

4
Whitespace'i bir programlama yarışmasında kullanmak için iyi bir zaman gibi görünüyor ...
C0deH4cker 14:15

3
@ C0deH4cker Maalesef bu, yazdırılabilir ASCII karakterleri veya yeni satırları olmayan sekmeler gerektirecek ve geçersiz sayılacak.
Jrich,

Yanıtlar:


21

CJam, 356 186 168 131 126 111 99 96 94

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

CJam tercümanında çevrimiçi olarak deneyin .

Çıktı

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

Fikir

CJam testlerinde sıkça kullanılan bir teknik varyasyonu kullanarak, yazdırılabilir ASCII karakterlerini kaynak kodunda ve görünmeyen karakterlerde, iki istisna dışında kod noktalarının eşlik bitlerine göre sıralarız.

Uygun kaynak düzeniyle, kaynak kod karakterlerini - bir istisna dışında - sıklıklarına göre sıralamayı başarırız.

Kaynak kodda ilk olarak iki bitişik karakterin arka arkaya görünmemesine özellikle dikkat edilmelidir, çünkü bu cevabı geçersiz kılar.

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.

CJam’ın bunu kazandığını görmek şaşırtıcı olmazdı, Pyth’in basit sorguları ya da yerleşik ASCII karakterleri yok.
orlp

1
CJam da ASCII karakterleri için yerleşik bir seçeneğe sahip değildir. Unary aralık kullanıyorum, sonra kontrol karakterlerini atıyorum.
Dennis,

14

Brainfuck, 1692 826 765

(Hala) En iyi duruma getirilmemiş, biliyorum. Üzerinde çalışıyorum (yorumlarda opti).

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

Çıktı:

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

Zaten bir dereceye kadar 8bit hücrelerde taşma kullanıyorum, ancak hala optimize edebilirsiniz. Buna rağmen ucuz karakterlerin kullanımını azaltacaktır :).


2
Çok saf bir programla 576 aldım. Benim fikrim karıştırmak ve eşleştirmek için çekinmeyin. +1.
Seviye Nehri St

12

Pyth, 173 170

kod

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

Çıktı

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

Keki benzeri bir dizgenin kodlaması. Uygun şekilde, "karakter oluşturulan dizgenin başlangıcına çok yakındır. "Quine" den sonra tek karakterleri bile basar.

Dennis'e 3 puan kazandırdığı ve kodu palindome yapan çok teşekkürler!

Burada dene


Yan not olarak, Pyth’lerin rbu modda kullanıldığında bir dizge listesi döndürmesi gerektiğini düşünmüyorum .
FryAmTheEggman 14:15

1
\~Karakter aralığı için kullanmak , puanınızı 3 puan artırır. (Ayrıca, kodunuzu bir palindrome yapmanızı sağlar.)
Dennis

@Dennis Teşekkürler! Bu ~aralığa bir şekilde eklemek zorunda kalmak yerine "quine" kısmına yazabildiğimi anlamak çok uzun sürdü ...: d
FryAmTheEggman 14:15

10

Java, 3518 3189 2692

Hatta karakterleri basan basit bir döngü, sonra olasılık. Daha önceki ASCII'leri optimize etmek için birkaç şey denedim, fakat çoğu daha uzun sürdü ve daha yüksek bir puan aldı.

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

Çıktı:

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

Düzenleme: İlk önce skorlamayı yanlış anladınız. İlk önce teke çevirdikten sonra , o zaman bile, çok daha iyi puanlar.


10

Octave, 628

kod

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

Çıktı:

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

İki aralık, örtük olarak dizeye dönüştürülür. Ans olarak kabul edilebilir olarak geri döndüğünden emin değiliz, örtük dönüşüm hakkında da bir uyarı verir. Bazı diğer aralık vektörlerini denedim, ancak daha verimli bir şey bulamadık.


Bir cevap iade kabul edilebilir güzel iş!
Jrich,

8

C, 42 bayt, 1539 puanı

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

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

C, 39 bayt, puan 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;[{<\|=]}>^~?_ @`

Her iki durumda da, ikomut satırındaki dizelerin sayısına göre başlatılır (argüman verilmediğinden, bu 1'dir).

İlk sürüm, 2 ile artan, modulo 95 alarak ve önce tüm olasılıkları sonra tüm evensleri yazdıran şeyleri açıkça gösteriyor.

İkinci versiyon, putchar'ın basılan karakteri döndürmesi gerçeğinden faydalanır. 32, 95'e kopya olduğundan, karakterler arasında geçiş yapabiliriz. C bir çok küçük harf içerdiğinden, bunun daha kısa olmasının yanı sıra daha düşük bir puan alacağını umuyordum, fakat maalesef bu böyle değil.


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}puanları 1472, sanırım
squeamish ossifrage

@squeamishossifrage iyi benekli, gerçekten öyle! Bunu bulmak ne kadar sürdü? C’den sıkıldım, beynimin cevabı çok daha iyi.
Level River St

Sadece Perl betiği ile uğraşıyorum Bu cevabı oluşturmak için kullandım :-)
squeamish ossifrage

Her iki durumda da adeğil değişken isim olarak kullanarak puanınızı düşürebilirsiniz i.
409_Conflict

8

Befunge-93, 801 797 724 699 627 612

Kod:

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

Çıktı:

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

İstersen burada deneyebilirsin .

32-126 evens ve sonra 33-125 olasılık yazdırarak çalışır. Biri bir açıklama yapmak isterse istekli olurum.

Beynimden daha iyi olana kadar golf oynamıştım. Golf stratejilerine gelince, ascii karakterleri oluşturdum ve sonra pahalı karakterleri daha ucuz olanlarla değiştirmeye çalıştım (2 ile 1 gibi). gO kadar pahalı olduğunu öğrendim , her yinelemede 126 hesaplamak daha iyiydi. Ben de ^daha ucuz beri üst sarılı v.

801 -> 797 : Son zamanlarda meydana gelen değişiklik, kullanımdan kalan bir kalıntıyı kaldırmaktı g.

797 -> 724 : Her seferinde 126 hesaplamayı sadece tilde kullanarak okuyarak değiştirdim "~". bu aynı zamanda boşlukları da kesmeye izin verdi (ve BF cevaplarından birini tekrar atıyorum)

724 -> 699 : Son değişikliğe benzer şekilde "", 32 elde etmenin son derece ucuz (4 puan) yoludur

699 -> 627 : Sadece 2. sıra geçişinden geçtiğimden, yığında başka bir değer sağlamak ve bir tane eklemek yerine sadece 33 ayarını değiştirdim.

627 -> 612 : Girdiyi dize edebildiğim kadar taşındı. Tasarımın daha fazla golf oynamak için büyük ölçüde değişmesi gerekeceğinden eminim.

Golf dışı dillerden biri daha düşük bir çözüm bulamazsa, bu muhtemelen son yinelemedir.


7

Haskell, 830

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

Dize değerlendirir:

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

@ Jørgen'in cevabından ilham alan ve benden tamamen farklı .


7

Brainfuck, skor 576 667

Bunu düşündüğümde 576 gerçek gibi görünüyordu: Küçük bir tahmin yaptım ve puanımı 95 * 6 + 45 * 2 = 660 civarında buldum. Doğrulayıcıyı ilk çalıştırdığımda bir şeyler yanlış gitmiş olmalı. Doğru puan tahminime daha yakın. Hala kötü bir skor değil.

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

Basit tut.

Temelde ASCII setini yukarı ve aşağı yürür, karakterleri basar. Önce programda kullanılan üç karakter yazdırılır. Her iki uçta da dönüş yapmak biraz zordu.

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

6

Yakut 2.2, 1157

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

Çıktı:

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

Bu oldukça aptal bir çözüm (ve taşınabilirliğin büyük ölçüde azalması nedeniyle srand'ın standart bir boşluk olması gerekmediğinden emin değilim). Baytları kendi kaynak kodunda (çoğu) karıştırır ve geri kalanı karıştırır, ardından dizileri birleştirir ve birleştirir. Çıktının yasal olması için toplanan rastgele bir tohum kullanır (tek bir rakam olduğu gerçeği saf şanstır).


1
İlginç çözüm! Bunu yasal olarak sınıflandıracağım çünkü her zaman aynı tohumu (aynı şeyi doğru anladıysam) aynı çıktıyı üretecek. Ayrıca, çeşitli farklı yaklaşımlara sahip olmak her zaman daha ilginçtir.
Jrich,

5

CBM TEMEL V2, 2553

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

çıktı (ASCII’de pc’de bir python betiği tarafından dönüştürülür):

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

Çıktı

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

kullanım

Aşağıdakileri kopyalayıp konsolunuza yapıştırın
(mawk çalışmayacaktır, çünkü printf ile çok katıdır )

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/nullEND blok yürütülür, böylece sonunda, girdi sonuna işaret eder.

Temelde, alttan gelen ve üstten gelen karakterleri iç içe geçirdim. Sonra hangi karakterlerin programda en çok kullanıldıklarını ve sıklık sırasına göre ilk önce onları yazdırdıklarını analiz ettim. Sonra hiçbir karakterin birden fazla basılmadığından emin olmak zorunda kaldım. Karşıt yönlerde dokuma, kullanılmış bir karakterin baskı komşularına yol açmamasını daha olası kılmıştır. Ama tam ortasında buluştular P, ben de bunu başlangıçta basmak zorunda kaldım. Sonra regexps'de kullanılan karakterlerle ilgili bazı problemler vardı ... Sonra değişkenleri ucuza değiştirdim ve her şeyi tekrar yaptım. Sonra programımda değiştirebileceğim bazı karakterler buldum ve her şeyi tekrar yaptım. Ve böylece .. Sonunda sınamayı, tercih edilen karakterlerle biraz sınama yoluyla değiştirdim.

Sanırım bittim :D

İşlem sırasında, programı komut satırından asla çalıştırmadım, ancak bir betiğin içinden yürüttüğüm bir dizgi yaptım; çıktıyı doğruluk için analiz edip bana puan ve benzeri şeyler verdi. Bu puan çıktısı çok yardımcı oldu. Tabii ki burada tekrar kontrol ettim (asla bilemezsin) ama aynı sonucu aldım.

Orada program böyle görünüyor

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

Tabii ki, ASLII "aralığında 'erken' olan, olmadığı için MATLAB'da Octave çözümünü yenmek oldukça imkansız . Ancak biraz yaratıcı olmaya karar verdim ve kötüye kullanmayı düşündüm randperm. Bunun biraz sahtekar ve bazılarının hile yaptığını düşünebilirim ama sanırım hoş bir dokunuş. İlk olarak, program ve çıktı:

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

Çıkışı:

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

Uygun bir tohum hesaplamak için, tohum = 4648029'a kadar koştuğum şu programı kullandım (yani, yemekler tamamlanıncaya kadar)

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

Programı iyileştirmenin belki bir yolu, kayan nokta tohumlarını da denemektir, örneğin, 2.3e4 daha uzun bir tohum uzunluğuna sahip olmadan tohum sayısını arttırır. Eğer biri Matlab tarafından temsil edilebilecek tüm n-karakter sayılarını hesaplamak için bir program yapmak istiyorsa ....;)


Bence bu mükemmel bir çözüm. Ancak, ['' 32: 2: 126 33: 2: 125] (tek tırnaklı) geçerlidir ve 728 puandan kısa olur :-)
Jørgen

@ Jørgen Biliyorum ama farklı bir yaklaşım denemek istedim;). Bu kadar randpermuzun bir fonksiyon ismi olmasaydı daha ilginç sonuçlar elde edeceğini düşünüyorum .
15'te Sanchises

4

Haskell, 1660 1376

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

aDize döndüren işlevi tanımlar :

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

Hiç gerçekten optimal değil, ancak aslında karakterleri yeniden eşleştiriyor (sadece bir dizi değiştirilmiş karakter basmak yerine).

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

Çıktı

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

Karakterlere Geobits'in cevabıyla aynı yöntemi kullanarak sipariş verir ve karakterleri değiştirmek için bu cevaba benzer bir şey yapar .


3

BBC TEMEL, 2554

kod

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

Çıktı

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

3

Fortran 90, 1523 1519 1171

Bu, diğer yanıtlara benzer şekilde iç içe geçmiş bir çıktı döngüsüdür. Çok fazla iyileştirmenin mümkün olacağından emin değilsiniz ...

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

Çıktı:

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

Düzenleme: Bu kod için Fortran 90’ın gerekli olduğunu unutmayınız, 77’nin 7. sütunda başlaması için kod gerekmektedir. Öte yandan, dil büyük / küçük harfe duyarsızdır ve kolay bir iyileştirme sağlar. Döngü sayaçları Jve Lbunlar çıktı dizisindeki ilk iki harf olduğu için dolaylı olarak Fortran tarafından tamsayı olarak bildirilir.


3

Perl, 1089 922

ASCII değerlerinin 42 58'inci adımlarda yazdırılmasının, bu yaklaşımla en düşük puanı verdiği ortaya çıktı:

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

Çıktı:

 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..94Zaten 925 puana ulaştı ve 42 büyük olasılıkla artık optimal değildir.
Dennis,

Thanks @Dennis - Bu şekilde döngüler yazabileceğinizi bilmiyordum.
pembemsi ossifrage

Boşlukları print chr$_*63%95+32for 31..125çizgileriyle değiştirirseniz, 799 puan alır.
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)

Çıktı

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

Gerekli v+kısmı mı (v,i)=>v+i*3%95+32? Sadece ekler geliyor bana 0dizisi ile doludur beri her zaman 0.... s
jrich

@ TanımsızFunction Bu görünmüyor. Zaten daha kısa süren alternatif bir yöntem üzerinde çalıştığım için optimizasyona çok fazla odaklanmadım. Teşekkürler! =)
Mwr247 14:15

for(w=95;w-->0;)olabilir for(w=95;w--;), çünkü 0sahte ve 1, 2, 3...hakikaten.
Jrich,

@UdefinedFunction Wow, bunu nasıl düşünmedim! ... D Hala olsa 2000 altına almaya çalışırken: Az önce 2144 için getiren, 56 puan benim en iyi tıraş
Mwr247

Kolay iyileştirme: ifadeleri ayırmak için noktalı virgül yerine newlines kullanın. Newlines 1 olarak sayılır.
jrich

3

Python 2,72 bayt (3188) 116 bayt (1383) (1306) (1303)

katılmak için teşekkürler @FryAmTheEggman;)

thanks @nim (Metni yanlış mı okudum?: P)

teşekkürler @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])

çıktı:

 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))ve"".join(a[::2]+a[1::2])
FryAmTheEggman

1
Sanırım ;19
15'te 14-15

1
n='nr i(a…n=' nri(a…
-409_Conflict

3

PHP, 1217 1081

Kod:

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

Değişkenler başlatılmadığından, çalışan uyarıları bastırması gerekir (PHP şikayet eder ancak yürütmeye devam eder ve bağlamda uygun olan varsayılan bir değeri kullanır; 0bu durumda):

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

Çıktı:

 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

Uyarılar:

  • çıktı beyaz boşlukla başlar ( chr(32));
  • kod, aralığın etrafını saran beyaz boşluktan sonra her bir 52. karakterden yazdırır;
  • sihirli sayı 52, olası ofsetlerin tüm aralığını (1..94) arayarak “keşfedildi”; 1, ASCII kodlarının artan düzeninde yazdırılabilir karakterlerin listesini üretir; 94, her ikisi de kötüdür; 5 ve 19'un katları (95'in bölenleri) kısa döngüler üretir ve tüm değer aralığını (aynı zamanda kötü) kapsamaz;
  • 52sihir gibi görünüyor; bu kod için en iyi uzaklıktır; fakat aynı zamanda kodun bazı varyasyonları için en iyisidir (biraz daha büyük puanlar üretir); I güvenilir varyasyonları: kullanım while()yerine for()kullanılması, $f++, $f--ya da --$fyerine ++$f, yaklaşık işlenen takas <ve +operatör; $Tiçine değişiklik sıkmak 32+$T;
  • değişkenlerin ( $Tve $f) isimleri çıktıdaki ilk harflerdir;
  • Ben başlatmak için çalıştı $Tile 4veya 11ancak puanları daha kötüydü; ile başlayan , çıktıdaki ilk karakteri 4yapar $; PHP kaynak kodunda en çok kullanılan karakterdir; önünde 11getiriyor +; $ve +bu kodda en çok kullanılan karakterler.

Bu çözüme ulaşana kadar çalıştığım kod, testler, artan değişiklikler ve tüm olası adım değerlerini test eden komut dosyası ( 52en iyi adım olarak yetkili sağlayıcı ) github'da bulunabilir .


2

Fourier, 1236

Temel olarak BBCB programımın bir dönüşümü

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

Çıktı

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

0

AWK , 49 bayt, Puan: 1755

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

Çevrimiçi deneyin!

Diğer tüm karakterleri basitçe basar ve sonra boşlukları doldurmaya başlar. Yazdırılan ilk karakter bir f. Ters sırada yazdırmayı denedim, ancak bu skoru büyük ölçüde arttırdı. Çarpan ve döngü ölçütlerini değiştirerek diğer desenler mümkündür.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.