3 var tercüman olun!


24

3var , A, B ve R olarak adlandırılan üç değişken kullanan bir ölü balık çeşididir. A ve B akülerdir , R ise bir sonuç değişkeni olarak kullanılır.

Bu mücadelesinde, bu dilin soyulmuş bir versiyonu için bir tercüman yapmanız gerekiyor.

Gerekli Komutlar:

i   Increments A
d   Decrements A
s   Squares A
p   Prints A
P   Prints the ASCII character of A
>   Sets A to R
a   Increments B
k   Decrements B
m   Squares B
o   Prints B
O   Prints the ASCII character of B
<   Sets B to R
+   Adds A and B, stores in R
-   Subtracts B from A, stores in R
*   Multiplies A and B, stores in R
/   Divides A by B, stores in R
w   Prints R
@   Resets A to 0
#   Resets B to 0
e   Resets R to 0

Diğer her şey (boşluklar dahil) dikkate alınmaz.

Açıklamalar

  • ove pondan sonra hiçbir şey olmadan çıkmalı.
  • Bölünme tamsayı bölmedir.
  • 255'in üzerindeki sayılar ve 0'ın altındaki sayılar desteklenir.
  • 'w', R'den sonra boşluk ya da yeni bir satır çıkarmalı
  • 0'a bölünerek hatasız durur. (STDERR'ye çıkış yok)
  • A, B ve R başlangıçta 0

kurallar

  • Bu yani en kısa cevap kazanır.
  • Beraberlik durumunda, en eski cevap kazanır.
  • Dosya komut satırı argümanları veya STDIN ile sağlanacaktır.
  • Herhangi bir dile izin verilir.
  • Değerlendirmeye izin verilir.

Test Kılıfları

