เขียนล่าม Deadfish แบบโต้ตอบ


30

Deadfishเป็นเรื่องตลก "ภาษาโปรแกรม" ที่มีสี่คำสั่ง เนื่องจากหน้า Esolang มีข้อขัดแย้งเล็กน้อยและล่ามในหน้านั้นไม่ทำงานเหมือนกันทุกประการคุณควรใช้รูปแบบต่อไปนี้:


สเปค

  1. มีแอคคูมูเลเตอร์ซึ่งมีขนาดอย่างน้อย 16 บิตอนุญาตเพิ่มเติมได้ แต่น้อยกว่า ไม่รองรับหมายเลขติดลบ ตัวสะสมคือ0เมื่อโปรแกรมเริ่มทำงาน
  2. มีสองคำสั่งสี่ชุดต่อไปนี้และโปรแกรมของคุณต้องรองรับทั้งสองอย่างในเวลาเดียวกัน
      Deadfish มาตรฐาน│ตัวแปร XKCD │ความหมาย
      ─────────────────────┼──────────────────┼───────── ───────────────────────────
            i │ x │ตัวสะสมเพิ่ม
            d │ d │ลดการสะสม
            s │ k │ Square (acc = acc * acc)
            o │ c │เอาท์พุทตัวสะสมเป็นจำนวน
    
  3. หากหลังจากเรียกใช้งานคำสั่งตัวสะสมจะเป็นอย่างใดอย่างหนึ่ง-1หรือ256ตัวสะสมจะต้องถูกรีเซ็ตเป็นศูนย์ โปรดทราบว่านี่ไม่ใช่การห่อแบบธรรมดา ถ้าพูดว่าตัวสะสมคือ20และsเรียกใช้คำสั่งสะสมควรจะ400หลังจากนั้น ในทำนองเดียวกันถ้าสะสมเป็น257และคำสั่งที่มีการเรียกใช้สะสมควรจะเป็นd0
  4. ควรละเว้นอินพุตที่ไม่ใช่คำสั่งเหล่านี้อย่างใดอย่างหนึ่ง

โปรแกรมทดสอบ

  • xiskso ควรส่งออก 0
  • xiskisc ควรส่งออก 289

I / O

โปรแกรมของคุณควรแสดงพรอมต์: >>. พรอมต์ต้องอยู่ที่จุดเริ่มต้นของบรรทัดใหม่ จากนั้นควรอ่านบรรทัดอินพุตของผู้ใช้และรันคำสั่งที่กำหนดจากซ้ายไปขวา เมื่อแสดงผลตัวเลขจะต้องแยกตัวเลข คือ12 34ตกลง12,34ตกลง

12
34 

ก็โอเค แต่1234ไม่ใช่

โปรแกรมของคุณควรทำเช่นนี้เป็นวงอย่างน้อยก็จนกว่าEOFจะถึง

ตัวอย่างเซสชัน:

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

