Tulis penerjemah Deadfish interaktif

30

Deadfish adalah lelucon "bahasa pemrograman" dengan empat perintah. Karena halaman Esolang agak kontradiktif dan penerjemah pada halaman itu tidak semuanya bekerja persis sama, Anda harus menerapkan variasi berikut:


Spesifikasi

  1. Ada akumulator yang setidaknya 16 bit dalam ukuran, lebih banyak diperbolehkan tetapi lebih sedikit tidak. Angka negatif tidak perlu didukung. Akumulator adalah 0ketika program dimulai.
  2. Ada dua set empat perintah berikut, dan program Anda harus mendukung keduanya pada saat yang sama.
      Deadfish Standar │ Varian XKCD │ Artinya
      ────────────────────aha ──────────────────────────
            i │ x │ Akumulator kenaikan
            d │ d │ Akumulator penurunan
            s │ k │ Kotak (acc = acc * acc)
            o │ c │ Output akumulator, sebagai angka
    
  3. Jika, setelah menjalankan perintah, akumulator adalah salah satu -1atau 256, akumulator harus diatur ulang ke nol. Perhatikan bahwa ini bukan bungkus biasa. Jika, katakanlah, akumulator adalah 20, dan sperintah dijalankan, akumulator harus 400sesudahnya. Demikian pula, jika akumulator 257dan dperintah dijalankan, akumulator harus menjadi 0.
  4. Masukan apa pun yang bukan salah satu dari perintah ini harus diabaikan.

Program uji

  • xiskso harus keluar 0
  • xiskisc harus keluar 289

I / O

Program Anda harus menampilkan prompt: >>. Prompt harus di awal baris baru. Kemudian harus membaca baris input pengguna, dan menjalankan perintah yang diberikan dari kiri ke kanan. Saat mengeluarkan angka, angka harus dipisahkan. Yaitu, 12 34tidak apa-apa, 12,34tidak apa-apa,

12
34 

tidak apa-apa, tetapi 1234tidak.

Program Anda harus terus melakukan ini dalam satu lingkaran, setidaknya sampai EOFtercapai.