Hello world! (Esolangs'tan alınmış)

iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP

Çıkışlar 20spooky22me:

iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO

Çıkışlar 9P-1420 100 3Q-1 162 0:

iiispsdPkokmo/w<+w#aaaommO-w@ii*wew

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre bir genel bakışını oluşturmak için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden çok sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=63008,OVERRIDE_USER=45220;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.0.3/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>


1
@ Sp3000 Konuşurken, son zamanlarda tercümandaki iç içe geçmiş bir döngü hatasını düzeltmeye yardımcı oldum.
LegionMammal978

2
Deadfish aşina insanlar için ek açıklamalar: dddddp-5 sonuçları ve iiiisspsonuçları 256 yılında seçmek yerine, beklediğiniz gibi 0.
SP3000

1
Test Durumunda Hangi Doz rYapar? geçerli komutlar listenize
eklenmedi

1
@JimmyJazzx Test dosyası şimdi düzenlendi, ancak tam 3varca dilde her şeyi sıfırlar. Bu aynı @#e.
DJgamer98

1
Tercüman başladığında A, B ve R 0 olarak başlatılıyor mu?
Tony Ennis

Yanıtlar:


7

CJam, 112

q{"+-*/dspP>@ikmoO<#awe"_@#\4<"X2 U|{TU :V;}P?"S/f*'T"( _*T cT;V;0)"2/f+":T;"f+_'Tf/'Uf*+"VS 0:V; "S/++=~}%Pa/0=

Çevrimiçi deneyin

Açıklama:

Program yürütülecek kod dizisini oluşturur ve her karakter için karşılık gelen parçayı çalıştırır. Bölünmeyle sıfıra yaklaşmak daha zor, çünkü CJam'ın henüz bir "mola" operatörü yok. Bunun yerine, program π'ı bir işaretleyici olarak iter (aksi halde kayan nokta sayısı görünmez çünkü) ve sonunda yalnızca π'dan önceki çıktıyı tutar.
Ayrıca, program A, B ve R yerine T, U ve V değişkenlerini kullanır, çünkü bunlar CJam'de 0 ile önceden başlatılmıştır.

q            read the input
{…}%         transform each character
  "…"        push a string with all the 3var commands, in a convenient order
  _@         duplicate the string and bring the current character to the top
  #          find the index of the character in the string (or -1 if not found)
  \          swap with the other string copy
  4<         keep only the first 4 characters ("+-*/")
  "…"        push a string that will be used for implementing those operators
  S/         split by space into ["X2" "U|{TU" ":V;}P?"]
  f*         join with each of '+', '-', '*', '/' -> 4 strings
  'T         push the 'T' character
  "…"        push a string with implementations of commands involving A
  2/         split into pieces of length 2
  f+         prepend 'T' to each piece
  ":T;"f+    append ":T;"to each piece
  _          duplicate the array (containing full A-command implementations)
  'Tf/       split each piece by the 'T' character
  'Uf*       join each split piece using the 'U' character
              practically replacing 'T' with 'U'
              to obtain B-command implementations
  +          concatenate the 2 arrays
  "…"        push a string containing implementations for "w" and "e", 
              separated by space; the string also ends with a space
  S/         split by space, obtaining the implementations for "w" and "e"
              and an empty string, for handling unrecognized characters
  ++         concatenate with the A and B command and +-*/ implementations
  =          get the corresponding string implementing the current command
              if the character was not found, -1 will get the empty string (no-op)
  ~          execute it
Pa/          split the array of results by the π separator
0=           get the first piece (before the first π, if any)

Gerçek komut uygulamaları (program tarafından oluşturulmuştur):

+: X2+U|{TU+:V;}P?    if (1+2)|U != 0, set V=T+U, else push π
-: X2-U|{TU-:V;}P?    if (1-2)|U != 0, set V=T-U, else push π
*: X2*U|{TU*:V;}P?    if (1*2)|U != 0, set V=T*U, else push π
/: X2/U|{TU/:V;}P?    if (1/2)|U != 0, set V=T/U, else push π
d: T( :T;             set T=T-1
s: T_*:T;             set T=T*T
p: TT :T;             push T and set T=T (no-op)
P: TcT:T;             push T converted to character and set T=T (no-op)
>: T;V:T;             push and pop T (no-op) and set T=V
@: T;0:T;             push and pop T (no-op) and set T=0
i: T):T;              set T=T+1
k: U( :U;             set U=U-1
m: U_*:U;             set U=U*U
o: UU :U;             push U and set U=U (no-op)
O: UcU:U;             push U converted to character and set U=U (no-op)
<: U;V:U;             push and pop U (no-op) and set U=V
#: U;0:U;             push and pop U (no-op) and set U=0
a: U):U;              set U=U+1
w: VS                 push V and a space
e: 0:V;               set V=0
(default): (empty)    no-op

10

JavaScript (ES7) 208 213 223 237 241 311

Düzenleme3 Birbirlerini kopyalama, I ve Dendrobium birlikte çöküyor.

Edit2 A ve B'nin taşıma araya, sadece 2 bayt kaydetmek için ECMAscript 7 Kullanılması

Düzenleme Kurallarındaki değişikliklerin ardından.

Not, rsadece eski örnek Hello dünyasını çalıştırmak için soruda gerekli olmayan komutu ekledim.

V=p=>(o='',[for(c of'@#e'+p)eval('++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'.replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B').split`,`[k%13])],o)

// More readable
U=p=>(
  o='',
  [for(c of'@#e'+p)
   eval(
   '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
   .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
   .split`,`[k%13])]
  ,o
)

// ES6, no array comprehension, 2 bytes more
W=p=>
  [...'@#e'+p].map(c=>
    eval(
    '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
    .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
    .split`,`[k%13]),
    o=''
  )&&o

// Test
function test() 
{ 
  OUT.innerHTML = V(I.value) 
}

test()
textarea { width: 75%; height: 8em }
Test program <button onclick="test()">Run</button><br><textarea id=I>
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
</textarea><br>Output<pre id=OUT></pre>


Sen olabilir kurtarmak 2 bayt kaldırarak A=B=R=0,ve fiili kullanarak bu değerleri ayarlama ile 3var gibi dize işleme koymadan önce fonksiyonlarını: [...'@#e'+p].
insertusernamehere

2
@insertusernamehere thx, bunu seviyorum
edc65 21

8

GNU Sed ( dcifadeyi değerlendirme seçeneği ile birlikte ), 254

Deadfish oldukça iyi bir alt kümesine eşler dc. Bu yüzden haritalamayı yapmak için sed'i kullanıyoruz:

s/^/@#e/
s/\+/AB+r/g
s/-/AB-r/g
s/\*/AB*r/g
s|/|AB/r|g
s/a/B1+b/g
s/i/A1+a/g
s/d/A1-a/g
s/s/Ad*a/g
s/p/An/g
s/P/AP/g
s/>/Ra/g
s/k/B1-b/g
s/m/Bd*b/g
s/o/Bn/g
s/O/BP/g
s/</Rb/g
s/w/Rn/g
s/@/0a/g
s/#/0b/g
s/e/0r/g
s/[ABR]/l&/g
s/[abr]/s\u&/g
s/.*/dc -e'&'/e

8

Javascript ES6 ES7, 217 215 213 208 bayt

f=s=>(O='',[for(c of'@#e'+s)eval('v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "'.replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]).split`,`[x%13])],O)

Ungolfed

f=s=>(
    O='',                                                                   // initialize output to empty string
    [for(c of'@#e'+s)eval(                                                  // initialize A, B, and R, loop over all chars in input, eval returned function string
        'v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "' // operation list
            .replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]) // replace all instances of v with either A or B
            .split`,`[x%13])],                                              // split ops list, select corresponding function string
    O)                                                                      // return output string

1
+1 Benimkinden uzak değil, ama daha iyisi. Şimdi farklı bir şeyler denemek zorunda kalacağım
edc65

1
Sen olabilir kurtarmak 2 bayt kaldırarak A=B=R=0,ve fiili kullanarak bu değerleri ayarlama ile 3var gibi dize işleme koymadan önce fonksiyonlarını: for(c of '@#e'+s).
insertusernamehere

1
@insertusernamehere Aha, bu çok zekice, teşekkürler!
Dendrobium

Cevabınızı değiştirerek, komut için yeni bir satır w
çıkmadığını görüyorum

@ edc65 Açıklama mermilerinden biri "" w "nin R'den sonra bir boşluk veya yeni bir satır çıkarması gerektiğini belirtir
Dendrobium

6

APL, 191

{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}

Bu, programı argüman olarak alan bir fonksiyondur, örneğin:

      ∆3var←{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}
      ∆3var 'iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO'
20spooky22me

Anonim bir işlev olarak kullanılabilir, ben sadece netlik için bir isim verdim.

Açıklama:

  • 0::→: bir hata oluşursa (örneğin sıfıra bölme), hata mesajını yazdırmadan durma
  • A B R←0: değişkenleri başlat
  • {... }¨⍵: her komut için:

    • ⍵∊G←'aikdms<>': Komut var ← fn (var, x) türünden biriyse , uygun fn ve x'i bulun , yerine koyun ve sonra değerlendirin:
      • : değerlendirmek
      • 'AB'[1+2|G⍳⍵: APozisyonu eğer in 'aikdms<>', hatta bir Bbaşka şekilde.
      • '+-*∘'[M]: M(daha sonra tanımlandığında) bağlı olarak toplama, çıkarma, güç veya hiçbir şey yapma
      • '←': atamak
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(toplama ve çıkarma için), 2(güç için) ve R(hiçbir şey için, yani sadece değişkeni ayarlar R), Mkomutun birinci, ikinci, üçüncü veya dördüncü çifte ait olup olmamasına bağlı olarak .
    • ⍵∊G←'PpOo': çıktı:
      • ⍞←: çıktı
      • ⎕UCS⍣(2|G⍳⍵): ASCII (peki, Unicode) veya komutun tek veya çift konumda olup olmadığına bağlı olarak sayı PpOo,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Aveya Bkomutun ilk yarıda mı yoksa ikinci yarıda mı olduğuna bağlı olarak.
    • ⍵∊G←'+-*/: matematik:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: Rverilen operatörü Ave uygulamasının sonucuna ayarlayın B.
    • ⍵∊G←'@#e': reset:

      • : değerlendirmek
      • 'ABR'[G⍳⍵]: doğru değişkeni seçin
      • '∘←0': sıfıra ayarla
    • ⍵='w':⍞←R: eğer komut ise w, çıktı R.


4

C, 253 241 bayt

#define _ c--?c--?c--
k="id@s>ak#m<e+-*/wpoPO",*p;main(c,a,b,r){for(a=b=r=0;~c;c=getchar())c=strchr(k,c),c&&(c-=k,p=&a+c/5,*p=_?_?_?_?_?printf(c?c<3?"%d":"%c":"%d ",c?c%2?a:b:r):a/(b?b:exit()):a*b:a-b:a+b:0:r:b*b:0:b-1:b+1:r:a*a:0:a-1:a+1);}

Bu kod dizeyi id@s>ak#m<e+-*/wpoPOkomut tablosu olarak kullanır . Dize, hesaplanan ifadenin hedefine göre düzenlenir. Sadece değişkenlerin her birini güncelleyen 5 komut vardır:

  • id@s> - güncelleme a
  • ak#m< - güncelleme b
  • e+-*/ - güncelleme r
  • wpoPO- güncelleme ... ardından hafıza konumunu ve a, bve r. Umarım çok önemli değildir :)

Bu nedenle, giriş karakterini komut dizisinde bulduktan sonra, dizini tekrar tekrar azalır ve 0'a ulaştığı zamana bağlı olarak, bir ifade seçilir.

15 çıkarma işleminden sonra 0'a ulaşmazsa, printf doğru seçilmiş bazı argümanlarla birlikte.

Ayrıca, bölme yaparken, onu arayarak bölmeyi 0'a getirmez exit().

Bu kabul eder, çünkü bu kod, optimizasyonlar olmadan derlenmelidir a, bve r(CPU değil yazmaçlarda) yığında bitişik konumlarında yer almaktadır.

Ayrıca, işaretçileri tam sayılara ve tam tersine dönüştürdüğü için 32 bit modunda derlenmesi gerekir.


4

VBA, 484, 453 380 Bayt

Kazanmak için uzun ama Süper basit şeyler yapmanın yolu, Nothing Fancy sadece iyi eski Select Case

Tamsayılı Bölme ve Div 0 Hata İşlemine Ekleme Çok Bayt
Kaldırıldı Hata Düzeltme İşlemi, normal hata işlemenin aynı işlevsellikte sonuçlandığı görülüyor. Beklenen şekilde çalışabilmesi için Int Intision düzeltildi Ayrıca kısaydı.

Function Y(x)
For Z=1 To Len(x)
w=Mid(x,Z,1)
Select Case w
Case"i":A=A+1
Case"d":A=A-1
Case"s":A=A^2
Case"p":Y=Y &A
Case"P":Y=Y &Chr(A)
Case">":A=R
Case"a":B=B+1
Case"k":B=B-1
Case"m":B=B^2
Case"o":Y=Y &B
Case"O":Y=Y &Chr(B)
Case"<":B=R
Case"+":R=A+B
Case"-":R=A-B
Case"*":R=A*B
Case"/":R=A\B
Case"w":Y=Y &R &vbCrLf
Case"@":A=0
Case"#":B=0
Case"e":R=0
End Select
Next
End Function

Henrik Ilgen'e 31 104 bayt kaydettiği için teşekkürler


2
Bunun VBA'da işe yarayıp yaramadığını tam olarak bilmiyorum (VB6'da çalışır), ancak bunu kullanarak bir sürü bayttan tasarruf edersiniz DefInt A-Z, böylece açıkça beyan etme ihtiyacını çıkarırsınız A,B ve Rolarak Integer: DefInt A-Z:Dim A, B, R. O da sadece beyanı olmadan, bunları atamak işe yarayabilecek: A=0:B=0:R=0. Hesaplamalar da değişkenler üzerinde yapılmalı .
Henrik Ilgen