เนื่องจากการพร้อมท์ป้อนข้อมูลฉันไม่สามารถใช้ GolfScript :-(
ProgramFOX

@ProgramFOX: คุณสามารถใช้อินพุต ruby ​​ได้ไหม?
marinus

ตามบทช่วยสอน GolfScript คุณไม่สามารถขอให้ป้อนข้อมูลใน GolfScript อินพุตทั้งหมดมาจาก STDIN
ProgramFOX

@ProgramFOX: ฉันคิดว่าบางอย่าง#{STDIN.gets}จะใช้งานได้ แต่ก็ไม่เป็นเช่นนั้น
marinus

เราอนุญาตให้ป้อนตัวอักษรตัวพิมพ์ใหญ่แทนหรือไม่
lirtosiast

คำตอบ:


6

K, 77 ไบต์

  {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

หมายเหตุ: นี่คือK4 K6แก้ปัญหาคืออีกเล็กน้อยเพราะคำกริยา IO มีความยาวถึงแม้ว่าทุกอย่างอื่นจะดีกว่า:

{""0:">>";0{x*^-1 256?x:y@x}/("xkcdiso"!7#(1+;{x*x};{""0:,$x;x};-1+))@0:"";o`}`
  • ""0:พิมพ์และส่งคืนอาร์กิวเมนต์ หมายเหตุใน K4 เราก็นำไปใช้กับ1
  • 0 f/ args แสดงให้เห็นถึงการลดด้วยค่าเริ่มต้นคือ f[f[0;first arg];second arg]…
  • {x*2=-1 256?x…จำแนก x เป็น 0 (สำหรับ -1), 1 (สำหรับ 256) และ 2 สำหรับค่าอื่น ๆ ทั้งหมด 2=หมายความว่าเราได้รับ1ค่าที่ไม่เป็นความลับและ0มิฉะนั้นการคูณด้วยxจะสั้นกว่าเงื่อนไข ใน K6 เราสามารถทำได้ดีขึ้นเล็กน้อยเพราะ{x*^-1 256?x:y@x}อาศัยความจริงที่ว่า-1 256?xคืน0N(null) และ^ตรวจจับโมฆะ
  • "parser" เป็นแผนที่"xkcdiso"แทนที่จะเรียงตามลำดับที่แนะนำเพราะ7#จะล้อมรอบอาร์กิวเมนต์สี่ตัวเช่น7#"abcd"ส่งคืน"abcdabc"ซึ่งทำให้ตารางของเราเล็กลง
  • แผนที่แปล"x"และ"i"ฉายภาพ1+ซึ่งเทียบเท่ากับฟังก์ชั่น{1+x}แต่สั้นกว่า
  • แผนที่แปล"d"เป็นโปรเจคชัน-1+ซึ่งเทียบเท่ากับฟังก์ชั่น{-1+x}แต่สั้นกว่า
  • แผนที่แปล"k"และ"s"ฟังก์ชั่น{x*x}
  • แผนที่แปล"c"และ"o"ฟังก์ชั่นการส่งออก{-1@$x;x}ซึ่งอีกครั้งใน K6 จะยาวกว่าเล็กน้อย: {""0:,$x;x}แต่ทั้งคู่จะพิมพ์เอาต์พุตตามด้วยการขึ้นบรรทัดใหม่แล้วส่งกลับอาร์กิวเมนต์
  • .zsเป็นการเรียกซ้ำตัวเอง ใน K6 เราสามารถพูดได้ว่าo`อันไหนที่สั้นกว่า

8

Perl 5 , 90 ไบต์

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

ลองออนไลน์!

ขอบคุณ@xfixสำหรับความช่วยเหลือของเขาก่อนหน้านี้! บันทึกแล้ว 4 ไบต์ขอบคุณ@Xcali !


1
โปรแกรมของคุณจะพิมพ์1เมื่อสะสมตัวล้น นอกจากนี้คุณยังสามารถย่อโปรแกรมของคุณให้เหลือห้าตัวอักษรโดยเปลี่ยน$aเป็น$?(ซึ่งถูกกำหนดค่าเริ่มต้นเป็น0และจะไม่เปลี่ยนแปลงจนกว่าคุณจะเรียกใช้โปรแกรมภายนอกจาก Perl)
Konrad Borowski

Ahhhh ฉันกำลังตามหาตัวแปรที่ฉันสามารถใช้ได้สมบูรณ์แบบขอบคุณ! สำหรับล้นผมไม่ได้แจ้งให้ทราบว่าในขณะที่มันจะเกิดขึ้นถ้าคุณใช้isssoเป็นคำสั่งอย่างใดอย่างหนึ่งไม่ได้ถ้าคุณทำแต่ละแยก ... $?ฉันจะมีลักษณะที่นี้ในภายหลังและจะใช้อย่างแน่นอน ขอขอบคุณ!
Dom Hastings

ดังนั้นผมจึงคิดว่าผมออกจากรุ่นเก่าในส่วนรหัสที่ด้านบนกับ''แทน""ดังนั้นเมื่อใช้งานร่วมกับแผนที่จะจบลงด้วยผลมาจากการที่perl -e '...' s///ขอบคุณอีกครั้ง!
Dom Hastings

ตกลงคุณสั้นที่สุด
marinus

1
ไม่มีคำตอบที่สั้นที่สุดอีกต่อไป
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){...} - ตั้งค่าตัวสะสมเป็น 0 และวนซ้ำตลอดไป
  • read-host '>>' - รับอินพุตของผู้ใช้ด้วยพรอมต์ >>
  • [char[]](...) - แปลงอินพุตของผู้ใช้เป็นอาร์เรย์ของอักขระ
  • |%{...} - ทำสิ่งที่อยู่ภายใน{}สำหรับตัวละครแต่ละตัว
  • switch -r($_) - สวิตช์ regex สำหรับอักขระแต่ละตัว
  • "i|x"{$x++} - จับคู่iหรือx- เพิ่มตัวสะสม
  • "d"{$x-=!!$x} - การแข่งขันd- ลดลง$xโดย!!$xซึ่งจะเป็น0ถ้า$xเป็น0และ1เป็นอย่างอื่น -1ซึ่งทำให้แน่ใจสะสมไม่ถึง
  • "s|k"{$x*=$x} - จับคู่sหรือk- สี่เหลี่ยม
  • "o|c"{$x} - จับคู่oหรือc- เอาท์พุทแอคคูเลเตอร์
  • $x*=$x-ne256- คูณตัวสะสมด้วย0ถ้ามันเป็น256หรือโดยวิธี1อื่น

ตัวอย่างผลลัพธ์

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

ฉันเดาว่าการนำไปปฏิบัติread-hostนั้นมีความเฉพาะเจาะจงกับโฮสต์ดังนั้นโฮสต์ Powershell นี้ (ConsoleHost) :จะผนวกเข้ากับพรอมต์ที่ระบุ


ดี! รักพร่องโดย!!$xอัปยศฉันไม่สามารถใช้ว่า ...
Dom เฮสติ้งส์

เฮ้ Danko คุณช่วยโพสต์ผลการทดสอบได้ไหม? ฉันไม่คิดว่าฉันสามารถทดสอบ power shell บน windows ที่ไม่ใช่ ... (โปรดแก้ไขให้ฉันถ้าฉันผิด!)
Dom Hastings

ฉันได้เพิ่มเอาต์พุตทดสอบลงในคำตอบแล้ว
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]

เวอร์ชั่นที่สวยกว่า:

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

คุณอาจจะสามารถประหยัดไม่กี่ตัวอักษรโดยการเปลี่ยนeและvเข้าสู่ผู้ประกอบการ ฉันยังลองเขียนใหม่vและgเพื่อให้พารามิเตอร์xอยู่ใน IO และprintอื่น ๆ ได้รับการยก ฉันไม่ได้จัดการเพื่อให้มันทำงานได้ แต่ฉันคิดว่ามันอาจเป็นสถานที่ที่เหมาะสำหรับคนที่รู้จักฮาเซล
shiona

@shiona: ใช่สิ่งที่เกี่ยวกับการเก็บสิ่งต่าง ๆIOคือพวกเขาพิมพ์บ่อยเกินไป (นั่นเป็นเหตุผลที่ฉันใช้r nแทนx) หรือไม่เพียงพอเพราะค่าที่ไม่เคยถาม ... ดังนั้นฉันจะเปลี่ยนeและvเป็นผู้ดำเนินการได้อย่างไร
Ry-

ฉันมีปัญหาเดียวกันกับการพิมพ์ สิ่งที่มาพร้อมกับผู้ประกอบการที่คุณสามารถทำได้ (ใช้ e เป็นตัวอย่าง) 'i'%x=x+1;'d'%x=x-1... do n<-x;r$w$o%nและเพียงแค่เรียกมันในโวลต์ เหตุผลที่ผู้ประกอบการประหยัดพื้นที่คือพวกเขาไม่ต้องการช่องว่างรอบ ๆ พวกเขา
shiona

@shiona: โอ้! โทรดีขอบคุณ!
Ry-

ไม่มีปัญหา. ครั้งแรกที่ฉันคิดเกี่ยวกับการตอบคำถามของตัวเอง แต่เนื่องจากฉันไม่ได้รับความคิดใหญ่ของฉันทำงานฉันคิดว่ามันจะเพียงแค่หยาบคายโพสต์รหัสเดียวกันกับสัญกรณ์ที่แตกต่างกันสำหรับฟังก์ชั่นเดียวกัน
shiona

4

ทับทิม, 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;'}}

ตัวอย่างเซสชัน (เหมือนกับของคุณ):

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

รุ่นของฉันจะสั้นกว่า ฉันบีบอัดแผนที่หรือไม่ เพื่อจัดหมวดหมู่สำหรับค่า "การห่อ" ใช้การเรียกซ้ำแทนขณะที่และล่ามที่ใช้งานได้แทนการแก้ไข
geocar

4

Ada

นี่คือการใช้ Ada สำหรับผู้ที่สนใจภาษานี้ ฉันใช้เวลาค่อนข้างนานในการใช้แนวทางปฏิบัติที่ดีที่สุดของ Ada (เช่นการใช้ Indefinite_Holders แทนการเข้าถึง) และเพื่อให้เข้าใจอย่างถ่องแท้ว่า Deadfish ต้องทำงานอย่างไร

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;

และผลลัพธ์:

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

หากบางคนทดลองใน Ada สามารถให้คำแนะนำในการเพิ่มประสิทธิภาพให้ฉันได้ฉันจะขอบคุณ


1
ยินดีต้อนรับสู่ PPCG! เป้าหมายของ code-golf คือการสร้างรหัสที่สั้นที่สุดและคุณควรรวมขนาดของโปรแกรมไว้ในส่วนหัว (1396 bytes ที่นี่)
TuxCrafting

4

C, 159 ตัวอักษร

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

ฉันลองวิธีอื่นโดยใช้การตั้งค่าตารางค้นหาสำหรับการถอดรหัสคำแนะนำ แต่น่าเสียดายที่สิ้นสุดลงอีกต่อไป ( 169 ) ฉันรวมมันไว้เพราะใครบางคนอาจมีการปรับแต่งที่ฉลาดเพื่อลดขนาด (ต้องทำงานโดยไม่มีข้อโต้แย้งใด ๆ )

#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

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

นี่จะเป็นบรรทัดใหม่หลังจาก>>, แต่ OP ไม่ได้บอกว่าไม่ได้รับอนุญาต ไม่อีกแล้ว!

ขอขอบคุณที่GlitchMr, minitechและgolfer9338!


1
คุณสามารถใช้lambdaแทนdefฟังก์ชันที่ส่งคืนได้ทันที
Konrad Borowski

x in(-1,256)บันทึกอักขระสองตัว หรือs=lambda x:"a=%d"%(x!=-1and x!=256and x)อาจบันทึกบางอย่าง
Ry-

1
คุณสามารถลบprint(">>")และใช้for i in input(">>")แทน input()อนุญาตให้ระบุพรอมต์ จากนั้นจะไม่มีการขึ้นบรรทัดใหม่หลังจาก>>นั้นและคุณบันทึกอักขระ
golfer9338

คะแนนของคุณควรจะเป็นผมคิดว่าหนึ่งถ่านสั้นในขณะนี้ โปรดตรวจสอบอีกครั้ง แต่ฉันได้รับการนับ 161 แทนการโพสต์ 162: บรรทัดที่ 3 + 40 + 8 + 107 บวก 3 บรรทัดใหม่ ความจริงจะบอกว่าฉันอิจฉาเพราะอย่างใดคุณจะสั้นกว่าคำตอบ C ของฉันสองสามตัวอักษร ไชโย!
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")}}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

ตัวอย่างเซสชัน (ในโหมดโต้ตอบ):

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

ฉันรู้ว่าฉันมาช้า แต่ฉันต้องการโอกาสที่จะโพสต์เวอร์ชั่น Python ที่สั้นกว่า (และ CodeGolf-พยายามครั้งแรกของฉัน) :)

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

คำสั่งพิมพ์นั้นค่อนข้างยุ่งยากสำหรับเรื่องนี้ หากพรอมต์ต้องลงท้ายด้วยช่องว่างให้เพิ่มหนึ่งอักขระลงในการนับ :)

คำอธิบาย

v เป็นตัวสะสม

mตรวจสอบว่าค่าที่กำหนดเป็นหรือ-1 256ถ้าเป็นเช่นนั้น0จะถูกส่งคืนค่ามิฉะนั้น

ในบรรทัดต่อไปนี้การดำเนินการถูกกำหนดให้กับตัวแปรที่เกี่ยวข้อง (เนื่องจากบางอันมีความหมายเหมือนกัน (เช่นiและx) นี่จะสั้นกว่าการสร้างอินสแตนซ์ใหม่ของพจนานุกรมใหม่) เหล่านั้นจะถูกใช้ในexecด้านล่าง

while 1: เป็นห่วงหลัก

ตอนนี้ความสนุกเริ่มต้นขึ้นแล้ว เช่นเดียวกับวิธีแก้ปัญหาของ@jazzpiมันวนซ้ำแต่ละอักขระของอินพุต locals()เป็นพจนานุกรมของตัวแปรทั้งหมด (มองเห็นได้) ในปัจจุบัน ด้วย.get(n,'')คีย์ที่เกี่ยวข้องจะถูกใส่ลงใน exec-string (สตริงว่างถ้าไม่พบคีย์ (= อินพุตอื่น ๆ )) นี้ก็จะได้รับเมื่อดำเนินการตัดแบ่งด้วยและผ่านต่อv mค่าส่งคืนจะถูกเก็บไว้ในvอีกครั้ง

ตัวอย่างสั้น ๆ :

Be n = 'i'( n= นำเข้าถ่าน) ที่เราได้รับ'+1'ออกจากlocals-block เป็นเป็นตัวแปรที่มีค่าi สตริงสำหรับรูปลักษณ์กว่าเช่นนี้ บางทีตอนนี้มันง่ายกว่าที่จะเห็นว่าเมื่อเรียกใช้งานมันจะเรียกด้วยค่าและเก็บเอาท์พุทของมันอีกครั้ง'+1'
exec'v=m(v+1)'
mv+1v

ทำซ้ำจนกว่าคุณจะเบื่อ :)


ฉันรู้ว่าฉันมาช้าไปงานปาร์ตี้ แต่แลมบ์ดาสำหรับ m สามารถเป็นy*(-1!=y!=256)-3 ไบต์ได้
Reinstate Monica

เพียง 5 ปี :) ขอบคุณสำหรับการป้อนข้อมูลแม้ว่า ฉันขี้เกียจเกินไปที่จะแก้ไขคำตอบไม่ใช่ แต่ฉันจะจำไว้
เดฟ 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

นี่มันเรียบร้อย แต่ก็ค่อนข้างตรงไปตรงมา นี่คืออีกต่อไปรุ่นที่เย็นกว่า:

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 ตัวอักษรอาจไม่ใช่คำตอบที่ยาวที่สุดในการแข่งขัน ในทางกลับกัน coroutines จะค่อนข้างสวยและฉันมักจะมองหาข้ออ้างที่จะใช้ (และแบ่งปัน) พวกเขา


3

TI-BASIC, 104 107 102 100 98

สำหรับเครื่องคิดเลขชุด TI-83 + / 84 +

ชื่อนี้prgmD; ในที่สุดมันก็จะล้นสแต็กโดยการเรียกตัวเอง แทนที่การสอบถามซ้ำด้วย a While 1ในราคาสองไบต์เพื่อแก้ไขปัญหานี้

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 คือ 0 ตามค่าเริ่มต้นดังนั้นควรรันด้วยเครื่องคิดเลขที่ล้างหน่วยความจำใหม่หรือเก็บ 0 ถึง Y ด้วยตนเองก่อนเรียกใช้

น่าเสียดายที่อักษรตัวพิมพ์เล็ก (ในตัวอักษรของสตริง) มีขนาดสองไบต์ มิฉะนั้นสิ่งนี้จะสั้นกว่าคำตอบของ Dom Hastings

แก้ไข: แก้ไขข้อผิดพลาดหารด้วยศูนย์ (0 ^ 0) ที่ราคาสามไบต์

107 -> 102: ใช้เคล็ดลับการยกกำลังจินตภาพเพื่อบันทึกสี่ไบต์ (รวมถึง 1 จากวงเล็บและ -1 จากการยืดสตริงการค้นหา) และใช้ Y แทน X ซึ่งใช้เวลาน้อยหนึ่งไบต์ในการเริ่มต้น


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 ตัวอักษร)

นี่อาจเป็นตัวเลือกภาษาที่ไม่ดี แต่ก็ดี ไม่ใช่ภาษาอย่าง C สามารถทำได้ดีกว่าภาษาการเขียนโปรแกรมแบบไดนามิก บน Clang คุณจะต้องระบุค่าสำหรับreturn(ไม่จำเป็นสำหรับ 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();}}

มันจะสั้นกว่าไหมที่จะลบdefine qและเพิ่งใช้printf?
ลูกบิดประตู

@DoorknobofSnow หมายเลขจริง qใช้งาน 3 ครั้งดังนั้นdefine qประหยัด ~ 2 ตัวอักษร
Justin

2

ลัวะ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 _

ไม่ใช่สิ่งที่เลวร้ายที่สุดไม่ใช่สิ่งที่ดีที่สุด

หมายเหตุ: ตามที่รายงานโดย@mniip 256orอาจไม่ทำงานในล่ามของคุณ ข้อมูลเพิ่มเติมในความคิดเห็น

(มากหรือน้อย) รุ่นที่อ่านได้:

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 _

เอาท์พุท:

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

แก้ไข: ขอบคุณ@mniipสำหรับการเพิ่มประสิทธิภาพถ่าน 2 ตัว: until nil->until _


repeat until x(x ไม่มีศูนย์ตามที่ไม่ได้กำหนดไว้) สั้นกว่า 2 ตัวอักษรและwhile 1 do endมีความยาวเท่ากันนอกเหนือจากรุ่น lua แบบใด 256orเป็นไวยากรณ์ที่ไม่ถูกต้องในล่ามของฉัน
mniip

@mniip repeat until xขอบคุณสำหรับคำแนะนำเกี่ยวกับ ฉันใช้หน้าต่างล่าสุดไบนารีจากที่นี่ อย่างที่คุณเห็นa=a+1 elseifมีพื้นที่ นั่นเป็นเพราะeเป็นเลขฐานสิบหกบาทในขณะที่oใน256orไม่ดังนั้นล่ามของฉันจะใช้เวลาorอีกคำสั่ง / บล็อก / howYouCallIt
Egor305

ใช่สวยมากนอกจาก256orนี้ยัง0repeatและ1then; ฉันใช้ lua อย่างเป็นทางการจาก lua.org รหัสของคุณไม่ได้รวบรวมใน 5.1, 5.2 หรือ 5.3
mniip

2

Haskell , 186 178 ไบต์

ความต้องการนี้จะทำงานด้วยrunhaskell(หรือภายในghci) ตั้งแต่พวกเขาทั้งสองตั้งค่าBufferModeไปNoBufferingโดยปริยายซึ่งตู้นิรภัยค่อนข้างมากของไบต์:

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

ลองออนไลน์!

คำอธิบาย

นี้กำหนดผู้ประกอบการใหม่state # source(ประกาศ fixity ช่วยให้เราสามารถวางวงเล็บเมื่อใช้มันร่วมกับผู้ประกอบการอื่น ๆ(+), (-), (^), (:)และ(>>)):

  • สองบรรทัดแรก "แก้ไข" รัฐ-1และ256
  • จากนั้นจะจับคู่อักขระแรกและดำเนินการกับมัน
  • เมื่ออักขระหมด ( r#_) จะอ่านอักขระใหม่และเริ่มต้นใหม่อีกครั้งเพื่อรักษาสถานะเดิม

ในการเริ่มต้นกระบวนการเราเริ่มต้นสถานะด้วย0และอ่านบรรทัดซอร์สใหม่เช่น เริ่มต้นด้วยแหล่งที่ว่างเปล่า:

main=0#""

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

ไม่สนใจคำสั่งอื่นสำเร็จ ป่องจริงๆโดยไม่ต้องorทำงานกับ ...

แก้ไข:

คงที่:

  • ไม่มีการสะท้อนคำสั่งทั้งหมดอีกต่อไป
  • ทำให้มันเป็นจริงด้วยคณิตศาสตร์กับ / a
  • รีเซ็ตเป็น -1
  • รีเซ็ตอินพุตหลังจากทุกรอบ

ค่าใช้จ่ายนี้ 52 ตัวอักษร

ไม่ได้รับการแก้ไข:

  • กำลังสอง 0 เขียน "0 * 0" ใน
  • การป้อนพื้นที่ (หรือป้อนอะไรเมื่อคุณเพิ่งเปิดมัน) เกิดปัญหาสคริปต์
  • คุณต้องใส่ถ่านหนึ่งตัวในแต่ละครั้ง

2
อันนี้ธรรมดาไม่ทำงานเลย (Windows 7) ฉันไม่ได้ตั้งใจที่จะเป็นคนโง่ แต่คุณได้ทำการทดสอบนี้หรือไม่?
marinus

@marinus แก้ไขแล้ว
Timtech

1

สคริปต์คำสั่งของ Windows - 154

คุณลักษณะที่ไม่รู้จักของ Abusin สูงสุด

@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 ไบต์

ฉันทำคำตอบอื่น> <> คำตอบเนื่องจากฉันไม่สามารถทดสอบเฟสได้และใช้คำสั่งที่มีการซ้อนกันล่วงหน้าแทนที่จะเลียนแบบเชลล์อยู่ดี

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

มันสามารถลงเล่นกอล์ฟได้อย่างแน่นอน แต่ฉันไม่แน่ใจว่าฉันจะมีความกล้าหาญที่บ้าคลั่ง !

ฉันทดสอบกับล่ามอย่างเป็นทางการที่ทำงานภายใต้ python 3.5 ภายใต้ cygwin ใน windows 7 และสามารถสร้างการทดสอบการทำงานซ้ำได้:

$ 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

ในกรณีที่คุณไม่สามารถเรียกใช้งานบนเครื่องของคุณ (input ดูเหมือนว่าจะเป็นเรื่องยุ่งยาก) หรือคุณเพียงต้องการที่จะลองมันไม่มีซอฟต์แวร์อื่น ๆ ที่คุณสามารถใช้รุ่นต่อไปนี้บนล่ามออนไลน์

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

เห็นได้ชัดว่าไม่สนใจ \ n และ EOF เนื่องจากคุณไม่สามารถป้อนพวกเขาในล่ามออนไลน์ แต่จะทำตัวราวกับว่ากด Enter หลังจากคำสั่งเอาต์พุตแต่ละคำสั่ง


1

C (gcc) , 139 ไบต์

คอมไพล์ด้วย-Dk="_nZZiaeY"(รวมอยู่ในจำนวนไบต์) -2 ไบต์ถ้า>>\nได้รับอนุญาต

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

ลองออนไลน์!

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


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

ถ้าเพียงฉันจะกำจัดhFlush stdoutสายที่น่ารำคาญ! หากไม่มีพรอมต์จะไม่ปรากฏขึ้นจนกว่าจะมีoการดำเนินการ คำแนะนำใด ๆ?


คุณสามารถกำจัดhFlushโดยใช้runhaskellแทนการรวบรวม (ดูคำตอบของฉัน ) แต่สำหรับวิธีนี้มันไม่ถูกต้องและข้อผิดพลาดออก
ბიმო

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>

ผลลัพธ์เป็นภาพร่างเล็กน้อย (ประวัติ / เซสชันแสดงบน textarea และเมื่อเปิดใช้งานการรายงานข้อผิดพลาดจะมีคำเตือนจำนวนมากถูกพิมพ์ออกมา) แต่ทุกอย่างทำงานได้


0

> <>, 239

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

สแต็กเริ่มต้นคืออินพุต คุณสามารถลองออนไลน์ได้ที่นี่


0

Golf-Basic 84, 88 ตัวอักษร

: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

พร้อมรับคำสั่งหนึ่งคำสั่งในแต่ละครั้งเช่นเดียวกับอย่างน้อย 3 โซลูชั่นอื่น ๆ นี่คือการทดสอบการทำงานสำหรับxiskisc:

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

นอกจากนี้xisksoผลลัพธ์ 0 ตามที่ควร


โซลูชันอื่นใดที่พร้อมรับคำสั่งหนึ่งคำสั่งพร้อมกัน
Ry-

1
ฉันเขียนแฮสเค็ลล์คนหนึ่งและไม่มันไม่ใช่ หรือ Perl ก็ไม่ได้ดังนั้นฉันไม่แน่ใจว่าสิ่งที่คุณกำลังพูดถึง
Ry-

1
สิ่งนี้ไม่เป็นไปตามกฎของ I / O
marinus

1
ยังไม่ปฏิบัติตามกฎและใช้ตัวอักษรตัวพิมพ์ใหญ่แทนตัวพิมพ์เล็ก
lirtosiast

1
หากคุณรู้เกี่ยวกับ TI-BASIC จะรองรับเฉพาะอินพุตตัวพิมพ์ใหญ่เท่านั้น
Timtech

0

JavaScript (Node.js), 204 ไบต์

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)

นี่อาจจะเป็นกอล์ฟ Node.js พิสูจน์ให้เห็นอีกครั้งว่าการใช้คำฟุ่มเฟื่อยแปลก ๆ อีกครั้ง รหัสอธิบาย:

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 ไบต์

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

จะเป็น 283 ไบต์หากการใช้งานและการประกาศคลาสเป็นต้นสามารถถูก ommitted โดยเพียงแค่ให้คำนิยามฟังก์ชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.