Etkileşimli bir Deadfish tercüman yazın


30

Deadfish , dört komutlu bir şaka "programlama dili" dir. Esolang sayfası biraz çelişkili olduğundan ve o sayfadaki tercümanların hepsi aynı şekilde çalışmadığından, aşağıdaki varyasyonları uygulamanız gerekir:


Şartname

  1. Boyutu en az 16 bit olan, daha fazlasına izin verilen, ancak daha az olmayan bir akümülatör vardır . Negatif numaraların desteklenmesi gerekmez. Akümülatör 0program başladığı zamandır.
  2. Aşağıdaki dört komut kümesi vardır ve programınız her ikisini de aynı anda desteklemelidir.
      Standard Deadfish │ XKCD Varyant │ Anlamı
      ─────────────────────┼──────────────────┼───────── ───────────────────────────
            i │ x │ Artış akümülatörü
            d │ d │ Azaltma akümülatörü
            s │ k │ Kare (acc = acc * acc)
            o │ c │ Sayı olarak çıkış akümülatörü
    
  3. Bir komutu yürüttükten sonra, akümülatör ya -1da 256ise, akünün sıfıra sıfırlanması gerekir. Bunun normal sarma olmadığına dikkat edin. Örneğin, akümülatör çalışıyorsa 20ve skomut çalıştırılırsa akümülatörün 400daha sonra olması gerekir . Benzer şekilde, akümülatörün 257ve dkomutun çalıştırılması durumunda akümülatörün olması gerekir 0.
  4. Bu komutlardan biri olmayan herhangi bir giriş göz ardı edilmelidir.

Test programları

  • xiskso çıkmalı 0
  • xiskisc çıkmalı 289

I / O

Programınız bir istem göstermesi gerekir: >>. Bilgi istemi yeni bir satırın başında olmalıdır. Daha sonra bir kullanıcı girişi satırı okumalı ve verilen komutları soldan sağa çalıştırmalıdır. Rakamların çıktısını alırken, rakamların ayrılması gerekir. Yani, 12 34tamam, 12,34tamam

12
34 

tamam, ama 1234değil.

Programınız, bunu en azından EOFulaşılana kadar bir döngüde yapmaya devam etmelidir .

Örnek oturum:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> 