@HenrikIlgen çok teşekkürler, Unutma DefIntHer gün kullandığım bir şey değil, gelecekte VBA'da golf oynamak için süper yararlı olacak. Ne yazık ki A=0, testlerimden bir çift gibi davranmasını sağlayacak. Orada iiiaa/wbir bütünden çok bir ondalık sonuç üretti.
JimmyJazzx

1
Tamsayılı bölme için \ deneyin;)
Henrik Ilgen

1
Sen için aşağı yoğunlaşmasına olabilir 405 bayt bunu bir işlev yapmak ve sonucu "yapı" için dönüş değeri kullanırsanız aslında sonucu :) yazdırmak gerekmez varsayarak
Henrik İlgen

3

PHP, 310 bayt

Hayatımda ilk kez kullanarak eval:

for($A=$B=$R=0;$c=$argv[1][$i++];)eval([i=>'++$A',d=>'--$A',s=>'$A*=$A',p=>'echo$A',P=>'echo chr($A)','>'=>'$A=$R',a=>'++$B',k=>'--$B',m=>'$B*=$B',o=>'echo$B',O=>'echo chr($B)','<'=>'$B=$R','+'=>'$R=$A+$B','-'=>'$R=$A-$B','*'=>'$R=$A*$B','/'=>'$R=$A/$B',w=>'echo$R','@'=>'$A=0','#'=>'$B=0',e=>'$R=0'][$c].';');