Sesi contoh:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> 
marinus
sumber
Karena permintaan input, saya tidak bisa menggunakan GolfScript :-(
ProgramFOX
@ProgramFOX: Anda dapat menggunakan input ruby, bukan?
marinus
Menurut tutorial GolfScript, Anda tidak dapat meminta input dalam GolfScript, semua input berasal dari STDIN.
ProgramFOX
@ProgramFOX: Saya akan berpikir sesuatu seperti #{STDIN.gets}akan bekerja tetapi memang tidak.
marinus
Apakah kami diperbolehkan mengambil input dengan huruf besar saja?
lirtosiast

Jawaban:

6

K, 77 byte

  {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

Perhatikan ini K4 . Sebuah K6 solusi adalah sedikit lebih panjang karena kata kerja IO lebih panjang, bahkan jika segala sesuatu yang lain yang lebih baik:

{""0:">>";0{x*^-1 256?x:y@x}/("xkcdiso"!7#(1+;{x*x};{""0:,$x;x};-1+))@0:"";o`}`
  • ""0:mencetak dan mengembalikan argumennya. Catatan dalam K4 kami hanya berlaku untuk 1 .
  • 0 f/ args menunjukkan pengurangan dengan nilai awal, yaitu f[f[0;first arg];second arg]…
  • {x*2=-1 256?x…mengklasifikasikan x ke dalam 0 (untuk -1), 1 (untuk 256) dan 2 untuk semua nilai lainnya. 2=berarti kita mendapatkan 1nilai yang tidak diklasifikasi dan 0jika tidak, mengalikan dengan xlebih pendek daripada persyaratan. Di K6 kita bisa melakukan sedikit lebih baik karena {x*^-1 256?x:y@x}bergantung pada fakta bahwa -1 256?xmengembalikan 0N(nol) dan ^mendeteksi nol.
  • The "parser" adalah peta "xkcdiso"alih-alih urutan yang disarankan karena 7#akan membungkus sekitar empat argumen yaitu 7#"abcd"pengembalian "abcdabc"yang membuat tabel kita lebih kecil
  • Peta menerjemahkan "x"dan "i"ke proyeksi 1+yang setara dengan fungsi {1+x}tetapi lebih pendek.
  • Peta diterjemahkan "d"ke proyeksi -1+yang setara dengan fungsi {-1+x}tetapi lebih pendek.
  • Peta menerjemahkan "k"dan "s"ke fungsi{x*x}
  • Peta menerjemahkan "c"dan "o"ke fungsi output {-1@$x;x}yang lagi di K6 sedikit lebih lama: {""0:,$x;x}tetapi keduanya mencetak outputnya diikuti oleh baris baru, dan kemudian mengembalikan argumen.
  • .zs adalah rekursi diri. Di K6 kita bisa mengatakan o`mana yang lebih pendek.
geocar
sumber
8

Perl 5 , 90 byte

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

Cobalah online!

Terima kasih kepada @xfix untuk bantuannya dalam hal ini sebelumnya! Disimpan 4 byte berkat @Xcali !

Dom Hastings
sumber
1
Program Anda mencetak 1ketika akumulator meluap. Selain itu, Anda dapat mempersingkat program dengan lima karakter, dengan mengubah $ake $?(yang diinisialisasi ke 0, dan tidak akan berubah hingga Anda menjalankan beberapa program eksternal dari Perl).
Konrad Borowski
Ahhhh, aku mencari variabel yang bisa aku gunakan, sempurna, terima kasih! Seperti untuk meluap, saya tidak menyadarinya karena itu hanya terjadi jika Anda menjalankan isssosebagai satu perintah, tidak jika Anda melakukan masing-masing secara terpisah ... Saya akan melihat ini nanti dan pasti akan digunakan $?. Terima kasih!
Dom Hastings
Jadi saya pikir saya meninggalkan versi yang lebih lama di bagian kode di atas dengan ''bukannya ""jadi ketika digunakan dengan perl -e '...'peta akan berakhir dengan hasil s///. Terima kasih lagi!
Dom Hastings
Oke, kamu yang terpendek.
marinus
1
Bukan lagi jawaban terpendek.
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){...} - atur akumulator ke 0 dan loop selamanya
  • read-host '>>' - dapatkan input pengguna dengan prompt >>
  • [char[]](...) - Mengonversi input pengguna ke array karakter
  • |%{...} - Melakukan apa yang ada di dalam {}untuk setiap karakter
  • switch -r($_) - Regex switch untuk setiap karakter
  • "i|x"{$x++} - cocokkan iatau x- tambah akumulator
  • "d"{$x-=!!$x} - Pertandingan d- penurunan $xoleh !!$x, yang akan 0jika $xini 0, dan 1sebaliknya. Ini memastikan akumulator tidak pernah mencapai -1.
  • "s|k"{$x*=$x} - cocok satau k- kotak
  • "o|c"{$x} - cocokkan oatau c- output akumulator
  • $x*=$x-ne256- kalikan akumulator dengan 0jika itu 256atau dengan 1sebaliknya

Contoh output

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

Saya kira implementasi read-hostadalah khusus host, jadi host Powershell ini (ConsoleHost) menambahkan :ke prompt yang ditentukan.

Danko Durbić
sumber
Bagus! Sukai decrement !!$x, sayang saya tidak bisa memanfaatkan itu ...
Dom Hastings
Hei Danko, bisakah Anda memposting beberapa hasil tes? Saya tidak berpikir saya dapat menguji catu daya pada non-windows ... (perbaiki saya jika saya salah!)
Dom Hastings
Saya telah menambahkan beberapa hasil tes ke jawabannya.
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]

Versi lebih cantik:

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]
kealis
sumber
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
Ry-
sumber
Anda mungkin dapat menyimpan beberapa karakter dengan mengubah edan vmenjadi operator. Saya juga mencoba menulis ulang vdan gagar parameter xtetap di IO, dan printlain - lain terangkat. Saya tidak berhasil membuatnya bekerja, tetapi saya pikir itu mungkin tempat yang baik untuk seseorang yang tahu haskell mereka.
shiona
@shiona: Ya, hal tentang menyimpan sesuatu IOadalah mereka mencetak terlalu sering (itu sebabnya saya menggunakan r nalih-alih x) atau tidak cukup karena nilainya tidak pernah diminta untuk…. Jadi bagaimana saya akan berubah edan vmenjadi operator?
Ry-
Saya memiliki masalah yang sama dengan pencetakan. Apa yang datang ke operator yang dapat Anda lakukan (menggunakan e sebagai contoh) 'i'%x=x+1;'d'%x=x-1... Dan panggil saja di v do n<-x;r$w$o%n. Alasan operator menghemat ruang adalah karena mereka tidak memerlukan ruang di sekitarnya.
shiona
@shiona: Oh! Panggilan bagus, terima kasih!
Ry-
Tidak masalah. Saya pertama kali berpikir untuk membuat jawaban saya sendiri tetapi karena saya tidak bisa mendapatkan ide-ide besar saya bekerja saya pikir itu akan menjadi posting kasar hanya kode yang persis sama dengan notasi yang berbeda untuk fungsi yang sama.
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;'}}

Sesi sampel (sama seperti milik Anda):

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
>>
Gagang pintu
sumber
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
>>
tmartin
sumber
Versi saya lebih pendek. Saya mengompres peta, bergantung pada ? untuk mengklasifikasikan nilai "pembungkus", menggunakan rekursi alih-alih sementara, dan penerjemah fungsional alih-alih mengubah.
geocar
4

Ada

Berikut adalah implementasi Ada untuk beberapa orang yang tertarik dengan bahasa ini. Butuh beberapa waktu untuk menggunakan beberapa praktik terbaik Ada (seperti penggunaan Indefinite_Holders alih-alih akses) dan juga untuk sepenuhnya memahami bagaimana Deadfish harus bekerja.

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;

Dan hasilnya:

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

Jika beberapa orang yang bereksperimen di Ada dapat memberikan saya beberapa petunjuk optimasi, saya akan berterima kasih.

Jérémy Ruelle
sumber
1
Selamat datang di PPCG! Tujuan dari kode-golf adalah untuk membuat kode sesingkat mungkin, dan Anda harus memasukkan ukuran program Anda di header (1396 bytes di sini)
TuxCrafting
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;
}

Saya mencoba pendekatan lain berdasarkan pengaturan tabel pencarian untuk decoding instruksi, tapi sayangnya itu berakhir lebih lama ( 169 ). Saya memasukkannya karena seseorang mungkin akan menghasilkan tweak yang pintar untuk mengurangi ukurannya. (Harus dijalankan tanpa argumen)

#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();
}
FireFly
sumber
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();}
Darren Stone
sumber
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,""))

Ini menghasilkan baris baru setelah >>, tetapi OP tidak mengatakan itu tidak diizinkan. Tidak lagi!

Terima kasih GlitchMr, minitechdan golfer9338!

jazzpi
sumber
1
Anda dapat menggunakan lambdaalih-alih defuntuk fungsi yang segera kembali.
Konrad Borowski
x in(-1,256)menyimpan dua karakter. Atau, s=lambda x:"a=%d"%(x!=-1and x!=256and x)bisa menghemat beberapa.
Ry-
1
Anda bisa menghapus print(">>")dan menggunakan for i in input(">>")sebagai gantinya; input()memungkinkan menentukan prompt. Kemudian, tidak akan ada baris baru setelahnya >>, dan Anda menyimpan karakter.
pegolf9338
Skor Anda seharusnya, saya pikir, satu char lebih pendek sekarang. Tolong gandakan cek, tapi saya mendapat hitungan 161 daripada baris 162: yang dipasang 3 + 40 + 8 + 107, ditambah 3 baris baru. Sejujurnya, saya cemburu, karena bagaimanapun, Anda beberapa karakter lebih pendek dari jawaban C. Tepuk tangan!
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")}}

Versi tidak disatukan:

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

Sesi contoh (dalam mode interaktif):

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

Python 3, 141

Saya tahu saya terlambat, tetapi saya ingin mengambil kesempatan untuk memposting versi Python yang lebih pendek (dan upaya CodeGolf pertama saya). :)

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,'')+')')

Pernyataan cetak agak sulit untuk ini. Jika prompt harus diakhiri dengan spasi, tambahkan satu karakter ke dalam hitungan. :)

Penjelasan

v adalah akumulator.

mmemeriksa apakah nilai yang diberikan adalah -1atau 256. Jika demikian, 0akan dikembalikan, nilainya sebaliknya.

Pada baris berikut operasi ditugaskan ke variabel yang sesuai (karena beberapa memiliki arti yang sama (seperti idan x) ini lebih pendek daripada membuat kamus baru). Itu kemudian digunakan di execbawah ini.

while 1: adalah loop utama

Sekarang kesenangan dimulai. Seperti solusi @jazzpi , ia mengulangi setiap karakter dari input. locals()adalah kamus untuk semua variabel saat ini (terlihat). Dengan .get(n,'')kunci yang sesuai akan dimasukkan ke dalam exec-string (string kosong, jika kunci (= input lain) tidak ditemukan). Ini kemudian akan, ketika dieksekusi, digabungkan dengan vdan diteruskan m. Nilai pengembalian akan disimpan vlagi.

Contoh singkat:

Be n = 'i'( n= input-char), kita '+1'keluar dari locals-block seperti ivariabel dengan nilai '+1'.
String untuk execdibandingkan terlihat seperti ini: 'v=m(v+1)'.
Mungkin sekarang lebih mudah untuk melihat, bahwa, ketika mengeksekusi, ia akan memanggil mdengan nilai v+1dan menyimpan outputnya vlagi.

Ulangi ini sampai Anda bosan. :)

Dave J
sumber
Saya menyadari bahwa saya SANGAT terlambat ke pesta, tetapi lambda untuk m dapat y*(-1!=y!=256)sebesar -3 byte
Pasang kembali Monica
hanya 5 tahun :) terima kasih atas masukannya. Saya terlalu malas untuk memperbaiki jawabannya, tetapi saya akan mengingatnya
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

Ini rapi, tetapi juga cukup mudah. Ini versi yang lebih panjang dan keren:

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)

Dengan bobot 190 karakter, ini mungkin bukan jawaban yang paling kompetitif di sini. Di sisi lain, coroutine sangat bagus dan saya selalu mencari alasan untuk menggunakan (dan membagikannya)

dingusman
sumber
3

TI-BASIC, 104 107 102 100 98

Untuk kalkulator TI-83 + / 84 + series.

Beri nama ini prgmD; akhirnya meluap tumpukan dengan memanggil dirinya sendiri. Ganti rekursi dengan While 1, dengan biaya dua byte, untuk memperbaikinya.

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

Secara default Y adalah 0, jadi jalankan ini dengan kalkulator yang baru saja dihapus oleh memori atau simpan 0 hingga Y secara manual sebelum menjalankan ini.

Sayang sekali bahwa huruf kecil (dalam string literal) masing-masing adalah dua byte; kalau tidak, ini akan lebih pendek dari jawaban Dom Hastings.

EDIT: Memperbaiki kesalahan divide-by-zero (0 ^ 0) dengan biaya tiga byte.

107 -> 102: Trik eksponensial imajiner yang digunakan untuk menyimpan empat byte (termasuk 1 dari tanda kurung dan -1 dari pemanjangan string pencarian) dan menggunakan Y bukan X, yang membutuhkan satu byte kurang untuk menginisialisasi.

lirtosiast
sumber
2

Catatan tambahan 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

Tidak Disatukan:

/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
luser droog
sumber
2

C (224 212 karakter)

Ini mungkin pilihan bahasa yang buruk, tapi oh well. Bukannya bahasa seperti C dapat melakukan lebih baik daripada beberapa bahasa pemrograman dinamis. Pada Dentang, Anda harus menentukan nilai untuk return(ini tidak perlu untuk gcc).

#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();}}
Konrad Borowski
sumber
Bukankah lebih pendek untuk hanya menghapus define qdan hanya menggunakan printf?
Gagang Pintu
@DoorknobofSnow Sebenarnya tidak. qdigunakan 3 kali, jadi define qhemat ~ 2 karakter.
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 _

Bukan yang terburuk, bukan yang terbaik.

CATATAN: seperti yang dilaporkan oleh @mniip 256or mungkin tidak berfungsi pada juru bahasa Anda. Info lebih lanjut dalam komentar.

(kurang lebih) Versi yang dapat dibaca:

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 _

Keluaran:

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

Sunting: terima kasih kepada @mniip untuk optimasi 2 karakter: until nil->until _

Egor305
sumber
repeat until x(x nihil seperti yang tidak didefinisikan) adalah 2 karakter lebih pendek, dan while 1 do endpanjangnya persis sama, selain itu versi lua apa itu? 256orsintaks tidak valid dalam juru bahasa saya
mniip
@mniip Terima kasih atas petunjuk tentang repeat until x. Saya menggunakan windows binary terbaru dari sini . Seperti yang Anda lihat a=a+1 elseifada ruang. Itu karena eadalah digit heksadesimal, sementara odi dalam 256ortidak, jadi penerjemah saya mengambil orpernyataan / blok / howYouCallIt lainnya.
Egor305
ya cukup banyak selain itu 256or, juga 0repeatdan 1then; Saya menggunakan lua resmi dari lua.org, kode Anda tidak dapat dikompilasi di 5.1, 5.2, atau 5.3
mniip
2

Haskell , 186 178 byte

Kebutuhan ini harus dijalankan dengan runhaskell(atau di dalam ghci) karena mereka berdua mengatur BufferModeuntuk NoBufferingsecara default yang brankas cukup banyak byte:

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#""

Cobalah online!

Penjelasan

Ini mendefinisikan operator baru state # source(deklarasi ketetapan memungkinkan kita untuk menjatuhkan kurung ketika menggunakannya bersama dengan operator lain (+), (-), (^), (:)dan (>>)):

  • dua baris pertama "memperbaiki" negara -1dan256
  • kemudian cocok dengan karakter pertama dan menindaklanjutinya
  • setelah kehabisan karakter ( r#_), ia membaca yang baru dan mulai lagi menjaga keadaan lama

Untuk memulai proses, kami menginisialisasi keadaan dengan 0dan membaca baris sumber baru, yaitu. mulai dengan sumber kosong:

main=0#""
ბიმო
sumber
1

Windows Batch, 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

Berhasil mengabaikan perintah lain. Benar-benar kembung tanpa harus orbekerja dengan ...

Edit:

Tetap:

  • Tidak ada lagi Echoing semua perintah
  • Membuatnya benar-benar MELAKUKAN matematika dengan / a
  • Setel ulang pada -1
  • Atur ulang input setelah setiap siklus

Ini biaya 52 karakter.

Tidak diperbaiki:

  • Mengkuadratkan 0 menulis "0 * 0" dalam a.
  • Memasukkan spasi (atau memasukkan apa pun, saat Anda baru saja membukanya) membuat crash script.
  • Anda PERLU untuk memasukkan satu karakter sekaligus.
Timtech
sumber
2
Ini hanya tidak berfungsi sama sekali (Windows 7). Saya tidak bermaksud menjadi orang brengsek, tetapi apakah Anda menguji ini?
marinus
@marinus Sudah diperbaiki.
Timtech
1

Script Perintah Windows - 154

Abusin fitur yang tidak diketahui secara maksimal.

@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
Robert Sørlie
sumber
1

> <> , 258 byte

Saya sudah melakukan jawaban>>> lain karena saya tidak bisa menguji fase dan menggunakan perintah pra-ditumpuk daripada meniru shell pula.

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

Bisa dipastikan golf, tapi saya tidak yakin saya akan memiliki keberanian gila yang dibutuhkan !

Saya mengujinya dengan interpreter resmi yang berjalan di bawah python 3.5 di bawah cygwin di bawah windows 7 dan dapat mereproduksi uji coba:

$ 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

Jika Anda tidak dapat menjalankannya di komputer Anda (input tampaknya rumit) atau Anda hanya ingin mencobanya tanpa perangkat lunak lain, Anda dapat menggunakan versi berikut pada penerjemah online .

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

Jelas mengabaikan \ n dan EOF karena Anda tidak dapat memasukkannya dalam juru bahasa online, tetapi akan berperilaku seolah-olah masuk telah ditekan setelah setiap perintah keluaran.

Harun
sumber
1

C (gcc) , 139 byte

Kompilasi dengan -Dk="_nZZiaeY"(termasuk dalam jumlah byte). -2 byte jika prompt >>\ndiizinkan.

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

Cobalah online!

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

sumber
1

Tong , 68B

0{'::"ÿ1+=$0<+['_0"] \>\>\
,,,,?:o=[':."]:i=['1+"]:d=['1-"]:s=[':*"
SEBUAH
sumber
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

Kalau saja aku bisa menyingkirkan hFlush stdoutpanggilan sial itu ! Tanpa itu, prompt tidak akan ditampilkan sampai ooperasi dilakukan. Ada saran?

danmcardle
sumber
Anda dapat membuangnya hFlushdengan menggunakan runhaskellalih-alih kompilasi (lihat jawaban saya ), tetapi untuk solusi ini tidak valid dan kesalahan keluar.
ბიმო
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>

output sedikit samar (sejarah / sesi ditampilkan pada textarea, dan dengan pelaporan kesalahan diaktifkan banyak peringatan dicetak) tetapi semuanya berfungsi

Einacio
sumber
0

> <>, 239

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

Tumpukan awal adalah input. Anda dapat mencobanya online di sini .

tahap
sumber
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

Meminta satu perintah pada satu waktu, seperti dalam setidaknya 3 solusi lainnya. Berikut ini adalah uji coba untuk xiskisc:

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

Juga, xisksomenghasilkan 0, sebagaimana mestinya.

Timtech
sumber
Solusi lain mana yang meminta satu perintah pada satu waktu?
Ry-
1
Saya menulis Haskell, dan tidak, tidak. Juga tidak yang Perl, jadi saya benar-benar tidak yakin apa yang Anda bicarakan.
Ry-
1
Ini tidak mengikuti aturan I / O.
marinus
1
Masih tidak mengikuti aturan, dan menggunakan huruf besar daripada huruf kecil.
lirtosiast
1
Jika Anda tahu tentang TI-BASIC, itu hanya mendukung input huruf besar.
Timtech
0

JavaScript (Node.js), 204 Bytes

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)

Ini mungkin bisa golf. Node.js sekali lagi membuktikan bahwa itu adalah verbositas tersamar yang aneh sekali lagi. Kode menjelaskan:

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
MayorMonty
sumber
0

C #, 311 byte

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

akan menjadi 283 byte jika usings dan deklarasi kelas dll dapat dihentikan dengan hanya memberikan definisi fungsi

Robin B
sumber