Giriş istemesi nedeniyle, GolfScript kullanamıyorum :-(
ProgramFOX

@ProgramFOX: Yakut girişini kullanabilirsiniz?
marinus

GolfScript eğitimine göre, GolfScript'te giriş yapmanızı isteyemezsiniz, tüm girişler STDIN'den gelir.
ProgramFOX

@ProgramFOX: Böyle bir şeyin #{STDIN.gets}işe yarayacağını düşünürdüm ama gerçekten işe yaramadı.
marinus

Bunun yerine büyük harflerle giriş yapmamıza izin verilir mi?
lirtosiast

Yanıtlar:


6

K, 77 bayt

  {1">>";0{x*2=-1 256?x:y@x}/("xkcdiso"!7#(1+;{x*x};{-1@$x;x};-1+))@0:0;.z.s`}`
>>xiskso
0
>>xiskisc
289

Bunun K4 olduğuna dikkat edin . Bir K6 çözümü biraz daha uzundur çünkü IO fiilleri daha uzundur, her şey daha iyi olsa bile:

{""0:">>";0{x*^-1 256?x:y@x}/("xkcdiso"!7#(1+;{x*x};{""0:,$x;x};-1+))@0:"";o`}`
  • ""0:argümanını basar ve döndürür. Not K4'te sadece 1'e başvuruyoruz .
  • 0 f/ args başlangıç ​​değeri olan düşüşü, yani f[f[0;first arg];second arg]…
  • {x*2=-1 256?x…x'i diğer tüm değerler için 0 (-1), 1 (256) ve 2 olarak sınıflandırır. sınıflandırılmamış değerler için 2=elde ettiğimiz anlamına gelir 1ve 0aksi halde, çarpma bir koşulludan xdaha kısadır. K6'da biraz daha iyisini yapabiliriz çünkü geri dönen (boş) {x*^-1 256?x:y@x}gerçeğe dayanır ve boşları algılar.-1 256?x0N^
  • "Ayrıştırıcı" "xkcdiso"önerilen sipariş yerine haritadır , çünkü7# dört argümanı saracak, yani tablomuzu daha küçük tutan 7#"abcd"döner"abcdabc"
  • Harita çevirir "x"ve "i"projeksiyona1+ işlevine eşdeğerdir hangi {1+x}ama daha kısa.
  • Harita "d"projeksiyona çevirir-1+ , fonksiyona eşdeğer {-1+x}ancak daha kısa olan .
  • Harita çevirir "k"ve"s" işleve{x*x}
  • Harita çevirir "c"ve "o"çıkış fonksiyonuna {-1@$x;x}K6 yine hangi biraz daha uzun olduğu:{""0:,$x;x} ama ikisi yazdırmak sonrasında bir yeni satır üretimini ve sonra argüman döndürür.
  • .zs özyinelemelidir. K6'da o`hangisinin daha kısa olduğunu söyleyebiliriz .

8

Perl 5 , 90 bayt

do{print+(map{$?+=/i|x/-/d/;$?**=1+/s|k/;$?=~s/-1|^256$/0/;"$?
"x/o|c/}/./g),'>> '}while<>

Çevrimiçi deneyin!

Daha önce buna yardım ettiği için @xfix'e teşekkürler ! @Xcali sayesinde 4 byte kurtarıldı !


1
1Akümülatör taşdığında programınız yazdırır . Ayrıca, değiştirerek, beş karakterden ederek programı kısaltır $aiçin $?(için başlatılır hangi 0ve Perl bazı dış program çalıştırmak kadar değişmeyecek).
Konrad Borowski

Ahhhh, kullanabileceğim bir değişken arıyordum, mükemmel, teşekkür ederim! Taşma gelince, sadece isssotek bir komut olarak çalıştırırsanız , her birini ayrı ayrı yapmazsanız gerçekleşeceğini fark etmedim ... Bunu daha sonra inceleyeceğim ve kesinlikle kullanacağım $?. Teşekkür ederim!
Dom Hastings

Bence Bu yüzden birlikte üstündeki kod bölümünde eski bir sürümünü sol ''yerine ""kullanıldığında yüzden perl -e '...'sonucundan sona ereceğini haritası s///. Tekrar teşekkürler!
Dom Hastings

Tamam, sen en kısasın.
marinus

1
Artık en kısa cevap.
geocar

6

Powershell, 131 126 121 114 113

for($x=0){[char[]](read-host ">>")|%{switch -r($_){"i|x"{$x++}"d"{$x-=!!$x}"s|k"{$x*=$x}"o|c"{$x}}
$x*=$x-ne256}}
  • for($x=0){...} - akümülatörü 0'a ayarlayın ve sonsuza kadar tekrarlayın
  • read-host '>>' - istemi ile kullanıcı girişi olsun >>
  • [char[]](...) - kullanıcı girişini bir karakter dizisine dönüştür
  • |%{...} - içeride ne varsa gerçekleştirin {} her karakter için
  • switch -r($_) - Her karakter için regex anahtarı
  • "i|x"{$x++} - maç iveyax - akümülatörü arttır
  • "d"{$x-=!!$x} - maç d- azalış $xile !!$xolacak olan 0ise $xise 0ve 1aksi. Bu, akümülatörün asla ulaşmamasını sağlar-1 .
  • "s|k"{$x*=$x} - maç sveyak - kare
  • "o|c"{$x} - maç oveyac - akümülatörün çıktısını alın
  • $x*=$x-ne256- tarafından çarpın akümülatör 0Çünkü eğer 256ya tarafından 1aksi

Örnek çıktı

>>: xiskso
0
>>: xiskisc
289
>>: ddddo ddddo
285
281
>>: ddddo ddddo
277
273
>>: dddddddo
266
>>: dddddddddo
257
>>: do
0
>>: do
0
>>: io
1
>>:

Sanırım uygulamanın read-hostana bilgisayara özgü olduğunu düşünüyorum, bu yüzden bu Powershell ana bilgisayarı (ConsoleHost) :belirtilen bilgi istemine eklenir .


Güzel! Düşüşünü seviyorum, !!$xbunu kullanamam utanç ...
Dom Hastings

Hey Danko, lütfen bir test çıktısı gönderir misiniz? Elektrik kabuğunu camsız pencerelerde test edebileceğimi sanmıyorum ... (lütfen yanılıyorsam beni düzelt!)
Dom Hastings

Cevaba bazı test çıktıları ekledim.
Danko Durbić

6

Rebol 3, 178 169 161 159

f: does [if a = -1 or (a = 256)[a: 0]]d: [any[["i"|"x"](++ a f)|["d"](-- a f)|["s"|"k"](a: a * a f)|["o"|"c"](print a)| skip]]a: 0 forever [parse (ask ">>") d]

Güzel sürüm:

f: does [if a = -1 or (a = 256) [a: 0]]
d: [
    any [
        ["i"|"x"] (++ a f) |
        ["d"] (-- a f) |
        ["s"|"k"] (a: a * a f) |
        ["o"|"c"] (print a) |
        skip
    ]
]
a: 0 
forever [parse (ask ">>") d]

6

Haskell, 202

r=pure;-1%c=0%c;256%c=0%c;s%'o'=s<$print s;s%'c'=s%'o';s%'i'=r$s+1;s%'x'=s%'i'
s%'d'=r$s-1;s%'s'=r$s^2;s%'k'=s%'s';s%_=r s;n s(c:[])=s%c;n s(c:f)=s%c>>=(`n`f)
main=p 0;p s=putStr">> ">>getLine>>=n s>>=p

Büyük olasılıkla değiştirerek eve voperatörlerle birkaç karakter kaydedebilirsiniz . Ayrıca yeniden yazmaya çalıştım vve gböylece parametre xIO'da kalır, printvb. Kaldırılır. Çalıştırmayı başaramadım, ama kendi güçlerini bilen biri için gitmek için iyi bir yer olabilir.
shiona

@shiona: Evet, bir şeyleri içeride tutmakla ilgili bir şey IOya çok sık yazdırıyorlar (bunun r nyerine kullandım x) ya da yeterli değil çünkü değer asla istenmiyor…. Peki nasıl değiştirecek eve voperatörler içine?
Ry-

Baskı ile aynı sorunları yaşadım. Yapabilecek olan operatörlere ne gelir (örnek olarak e'yi kullanarak) 'i'%x=x+1;'d'%x=x-1... Ve v do n<-x;r$w$o%n. Operatörlerin yer kazanmalarının nedeni, etraflarında boşluk gerektirmemeleridir.
shiona

@ shiona: Ah! İyi görüşme, teşekkür ederim!
Ry-

Sorun değil. Öncelikle kendi cevabımı vermeyi düşündüm ama büyük fikirlerimi çalıştıramadığım için aynı fonksiyonlar için sadece farklı kodlarla aynı kodla yazmanın kabaca olacağını düşündüm.
shiona

4

Ruby, 140 138

a=0
loop{$><<'>> '
eval gets.gsub(/./){|c|({i:i='a+=1',x:i,d:'a-=1',s:s='a**=2',k:s,o:o='p a',c:o}[:"#{c}"]||'')+';a=a==-1||a==256?0:a;'}}

Örnek oturum (sizinkiyle aynı):

c:\a\ruby>deadfish
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

4

K, 121

i:0;while[1;1">> ";{i{(r;0)(-1~r)|256~r:y x}/d{x@&x in y}[x;!d:"ixdskoc"!,/(2#(1+);-1+;2#{x*x};2#{-1@$i::x;})]}'" "\:0:0]

.

C:\q>q deadfish.k -q
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

Benim versiyonum daha kısa. Haritayı sıkıştırdım, güvendim mi? "sarma" değerlerini sınıflandırmak, süre yerine özyinelemeyi ve değişiklik yerine işlevsel bir tercümanı kullanmak.
geocar

4

Ada

İşte bu dille ilgilenen birkaç kişi için bir Ada uygulaması. Ada'nın en iyi uygulamalarından bazılarını kullanmak (erişim yerine Indefinite_Holders kullanımı gibi) ve ayrıca Deadfish'in nasıl çalışması gerektiğini tam olarak kavramam biraz zaman aldı.

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Indefinite_Holders;
with Ada.Integer_Text_IO;

procedure Deadfish is
   package String_Holder is new Ada.Containers.Indefinite_Holders(String);
   use String_Holder;

   value_output : Natural := 0;
   str_input : String_Holder.Holder := To_Holder("");
begin
   Prompt :
   loop
      Put(">> ");
      String_Holder.Replace_Element(str_input, Get_Line);
      for rg in str_input.Element'Range loop
         case str_input.Element(rg) is
            when 'i' | 'x' => 
               case value_output is
                  when 255 => value_output := 0;
                  when others => value_output := Natural'Succ(value_output);
               end case;

            when 'd'       =>                   
               case value_output is
                  when 257 => value_output := 0;
                  when 0 => null;
                  when others => value_output := Natural'Pred(value_output);
               end case;
            when 's' | 'k' => 
               case value_output is
                  when 16 => value_output := 0;
                  when others =>value_output := value_output * value_output;
               end case;
            when 'o' | 'c' => Ada.Integer_Text_IO.Put(value_output, Width => 0); Put_Line("");
            when others => null;
         end case;
      end loop;
   end loop Prompt;
end Deadfish;

Ve çıktı:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

Ada'da denenen bazı insanlar bana bazı optimizasyon ipuçları verebilirse, müteşekkir olurum.


1
PPCG'ye Hoşgeldiniz! Code-
golf'un

4

C, 159 karakter

A; main(c) {
  printf(">> ");
  while (c = getchar(), ~c)
    A = c - 'i' & c - 'x'?
        c - 'd'?
        c - 's' & c - 'k'?
        c - 'o' & c - 'c'?
        c - '\n'?
        A :
        printf(">> "), A :
        printf("%d\n", A), A :
        A * A :
        A - 1 :
        A + 1,
    A *= ~A && A - 256;
}

Öğretim kod çözme için bir arama tablosu oluşturmaya dayanarak başka bir yaklaşım denedim, ancak ne yazık ki bu daha uzun sürdü ( 169 ). Biri boyutunu küçültmek için zeki bir ince ayar ile gelebileceği için dahil ettim. (Herhangi bir argüman olmadan çalıştırılmalıdır)

#define X !--c?A

A,M[256];
main(c) {
  for(; !M['x']; c++) M["@osid\nckx"[c]]-=c%5+1;
  for (printf(">> "); c = ~M[getchar()]; A *= ~A && A - 256)
  A= X,printf("%d\n", A),A:X*A:X+1:X-1:A;
  main();
}

3

C, 163

#define i(u,v);if(c==u+89|c==v+89)
a;main(c){printf(">>");while(c=getchar()-10){i(6,21)a++i(1,1)a--i(8,16)a*=a;i(0,12)printf("%d\n",a);a=a==-1|a==256?0:a;}main();}

3

Python 3, 181 175 171 162

a=0
s=lambda x:"a=%d"%(x!=-1and x!=256and x)
while 1:
 for i in input(">>"):u,b,o=s(a+1),s(a*a),"print(a)";exec(dict(i=u,x=u,d=s(a-1),s=b,k=b,o=o,c=o).get(i,""))

Bu >>, sonrasında yeni bir satır çıkarır , ancak OP buna izin verilmediğini söylemedi. Artık değil!

Sayesinde GlitchMr, minitechve golfer9338!


1
Hemen dönen bir işlev lambdayerine kullanabilirsiniz def.
Konrad Borowski

x in(-1,256)iki karakter kaydeder. Alternatif olarak, s=lambda x:"a=%d"%(x!=-1and x!=256and x)bazılarını kurtarabilir.
Ry

1
Bunun yerine kaldırabilir print(">>")ve kullanabilirsiniz for i in input(">>"); input()bilgi istemi belirtilmesine izin verir. Sonra, sonradan yeni bir satır olmaz >>ve karakterleri kaydedersiniz .
golfer9338

Puanınız, bence, şu anda bir karakter daha kısa olmalı . Lütfen iki kez kontrol edin, ancak yayınlanan 162 yerine 161 sayımı alıyorum: 3 + 40 + 8 + 107, artı 3 yeni satır. Gerçeği söylemek gerekirse, ben kıskanç biriyim, çünkü her iki şekilde de C cevabımdan biraz daha kısa. Şerefe!
Darren Stone,

3

R, 161 , 148 , 138

a=0;repeat{x=readline(">> ");for(i in utf8ToInt(x)-99){a=a^((i==8|i==16)+1)+(i==6|i==21)-(i==1&a);a=a*(a!=256);if(i==0|i==12)cat(a,"\n")}}

Ungolfed versiyonu:

a = 0
repeat{
  x = readline(">> ")
  for(i in utf8ToInt(x) - 99) {
    a = a ^ ((i == 8 | i == 16) + 1) + (i == 6 | i == 21) - (i == 1 & a)
    a = a * (a != 256)
    if(i == 0 | i == 12) cat (a, "\n")
  }
}

Örnek oturum (etkileşimli modda):

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> 

3

Python 3, 141

Geç kalacağımı biliyorum, ancak daha kısa bir Python sürümü (ve ilk CodeGolf girişimim) gönderme fırsatını kullanmak istedim. :)

v=0
m=lambda y:(0,y)[-1!=y!=256]
i=x='+1'
d='-1'
s=k='*v'
c=o=');print(v'
while 1:
 for n in input('>>'):exec('v=m(v'+locals().get(n,'')+')')

Baskı ifadesi bunun için biraz zordu. Bilgi isteminin boşlukla bitmesi gerekiyorsa, sayıya bir karakter ekleyin. :)

açıklama

v akümülatördür.

mVerilen değerin -1veya olup olmadığını kontrol eder 256. Öyleyse,0 aksi takdirde değeri iade edilecektir.

Aşağıdaki satırlarda, işlemler karşılık gelen değişkenlere atanır (bazıları aynı anlama geldiği için (gibi ive gibi x) bu yeni bir sözlük başlatmaktan daha kısadır). Bunlar daha sonra kullanılanexec aşağıda .

while 1: ana döngü

Şimdi eğlence başlıyor. Gibi @jazzpi 'ın çözümü, bu girişin Her char üzerinde dolaşır. locals()Tüm geçerli (görünür) değişkenlerin sözlüğüdür. İle .get(n,'')ilgili anahtar exec-string konulacaktır (boş bir dizge, anahtar () diğer girdi = eğer yoksa). Bu daha sonra idam edildiğinde bir araya getirilerek viletilecektir m. Dönüş değeri vtekrar kaydedilecektir .

Kısa örnek:

Be n = 'i'( n= girdi-char), biz almak '+1'dışına localsolarak -bloku ideğeri ile değişkendir '+1'.
Dizesi execböyle daha görünüyor: 'v=m(v+1)'.
Belki şimdi, yürütürken, mdeğeri ile çağırıp tekrar v+1çıkışını saklayacağını görmek daha kolaydır v.

Sıkılıncaya kadar bunu tekrarlayın. :)


Partiye ÇOK geciktiğimin farkındayım, ancak m için lambda y*(-1!=y!=256)-3 bayt olabilir
Reinstate Monica

sadece 5 yıl :) girdi olsa teşekkürler. Cevabı düzeltmek için çok tembelim ama aklımda tutacağım
Dave J

3

Python 2, 139

a=0
while 1:
 for c in raw_input(">> "):
  if c in'ix':a+=1
  if c=='d':a-=1
  if c in'sk':a*=a
  if c in'oc':print a
  if a in(-1,256):a=0

Bu temiz, ama aynı zamanda oldukça basit. İşte daha uzun, daha havalı bir sürüm:

def i(a):
 while 1:
  c=yield
  if c in'ix':a+=1
  if c=='d':a-=1
  if c in'sk':a*=a
  if c in'oc':print a
  if a in(-1,256):a=0
 j=i(0);next(j)
while 1: 
 for c in raw_input(">> "):j.send(c)

190 karakter ağırlığında, belki de en rekabetçi konumdaki cevap bu değil. Öte yandan, coroutinler güzel rad ve ben her zaman onları kullanmak (ve paylaşmak) için bir bahane arıyorum


3

TI-BASIC, 104 107 102 100 98

TI-83 + / 84 + serisi hesap makineleri için.

Bunu adlandırın prgmD; Sonunda kendisini arayarak yığını taşar. While 1Bunu düzeltmek için özyinelemeyi iki bayt pahasına a ile değiştirin .

Input ">>",Str1
For(I,1,length(Str1
int(.5inString("?ixskd?oc",sub(Str1,I,1
If Ans=4
Disp Y
imag(i^Ans)+Y^int(e^(Ans=2     //decrements when Ans=3; increments when Ans=1
min(0,Ans(Ans≠256→Y
End
prgmD

Y varsayılan olarak 0'dır, bu nedenle bunu yeni hafıza silinmiş bir hesap makinesiyle çalıştırın veya çalıştırmadan önce manuel olarak 0 ila Y'ye kaydedin.

Küçük harflerin (dize değişmezlerinde) her birinin iki bayt olması çok kötü; Aksi halde bu, Dom Hastings'in cevabından daha kısa olacaktır.

EDIT: Üç bayt pahasına bir sıfıra bölme (0 ^ 0) hatası düzeltildi.

107 -> 102: Dört bayttan tasarruf etmek için hayali üstelleştirme hilesi kullanıldı (parantez içindeki 1 ve arama dizgisinin uzatılması dahil -1 dahil) ve başlatılması daha az bayt alan X yerine Y kullanıldı.


2

Postscript 272

/cmd<</i{1 add}/x 1 index/d{1 sub}/s{dup mul}/k 1 index/o{dup =}/c 1 index>>def
0{(>> )print flush{/f(%lineedit)(r)file def}stopped{exit}if{f
1 string readstring not{exit}if cmd exch 2 copy known{get exec}{pop pop}ifelse
dup -1 eq 1 index 256 eq or{pop 0}if}loop pop}loop

Ungolfed:

/cmd <<  % define commands
/i { 1 add }
/x 1 index
/d { 1 sub }
/s { dup mul }
/k 1 index
/o { dup = }
/c 1 index
>> def
0        % accumulator on stack
{
    (>> )print flush   % print prompt
    { /f (%lineedit) (r) file def } stopped {exit} if  % read input line or quit
    {
        f 1 string readstring not {exit} if   % read 1-char string from line
        cmd exch 2 copy known { get exec }{ pop pop } ifelse   % execute command or don't
        dup -1 eq 1 index 256 eq or { pop 0 } if   % adjust accumulator if needed
    } loop
    pop
}loop

2

C (224 212 karakter)

Bu muhtemelen kötü bir dil seçimidir, ama ah evet. C gibi bir dilin bir dinamik programlama diline göre yapabileceği bir şey değil. Clang'da, bunun için bir değer belirtmeniz gerekir return(bu, gcc için gerekli değildir).

#define s(x,y)case x:y;break;
main(){int c=10,a=0;for(;;){switch(c){s(-1,return)s('i':case'x',++a)s('d',--a)s('s':case'k',a*=a)s('c':case'o',printf("%d\n",a))s(10,printf(">> "))}a!=-1&a!=256||(a=0);c=getchar();}}

Sadece kaldırmak define qve sadece kullanmak daha kısa olmaz mıydı printf?
Doorknob

@DoorknobofSnow Aslında hayır. q3 kez kullanılırsa, define q~ 2 karakter kazandırır.
Justin,

2

Lua, 230 228

a=0repeat io.write(">> ")x=io.read()for i=1,#x do c=x:sub(i,i)if c=="i"or c=="x"then a=a+1 elseif c=="d"then a=a-1 elseif c=="s"or c=="k"then a=a*a elseif c=="o"or c=="c"then print(a)end if a==256or a==-1then a=0 end end until _

En kötüsü değil, en iyisi değil.

NOT: @mniip tarafından bildirildiği gibi 256ortercümanınızda çalışmayabilir. Yorumlarda daha fazla bilgi.

(az ya da çok) Okunabilir sürüm:

a=0
repeat
  io.write(">> ")
  x=io.read()
  for i=1,#x do
    c=x:sub(i,i)
    if c=="i"or c=="x"then
      a=a+1
    elseif c=="d"then
      a=a-1
    elseif c=="s"or c=="k"then
      a=a*a
    elseif c=="o"or c=="c"then
      print(a)
    end
    if a==256or a==-1then
      a=0
    end
  end  
until _

Çıktı:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

Düzenleme: 2 karakter optimizasyonu için @mniip sayesinde : until nil->until _


repeat until x(x tanımlanmadığı gibi sıfırdır) 2 karakter daha kısadır ve while 1 do endbununla aynı uzunluktadır; 256ortercümanımda geçersiz sözdizimi nedir
mniip

@mniip İpucu için teşekkürler repeat until x. Buradan en son windows binary kullanıyorum . Gördüğünüz a=a+1 elseifgibi yer var. Çünkü eon altılık basamaktır, oiçinde 256ordeğilken, bu yüzden tercümanım orbaşka bir ifade / blok / howYouCallIt olarak alır.
Egor305

evet 256or, ayrıca 0repeatve ayrıca 1then; Lua.org sitesinden resmi lua kullanıyorum, kodunuz 5.1, 5.2 veya 5.3'te
derlemiyor

2

Haskell , 186 178 bayt

Bu, her ikisinin de varsayılan olarak oldukça fazla sayıda baytın güvenliğini sağladığından dolayı runhaskell(veya içinde ghci) çalıştırılması gerekir:BufferModeNoBuffering

infix 4#
-1#x=0#x
256#x=0#x
r#x:y=case x of 'i'->r+1#y;'x'->r+1#y;'d'->r-1#y;'s'->r^2#y;'k'->r^2#y;'o'->print r>>r#y;'c'->r#'o':y;_->r#y
r#_=putStr">> ">>getLine>>=(r#)
main=0#""

Çevrimiçi deneyin!

açıklama

Bu yeni bir operatöre tanımlar state # source(sabitlik bildirimi diğer operatörler ile bağlantılı olarak kullanırken bize parantez düşüş sağlar (+), (-), (^), (:)ve (>>)):

  • ilk iki satır devletler "düzeltmek" -1ve256
  • daha sonra ilk karakterle eşleşir ve ona etki eder
  • ( r#_) karakterleri tükendiğinde yenilerini okur ve eski durumunu koruyarak yeniden başlar

Süreci başlatmak için durumu başlatır 0ve yeni bir kaynak satırı okuruz, örn. boş bir kaynakla başla:

main=0#""

1

Windows Toplu İşi, 204 256

@echo off
set a=0
:a
set /p i=^>^> 
if %i%==i set /a a=%a%+1
if %i%==x set /a a=%a%+1
if %i%==d set /a a=%a%-1
if %i%==s set /a a=%a%*%a%
if %i%==k set /a a=%a%*%a%
if %i%==o echo %a%
if %i%==c echo %a%
if %a%==256 set a=0
if %a%==-1 set a=0
set i=n
goto a

Diğer komutları başarıyla yok sayar. Gerçekten orçalışmak zorunda kalmadan şişirildi ...

Düzenle:

Sabit:

  • Artık tüm komutları tekrarlama
  • Aslında / a ile matematik yapmak yaptı
  • -1’de sıfırla
  • Her döngüden sonra girişi sıfırla

Bu 52 karakter maliyeti.

Düzeltmedi:

  • 0 karesi a'da "0 * 0" yazar.
  • Boşluk girmek (veya henüz açtığınızda hiçbir şey girmek) komut dosyası çökmesine neden olur.
  • Bir seferde bir karakter girmeniz GEREKİR.

2
Bu sadece düz hiç çalışmıyor (Windows 7). Pislik olmak istemem ama bunu test ettin mi?
marinus

@ marinus Bu sorun giderildi.
Timtech

1

Windows Komut Denetimi - 154

Abusin bilinmeyen özellikleri maks.

@echo off
set i=1
set x=1
set d=-1
set/as=[*[-[
set/ak=[*[-[
set.=0
set/p.=^>^> 
set/a[=[+%.%
e%.:o=c%h%.:c=o% %[% 2>nul
set[=%[:-1=%
if;%[%==256 set[=
%0

1

> <> , 258 bayt

Ben başka bir> <> cevap yaptım çünkü aşamayı test edemedim ve zaten bir kabuk taklit etmek yerine önceden istiflenmiş komutlar kullandı.

0v
"<vooo">> 
!~>i:0)?v~ >
 ^?=a:  /  ^!?="c"v?="o":v?="s":v?="k":v?="d":v?="x":v?="i":
   voan:<        ~<  v*:~<      <  v-1~<  v+1~<      <
   <                 <             <      <vv?=-10:v?=*:+1f:
  v                                        <>      >~0

Kesinlikle golf oynayabilir, ama gerekli delilik cesaretine sahip olacağımdan emin değilim !

Windows 7 altında cygwin altında python 3.5 altında çalışan resmi tercüman ile test ettim ve test çalışmasını yeniden yapabilir:

$ python fish.py deadfish.fish
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> (pressed ctrl-Z)Stopped

Makinenizde çalıştıramazsanız (giriş zor görünüyorsa) veya başka herhangi bir yazılım olmadan denemek istiyorsanız, çevrimiçi yorumlayıcıda aşağıdaki sürümü kullanabilirsiniz .

0v
 <vooo">> "<
  >i:0)?v~
      o:/  ^!?="c"v?="o":v?="s":v?="k":v?="d":v?="x":v?="i":
 ^oanoa:<        ~<  v*:~<      <  v-1~<  v+1~<      <
   <                 <             <      <vv?=-10:v?=*:+1f:
  v                                        <>      >~0

Onları çevrimiçi yorumlayıcıya giremediğiniz için açıkça görüldüğü gibi \ n ve EOF’nin gözardı edilmesine karşın, her çıkış komutundan sonra enter tuşuna basılmış gibi davranır.


1

C (gcc) , 139 bayt

İle derleyin -Dk="_nZZiaeY"(bayt sayısına dahil). Bilgi istemine >>\nizin verilirse -2 bayt .

x;f(c){for(printf(">>");c=getchar()-10;x+=c--?c--?c--?c||printf("%i\n",x),0:x*x-x:-1:1,x*=~x&&x^256)c=strchr(k,c)-k>>1;f();}

Çevrimiçi deneyin!

Degolf

/** Preprocessor **/
-Dk="_nZZiaeY" // This is a lookup string; it corresponds to "ixddskoc",
               // with 10 deducted from each character. Upon compilation, 
               // all occurences of the string literal are replaced with a 
               // pointer to its location in memory.

/** Source **/
x;f(c){ // x: 32-bit accumulator, c: local variable for read character
    for(printf(">>"); // Start for-loop and print prompt.
            c=getchar()-10; // Read a character from STDIN.
                            // Loop breaks if it is '\n'.

            // The below happens at the end of each iteration.
            x+=c--?c--?c--? 
               // Find the correct operation by testing c and post-
               // decrementing with multiple ternary-ifs. If c is 0, 
               // operation was found, add the else-value to the 
               // accumulator x.
               //     If the character is invalid, the value of c is
               // very large, and will not reach 0 with 3 decrements.

               c||printf("%i\n",x),0 
               // If c-3 is 0, print accumulator, else do nothing.
               // Returns 0 regardless of what happens. (No change to x)
               :x*x-x 
               // Square. Results in x=x+x*x-x, and is shorter than (x*=x)
               :-1:1, 
               // Decrement, Increment.
               x*=~x&&x^256 
               // Because -1==0xffffffff, ~x==0 when x==-1. Likewise,
               // x^256==0 only when x==256. The logical-AND coerces the result
               // to boolean 1 (no match) or 0 (match). Multiplication resets
               // the accumulator as appropriate.
           )
        // This is the actual body of the for-loop
        c=strchr(k,c)-k>>1; 
           // Finds the index of the read character in the lookup string,
           // then "divides" it by two.
           // Because strchr() returns NULL (0) when character is not found,
           // deducting k from it results in a very negative number.
           // The right-shift results in division by 2 for positive numbers, 
           // while the negative numbers become very large positive numbers
           // (c >= 0x70000000) because of the 2's complement representation.
    // Finally, recurse until forceful termination.
    f();
}

1

Fıçı , 68B

0{'::"ÿ1+=$0<+['_0"] \>\>\
,,,,?:o=[':."]:i=['1+"]:d=['1-"]:s=[':*"

0

Haskell, 230

import System.IO
i""n=[]
i(a:b)n 
 |a=='o'||a=='c'=[n]++i b n
 |True=i b$v a n
v a n=w(case a of 'i'->n+1;'x'->n+1;'d'->n-1;'s'->n^2;'k'->n^2)
w(-1)=0
w 256=0
w n=n
main=do;putStr ">> ";hFlush stdout;s <- getLine;print$i s 0;main

Keşke bu sinir bozucu hFlush stdoutaramadan kurtulabilseydim ! Onsuz, bir oişlem gerçekleştirilinceye kadar bilgi istemi görüntülenmez . Herhangi bir tavsiye?


Derleme yerine hFlushkullanarak ondan kurtulabilirsin ( cevabımı gör ), ama bu çözüm için geçerli değil ve hatalar çıktı. runhaskell
24'te

0

PHP + HTML 345

<form><?php $i=0;$o='';if(isset($_GET[i])){$i=$_GET[a];foreach(@str_split($_GET[i]) as $j=>$v){$v==i||$v==x?$i++:($v==d?$i--:($v==k||$v==s?$i*=$i:($v==o||$v==c?$o.=$i."\n":'')));($i==256||$i==-1)&&$i=0;}$_GET[p].='>> '.$_GET[i]."\n".$o;echo"<textarea locked name=p>$_GET[p]</textarea><input type=hidden name=a value=$i><br>";}?>>> <input name=i>

çıktı biraz kabataslak (geçmiş / oturum bir textarea'da gösteriliyor ve hata bildirimi etkinken birçok uyarı basılıyor) ancak her şey çalışıyor


0

> <>, 239

v
\r0&
v                  <
\&::&01-=$f1+:*=+?v
v             &0~&<
\:"i"=?v
       >~&1+&      ^
\:"d"=?v
       >~&1-&      ^
\:"s"=?v
       >~&:*&      ^
\:"o"=?v
       >~&:o&      ^
\:"h"=?v
       >~;        (^)
>~                 ^

İlk yığın giriş. Burada çevrimiçi deneyebilirsiniz .


0

Golf-Basic 84, 88 karakter

:0_A:0_O:1_I:2_D:3_S:O_C:I_X:S_Kl`1i`N@A=256:0_A@N=0d`A@N=1:A+1_A@N=2:A-1_A@N=3:A^2_Ag`1

En az 3 diğer çözümde olduğu gibi bir seferde bir komut ister. İşte bir deneme çalıştırması xiskisc:

?X
?I
?S
?K
?I
?S
?C
             289

Ayrıca, xisksoolması gerektiği gibi 0 verir.


Başka hangi çözümler bir seferde bir komut ister?
Ry-

1
Haskell'i bir tane yazdım ve hayır değil. Perl de değil, yani neden bahsettiğinden emin değilim.
Ry-

1
Bu, G / Ç kurallarına uymaz.
marinus

1
Yine de kuralları takip etmiyor ve küçük harf yerine büyük harf kullanıyor.
lirtosiast

1
TI-BASIC'i biliyorsanız, yalnızca büyük harf girişini destekler.
Timtech

0

JavaScript (Node.js), 204 Bayt

process.openStdin(f=a=>process.stdout.write((i=0,""+a).split` `.map(x=>([...x.slice(0,-1)].map(d=>({i:x=e=>i++,d:e=>i--,s:k=e=>i*=i,o:c=e=>e,x,k,c})[d](i=-1||i==256?i=0:0)),i))+"\n>> "),f``).on("data",f)

Bu muhtemelen golf olabilir. Node.js yine garip gizlenmiş ayrıntısızlığın bir kez daha olduğunu kanıtladı. Açıklanan kod:

process.openStdin( // This function has to be called to take input, but doesn't have arguments
  f=a=> // Define a function f. This is the deadfish interpreter. It takes an argument `a` which is a Buffer
  process.stdout.write( // Same as console.log, but doesn't output trailing newline
    (i = 0, "" + a) // Take advantage of comma operator to (A) define the accumulator i, and casts a (which is a Buffer) to a String
      .split` ` // Split the string a at spaces, making it an array
      .map(     // Map through each element of the array
        x=>     // Map function, takes argument x, the value in the array (string)
          ([...x.slice(0,-1)] // Remove the last character (newline) and than use the spread operator to divide the string into an array of it's chars
            .map(d=> // Map function, you know how this works
              ({ // Here I define the various deadfish commands
                i: x = e => i++,
                d: e => i--,
                s: k = e => i*=i,
                o: c = e => e,
                // Take advantage of ES6 object notation. Equivilent to {"x": x, "k": k, "c", c}
                x,
                k,
                c
              })
              [d] // Get the command to execute. If this is passed something which isn't valid, a giant error will appear
              (
                i==-1 || i==256 ? i = 0 : 0 // Take advantage of the fact that none of the command functions take arguments to handle the strange "overflow"
              )
            ),
          i)
      ) +
  "\n>> "), // Display the prompt again, as well as a newline
  f`` // Initalize the prompt by passing an empty script
)
.on("data",f) // Bind the f function to newline on STDIN

0

C #, 311 bayt

using System;class p{static void Main(){int a=0;int s(int b)=>b==-1||b==256?0:b;while(true){Console.Write(">>");var c=Console.ReadLine();for(int i=0;i<c.Length;i++){switch(c[i]){case'i':case'x':a=s(a+1);break;case'd':a=s(a-1);break;case's':case'k':a=s(a*a);break;case'o':case'c':Console.WriteLine(a);break;}}}}}

Sadece bir fonksiyon tanımlaması sağlayarak, kullanımlar ve sınıf beyanları vb.

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.