İlk komut satırı girişini alır:

php 3var.php "iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO"

Örneklerden çıktı:

Selam Dünya!
20spooky22me


3

C, 357

Makrolar FTW!

(Kimi kandırıyorum - c bunu asla kazanamayacak)

#define X(p,e) case p:e;break;
#define Y(p,a,b,c,d,e,f) X(a,p++)X(b,p--)X(c,p*=p)X(d,printf("%d",p))X(e,printf("%c",p%256))X(f,p=R)
A,B,R;main(int C,char**V){for(;*V[1];)switch(*V[1]++){Y(A,'i','d','s','p','P','>')Y(B,'a','k','m','o','O','<')X('+',R=A+B)X('-',R=A-B)X('*',R=A*B)X('/',R=A/(B?B:exit(0),1))X('w',printf("%d",R))X('@',A=0)X('#',B=0)X('e',R=0)}}

2

JavaScript (ES6), 293 262 bayt

f=x=>(o="",a=b=r=0,p=String.fromCharCode,[...x].map(c=>{if(eval(`m={i_a++,d_a--,s_a*=a,p_o+=a,P_o+=p(a),">"_a=r,a_b++,k_b--,m_b*=b,o_o+=b,O_o+=p(b),"<"_b=r,"+"_r=a+b,"-"_r=a-b,"*"_r=a*b,"/"_r=a/b|0,w_o+=r,"@"_a=0,"#"_b=0,e_r=0}[c]`.replace(/_/g,":_=>")))m()}),o)

kullanım

f(`iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP`)

=> "Hello world!"

açıklama

Emin değilim diline dair birkaç ayrıntı var (tamsayılar, tanınmayan karakterleri kullanma, vb.) Ancak bu çözüm yeterince çalışıyor ve test durumundaki yeni satırlar gibi boşluk karakterlerini görmezden geliyor.

f=x=>(
  o="",                           // o = output string
  a=b=r=0,
  p=String.fromCharCode,
  [...x].map(c=>{                 // iterate through each character
    if(                           // if used for NOP characters (whitespace)

      // Functions:
      eval(`m={
        i_a++,
        d_a--,
        s_a*=a,
        p_o+=a,
        P_o+=p(a),
        ">"_a=r,
        a_b++,
        k_b--,
        m_b*=b,
        o_o+=b,
        O_o+=p(b),
        "<"_b=r,
        "+"_r=a+b,
        "-"_r=a-b,
        "*"_r=a*b,
        "/"_r=a/b|0,
        w_o+=r,
        "@"_a=0,
        "#"_b=0,
        e_r=0
      }[c]`.replace(/_/g,":_=>")) // dynamically add common characters

    )m()                          // execute the function
  }),
  o                               // return the output string
)

1
Hepinizin yerine iken bir eval içinde sözlüğü içine alarak bir kaç bayt kurtarabilecek düşünmek :$=>ile $daha sonra bir dize için değiştirmek ekleyerek.
Conor O'Brien

2

Simplex v.0.8 , 211 bayt

(UTF-8 kodlanmış.)

h@u]u2ƒ§I]ƒ§M]ƒ§^O]ƒ§o]ƒ§s]ƒ§@]ƒ§Ah]ƒ§Sh]ƒ§Mh]ƒ§Vh]ƒ§&oh]ƒðI]ƒðM]ƒð^O]ƒðo]ƒðs]ƒð@]ƒðAh]ƒðSh]ƒðMh]ƒðVh]ƒð&oh]ƒ§z]ƒðz]ƒuz@]{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}

açıklama

Bu, bugüne kadar yazdığım en uzun simpleks programı olduğundan, genel olarak bunun mermi noktalarında nasıl çalıştığını açıklayacağım.

  • h@u] - Makro 0'ı tanımlar. Bu makro sadece kayıt defterine yazar ve bir lambda'nın hiçbir şey döndürmemesini sağlar.
  • u2- yukarıdaki şeride gider ve mevcut baytı 2 olarak ayarlar; bu, tanımlanacak lambdaların arititesini tanımlar.
  • ƒ- lambda ekspresyonuna başla; bir kez tamamlandıktan sonra ], lambda işlevini lambda yığınına itecektir. İşaretçiden hücreleri yerel şeridi içine alarak (arit) hücreleri hareket eder ve tamamlandıktan sonra, mevcut şeridi yazılmadığı sürece, yerel şeridi alınan hücrelere ayarlar. İşaretçi etkilenmez. Makro 0, bir fonksiyonun şeritte hiçbir şey değiştirmeden dönmesine izin verir.
  • §- geçerli şeritteki ilk yazılı hücreye hareket eder, yani A.
  • ð- geçerli şeritteki son yazılı hücreye hareket eder, yani B.
  • ... {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} giriş yığını boşalana kadar tekrarlayın
    • "idspP>akmoO<+-*/w@#e" - komutlar
    • Rly - şeridi bir demet içine yerleştirin
    • G^u - demet içindeki girişin dizini
    • ·- mevcut bayt yük th lambda değerlendirici içine
    • uRL- strip tutuşuna gider Ave B(yazar Ave Beğer yoksa)
    • - lambda yürütür (bu lambda değerlendiricisidir)
    • - şeridin altına sıfırlar

phew etkilendim. Simplex için çok uzun, ama her şey için kısa.;)


2

Minkolang 0.11 , 222 bayt

Bunun daha fazla golf oynayabileceğine eminim, ama eğlenceliydi. Ayrıca, başka bir dilin ilk Minkolang yorumcusu!

>I3&000V$Vod?.45*[di1q=5&]x00wx1i2+kw
idspP>akmoO<+-*/w@#e
vr1+r
vr1-r
vr2;r
v0c1$((dl%"0"+$rl:d)$Ok
v0cO
vrx0cr
v1g1+1G
v1g1-1G
v1g2;1G
v1c1$((dl%"0"+$rl:d)$Ok
v1cO
v1gxd1G
vx$d+
vx$d-
vx$d*
vx$dd?.:
vdN
vrx0r
v1gx01G
vx0

Burada dene.

açıklama

>I3&000                    Initializes A, B, and R if they don't already exist.
V$V                        An idiom that ensures no time-travel.
od?.                       Reads in a character and halts if input is empty.
45*[di1q=5&]               Looks through the second row for a matching character.
            x00w           Jumps back to beginning if no match.
                x1i2+kw    Jumps to corresponding line upon match.

Satırların geri kalanı, belki de bunun dışında, 1$((dl%"0"+$rl:d)$Oksonunda boşluk bırakmadan bir sayı basan bir deyim olan oldukça basittir . (Bu, bu sayıdan-dizeye dönüştürme işlevini henüz uygulamamıştım 1Z.) Oh, evet, hepsinin vbaşında bir var ve baştan başa dönüyor.


2

GNU Sed (dc ifadesini değerlendirmek için eval seçeneğiyle), 289

Maalesef başarısızlığa uğrayan Digital Trauma'dan ilham alan, a) yasa dışı karakterlerin göz ardı edilmesine ihtiyaç duyulduğunu, b) dc'nin dönüştürülen tüm programın bir argümana ihtiyacı olduğunu ve c) 0'a bölünmesinin programı hatasız bir şekilde sonlandırması gerekir.

Tüm bu kurallar geçerli olmazsa, çözümüm yalnızca 235 bayt uzunluğunda olacaktı;)

H
$!d
x
s/^/@#e/
s:[^-a><de/+i*k@w#opsmOP]::g
s:[e@#]:0&:g
s:[-*+/pPid]:Q&:g
s:[-kaoO*+/]:H&:g
s:[><w]:Z&:g
s:[diak]:1&:g
s:s:Q2^>:g
s:m:H2^<:g
s:[-+*/]:&e:g
s:[ia]:+&:g
s:[dk]:-&:g
y:Oop:Pnn:
s:w:n32P:g
s:[id>@]:sq:g
s:e:sz:g
s:[#<ka]:sh:g
s:[QHZ]:l\l&:g
s:/:d0=t/:g
s/.*/dc -e'[q]st&'/e

2

AWK, 311 309

func p(z,f,x){if(c~z)printf"%"f,x}BEGIN{FS=z}{for(i=0;++i<=NF;){c=$i;A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;p("p","d",A);p("P","c",A);B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;p("o","d",B);p("O","c",B);R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;if(c~"/")if(B)R=A/B;else exit;p("w","d ",R)}}

Printf etrafında TIL parantezi gerekmedi. 2 bayt kaydedildi!

Kolay okunması için ungolfed versiyonu:

func p(z,f,x) {
    if(c~z) printf "%"f,x
}

BEGIN {
    FS=z
}

{
    for(i=0;++i<=NF;){
        c=$i;
        A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;
        p("p","d",A);
        p("P","c",A);
        B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;
        p("o","d",B);
        p("O","c",B);
        R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;
        if(c~"/")if(B)R=A/B;else exit;
        p("w","d ",R)
    }
}

1

Python 2,272

import sys;a,b,r=0,0,0;exec';'.join(filter(None,map(dict(x.split(':')for x in"a:b+=1|@:a=0|#:b=0|/:r=a/b|d:a-=1|PXchr(a)|i:a+=1|-:r=a-b|k:b-=1|*:r=a*b|m:b*=b|oXb|pXa|s:a*=a|OXchr(b)|wXr|+:r=a+b|e:r=0|<:b=r|>:a=r".replace('X',':print ').split('|')).get,sys.stdin.read())))

Bu işe yaramıyor. Sizin printifadeleri bir eğik satırsonu sayılabilir.
Griffin

1

Ruby, 199 bayt

a=b=r=0
$<.read.chars{|c|eval %w{a+=1
a-=1
a*=a
$><<a
$><<a.chr
a=r
b+=1
b-=1
b*=b
$><<b
$><<b.chr
b=r
r=a+b
r=a-b
r=a*b
b==0&&exit||r=a/b
puts\ r
a=0
b=0
r=0
p}["idspP>akmoO<+-*/w@#e".index(c)||-1]}

.readRuby'nin daha yeni bir sürümünde stderr'e yazdırılan bir uyarıya tahammül ederseniz, ikinci satırdan kaldırılarak 5 bayt kaydedilebilir .


1

Python, 244

import sys;P=sys.stdout.write;A=B=R=0;exec';'.join(filter(None,map(dict(zip('idspP>akmoO<+-*/w@#e','A+=1 A-=1 A**=2 P(`A`) P(chr(A)) A=R B+=1 B-=1 B**=2 P(`B`) P(chr(B)) B=R R=A+B R=A-B R=A*B R=A/B print(R) A=0 B=0 R=0'.split())).get,input())))

Biraz geç kaldım ama gitmek istedim.


1

Prolog, 759 bayt

En kısa program değil, ama en azından yapılandırılmış ve okunabilir.

q(A,B,R,i,X,B,R):-X is A+1.
q(A,B,R,d,X,B,R):-X is A-1.
q(A,B,R,s,X,B,R):-X is A*A.
q(_,B,R,>,R,B,R).
q(A,B,R,a,A,X,R):-X is B+1.
q(A,B,R,k,A,X,R):-X is B-1.
q(A,B,R,m,A,X,R):-X is B*B.
q(A,_,R,<,A,R,R).
q(A,B,_,+,A,B,X):-X is A+B.
q(A,B,_,-,A,B,X):-X is A-B.
q(A,B,_,*,A,B,X):-X is A*B.
q(_,0,_,/,_,_,_):-!,1=2.
q(A,B,_,/,A,B,X):-B>0,X is A/B.
q(_,B,R,@,0,B,R).
q(A,_,R,#,A,0,R).
q(A,B,_,e,A,B,0).
q(A,B,R,p,A,B,R):-write(A).
q(A,B,R,'P',A,B,R):-A>0,format('~c',A).
q(A,B,R,'P',A,B,R):-write(A).
q(A,B,R,o,A,B,R):-write(B).
q(A,B,R,'O',A,B,R):-format('~c',B).
q(A,B,R,'O',A,B,R):-write(B).
q(A,B,R,w,A,B,R):-write(R),nl.
q(A,B,R,_,A,B,R).
f([],_,_,_).
f([H|T],A,B,R):-q(A,B,R,H,X,Y,Z),f(T,X,Y,Z),!.
p(X):-atom_chars(X,Y),f(Y,0,0,0).

Örnek giriş

p('iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO').

Burada çevrimiçi deneyin

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.