คำนวณคะแนนในเกม "sjoelen"


31

โอเคดังนั้นเมื่อวานนี้เป็นวันคริสต์มาสที่ 2 และผู้ปกครองของฉันและฉันมีเกม "sjoelen" ตามที่ถูกเรียกในเนเธอร์แลนด์ โปรแกรมเมอร์ชั้นในเข้ามาหาฉัน แต่เมื่อฉันได้รับคำตอบฉันก็ทำมันหาย ฉันต้องการให้คุณสร้างใหม่

กฎระเบียบ:

คุณมีแผ่นไม้sjoelbakมี 4 กล่องแต่ละกล่องมีหมายเลขของตัวเอง เมื่อschijf (วัตถุคล้ายเด็กซน) ไปในกล่องใดกล่องหนึ่งคุณจะได้รับคะแนนเหนือกล่องนั้น

A _sjoelbak_ กับ _schijven_
เมื่อมีschijfในทั้ง 4 กล่องคุณจะไม่ได้รับ 10 แต่คุณจะได้ 20 คะแนน

ตัวอย่าง:

จากซ้ายไปขวา: 3 5 4 3
แต่ละกล่องมีอย่างน้อย 3 schijven (พหูพจน์ของschijf ) ดังนั้นนั่นคือ 20 * 3 = 60 คะแนน

ค่าผลลัพธ์: 0 2 1 0
0 * 2 + 2 * 3 + 1 * 4 + 0 * 1 = 10 คะแนน

ซึ่งทำให้รวม 60 + 10 = 70 คะแนน

อินพุต:
จำนวนschijvenจากซ้ายไปขวาเช่น "4 5 4 5", [4,5,4,5], "4 \ n5 \ n4 \ n5" ไม่ว่าคุณจะชอบอะไร

ผลลัพธ์:
จำนวนคะแนนเช่น 84, เป็นเอาท์พุท, ตัวแปร, ผลตอบแทนหรือด้านบนของสแต็คสิ่งที่คุณต้องการ

เช่นเดียวกับในการตีกอล์ฟแต่ละครั้งคุณไม่สามารถใช้สคริปต์ภายนอกและรหัสที่มีจำนวนไบต์น้อยที่สุดชนะ

PS: ตามที่คุณอาจสังเกตเห็นแล้วฉันเป็นคนดัตช์ อย่าลังเลที่จะแก้ไขข้อผิดพลาดทางไวยากรณ์ที่เป็นไปได้


เอาต์พุตต้องเป็น stdout หรือเป็นฟังก์ชันส่งคืนหรือเป็นรายการที่เหลือบนสแต็ก (สำหรับภาษาที่ใช้สแต็ก)?
globby

@globby สามารถเป็นทุกอย่างได้
Charlie

ฉันคิดว่า sjoelen นั้น Leuk!
Mark Knol

1
มีการ จำกัด จำนวน schijf ในแต่ละช่องหรือไม่
The_Basset_Hound

@BassetHound คุณจะได้รับ 30 schijvenต่อรอบดังนั้น 30 ใน 4 เท่ากับ 120 คะแนน เป็นไปได้ แต่ไม่ใช่คะแนนที่ดีที่สุด (7 ในทั้งหมด = 140, + 2 ใน 4 = 148)
ชาร์ลี

คำตอบ:


8

CJam, 23 21 20 bytes

q~_$0=f+1m>{X):X*+}*

ฉันอาจเล่นกอล์ฟได้สองสามไบต์จากนี้

อินพุตเหมือน

[3 5 4 3]

ผลลัพธ์คือคะแนน

70

มันทำงานอย่างไร

q~                         "Read the input and evaluate into an array";
  _$0=                     "Copy the array, sort it and get the minimum number";
                           "This minimum is the number of common schijven";
      f+                   "Increment each of the schijven by the common schijven number"; 
        1m>                "Take 1 element from the end of the array and put";
                           "it in the beginning";
           {      }*       "Reduce the elements of the array based on this block";
            X):X           "Increment and update the value of X (initially 1)";
                *          "Multiply the number of schijven with X";
                 +         "Add it to current score";

ขั้นตอนวิธี

  • เนื่องจากฉันเปลี่ยนจำนวน schijven ได้อย่างถูกต้องตอนนี้การสั่งซื้อคะแนนจึงกลายเป็น[1 2 3 4]จริง
  • ยิ่งไปกว่านั้นด้วยความจริงที่ว่า1 + 2 + 3 + 4 = 10ฉันเพียงเพิ่ม schijven สามัญขั้นต่ำให้กับแต่ละคนเพื่อรับผลของ10คะแนนโบนัส
  • ตอนนี้เมื่อฉันลดลงฉันจะได้รับ 2 องค์ประกอบเริ่มแรกในกองซ้อนองค์ประกอบแรกที่ฉันเพิกเฉยคือองค์ประกอบที่มีคะแนนของ1แต่ละชิ้นจากนั้นฉันคูณองค์ประกอบที่สองด้วย2และเพิ่มเข้าไปก่อน ในการทำซ้ำครั้งต่อไปฉันจะได้รับผลรวมและคะแนน3schijven ปัจจุบัน และอื่น ๆ

ลองออนไลน์ได้ที่นี่


ไบต์ที่น้อยที่สุด (จนถึงตอนนี้) ได้รับการยอมรับ ขอบคุณสำหรับคำอธิบาย
Charlie

@ Charlie ทำไมคุณถึงยอมรับคำตอบอย่างรวดเร็ว? คุณควรรอ 1-2 สัปดาห์ก่อนตอบรับคำตอบ
ProgramFOX

8

รหัส Piet, 240 (30 * 8) รหัส 138 ประกอบด้วยรหัสจริง

Codel ขนาด 10 เพื่อการมองเห็นที่ดีขึ้น

Piet: นับคะแนน sjoelen

ตัวอย่างการทดสอบ:

D:\codegolf\npiet-1.3a-win32>npiet sjoelen_point_count_cs10.png
? 3
? 5
? 4
? 3
70
D:\codegolf\npiet-1.3a-win32>npiet sjoelen_point_count_cs10.png
? 4
? 5
? 4
? 5
84

จอแสดงผลการไหล:

ใช้ชวเลขของฉันเองเพื่อการจัดการที่ง่ายขึ้นและจอแสดงผลขนาดกะทัดรัด มันแสดงให้เห็นถึงการไหลของโปรแกรมทั่วไปไม่ได้สถานที่ที่แน่นอนของตัวแปลงสัญญาณ

NOP ADD DIV GRT DUP INC END
 0   +   /   >   =   c   ~
PSH SUB MOD PTR ROL OUN
 X   -   %   #   @   N
POP MUL NOT SWI INN OUC
 ?   *   !   $   n   C

1X!nnnn=5X2X@=5X2X@=5X2X@=5X1X@**
       0                        *
       0       @+5X1X@1X-4X1X@  !
       0       -             0  !
       0       X1!X1X6+*==X40000#  <--pointer if top of stack=1 (all boxes full,
       0                     0  2      add 20 points, decrement count for all boxes)
       0000-X1@X1X2-X1@X1X3-X1  X  |  pointer if top of stack=0 (not all boxes full,
                                *  V   add 2a+3b+4c+d)
           ~N++++*X4@X2X3*X3@X1X2

คำอธิบายแบบเต็ม:

      (score=0)  a   b   c   d
      1 PSH NOT INN INN INN INN

      ..... sort and duplicate the numbers .....
**1** DUP 5 PSH 2 PSH ROL DUP 5 PSH 2 PSH ROL DUP 5 PSH 2 PSH ROL DUP 5 PSH 1 PSH ROL

      ( a*b*c*d ) (convert to boolean) 1 if all boxes are full, 0 if at least one box is empty
      MUL MUL MUL NOT NOT

      change direction if 1 (**2**)
      go straight ahead if 0 (**3**)
      PTR

      ( compress 20=4*4+4 )       (0-1=-1/ neg. roll) score+20
**2** 4 PSH DUP DUP MUL ADD 6 PSH 1 PSH NOT 1 PSH SUB ROL ADD

      (put score back to bottom of stack) ... a=a-1, b=b-1, c=c-1, d=d-1 ...
      5 PSH 1 PSH ROL 1 PSH SUB 4 PSH 1 PSH ROL 1 PSH SUB 3 PSH
      1 PSH ROL 1 PSH SUB 2 PSH 1 PSH ROL 1 PSH SUB

      loop to **1**

      (   a*2   )               (   b*3   )               (  c*4  )
**3** 2 PSH MUL 2 PSH 1 PSH ROL 3 PSH MUL 3 PSH 2 PSH ROL 4 PSH MUL

      +2a +3b +d +score
      ADD ADD ADD ADD

      output score
      OUN

บันทึกภาพและลองในล่าม Piet ออนไลน์:

PietDev ล่าม Piet ออนไลน์


คำตอบ Piet ^. ^
The_Basset_Hound

แน่นอน! ฉันพยายามเพิ่มคำตอบ Piet เมื่อใดก็ตามที่สามารถจัดการได้)
ML


7

Mathematica, 38 32 23 20 ไบต์

(#+Min@#).{2,3,4,1}&

(ด้วยความช่วยเหลือจากหวด )

ใช้โดยการตรึงอินพุตต่อท้าย:

(#+Min@#).{2,3,4,1}&@{3,5,4,3}

70

ทางเลือก (36 ไบต์):

20*Min@#+Total[(#-Min@#)*{2,3,4,1}]&

Tr[(# + Min@#) {2, 3, 4, 1}] &
swish

@ ฉลาดมาก!
kukac67

1
นั่นคือฟังก์ชั่นทั้งหมด คุณไม่จำเป็นต้องเพิ่มคุณสามารถกำจัดมันโดยการแทนที่ลบกับบวกเพราะสิ่งอำนวยความสะดวก20*Min@# 2+3+4+1==10
swish

@ วิชโอ้! นั่นดีกว่า แต่ฉันไม่สามารถห่อหัวของฉันทำไมมันถึงได้ผล?
kukac67

2
@ Swish ขอบคุณมากสำหรับความช่วยเหลือ แต่คุณควรโพสต์คำตอบของคุณเอง : D
kukac67

7

R, 41 40 ตัวอักษร

b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))

การใช้งาน:

> b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
1: 4 5 4 5
5: 
Read 4 items
[1] 84
> b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
1: 3 5 4 3
5: 
Read 4 items
[1] 70

ในตัวอย่างที่ผ่านมาaเป็นเวกเตอร์3 5 4 3, a-bคือ0 2 1 0ซึ่งเราคูณด้วยเวกเตอร์2 3 4 1จึงให้0 6 4 0ซึ่งเราเพิ่มด้วย5*bการให้15 21 19 15( 5*bถูกรีไซเคิลสำหรับสมาชิกของเวกเตอร์เพิ่มในแต่ละจึงมีประสิทธิภาพเพิ่ม4*5*b) 70ซึ่งในที่สุดเราก็สรุปจึงให้


40 bytes:b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
Alex A.

5

JavaScript (ES6), 93 47 ไบต์

s=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d

การใช้งาน: s(1, 2, 3, 4)

วิธีการทำงาน: ฟังก์ชั่นจะค้นหาจำนวนที่น้อยที่สุดในการโต้แย้งและคูณด้วย10(ไม่ใช่กับ20) และเพิ่มคะแนนที่เหลือ ไม่จำเป็นต้องคูณ20และย่อส่วนจากคะแนนเพื่อดำเนินการคำนวณต่อไป

ขอบคุณ edc65 สำหรับการแบ่งปันการปรับปรุง!

ยกเลิกแข็งแรงเล่นกอล์ฟ:

function score(a, b, c, d) {
    return 10 * Math.min(a, b, c, d) + a * 2 + b * 3 + c * 4 + d;
}

1
ใช้ 10 กับ min ไม่จำเป็นต้องลบ (ฟังก์ชัน s (a, b, c, d) {return 10 * Math.min (a, b, c, d) + a * 2 + b * 3 + c * 4 + d;})
edc65

1
และใน ES6:S=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d
edc65

@ edc65 เยี่ยมมากขอบคุณ!
ProgramFOX

5

Pyth , 15

sm*hd+@QtdhSQUQ

การป้อนข้อมูลควรคั่นด้วยเครื่องหมายจุลภาคบน STDIN เช่น

3,5,4,3

วิธีนี้ใช้กลอุบายแบบเดียวกันกับที่โซลูชันอื่น ๆ ได้ใช้รวมถึงการเพิ่มจำนวนขั้นต่ำให้แต่ละองค์ประกอบเพื่อรับโบนัส ขั้นต่ำอยู่hSQในรหัสข้างต้น ในการนับการคูณด้วย 2, 3, 4 และ 1 ฉันแมป d ผ่านรายการ [0,1,2,3] และคูณองค์ประกอบ (dl) th ของอินพุตด้วย d + 1 ดังนั้นองค์ประกอบที่ 1 จะถูกคูณด้วย 1, zeroth คูณ 2, คูณด้วย 3 เป็นครั้งแรกและอีก 4 คูณ 4


5

J, 23 22 ตัวอักษร

   (+/ .*&2 3 4 1@(+<./))

ตัวอย่าง:

   test =. 3 5 4 3
   (+/ .*&2 3 4 1@(+<./)) test
70

ลองที่นี่

(23 ยาวนิยามฟังก์ชันอย่างชัดเจน: v=:3 :'+/+/\.3|.y+<./y')


ทำไมไม่เพียง+/2 3 4 1*(+<./)?
swish

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

แล้วไง2 3 4 1+/ .×]+<./ล่ะ
อดัม

4

นกกระจอกเทศ v0.1.0 , 48 41 ตัวอักษร(ยาวเกินไป)

.$0={}/:n;{n-}%)\+1:i;{i*i):i;}%{+}*20n*+

นี่เป็นเพียงเหมือนกับรุ่นเก่าด้านล่างยกเว้นว่าแทนที่จะใช้@เพื่อหมุนทั้งกอง)\+(uncons ขวา) ใช้แทน

เวอร์ชั่นเก่า:

.$0={}/:n;{n-}%{}/{4@}3*1:i;]{i*i):i;}%{+}*20n*+

ฉันได้ค้นพบข้อบกพร่องสองข้อในภาษาที่เพิ่งนำมาใช้ใหม่ของฉันมีคำอธิบายประกอบในคำอธิบายด้านล่าง (ในปัจจุบันภาษานั้นคล้ายกับ Golfscript มากดังนั้นถ้าคุณรู้ Golfscript ควรอ่านได้ง่ายพอสมควร

.$0=   get min value (for the *20 thingy)
{}/    *actually* get min value (BUG: `array number =' returns a single-element array...)
:n;    store as n
{n-}%  subtract this value from all array elements
{}/    dump array onto stack
{4@}3* rotate stack so that instead of 2 3 4 1, multipliers are 1 2 3 4
       (BUG: negative rotations don't work)
1:i;   set i (the multiplier) to 1
]{i*   multiply each array element by i
i):i;  increment i
}%     (do the previous 2 lines over each array element)
{+}*   add up all the array elements
20n*+  add 20*n (the min value we got in line 1)

คาดว่าอินพุตเป็นอาร์เรย์ใน STDIN เพราะฉันเป็นลูกบิดประตูและลืมที่จะใช้ I / O ใน v0.1.0

การแก้ไขปัญหาที่เกิดขึ้นจริงในนกกระจอกเทศเป็นสิ่งที่ดีเพราะมันแสดงให้ฉันเห็นว่าฉันต้องเพิ่มสิ่งต่าง ๆ อีกมากมายในภาษา: D


ขอให้โชคดีในภาษาของคุณมันดูดีมาก)
Charlie

4

Python 2, 43 ไบต์

lambda i:i[1]-i[3]+2*(sum(i)+i[2]+5*min(i))

แรงบันดาลใจจากคำตอบของ @ user2487951


อัลกอริทึมที่ดี! สำหรับโปรแกรมเต็มรูปแบบคุณต้องป้อนคำสั่งและพิมพ์ด้วย
2487951

1
@ user2487951 หนึ่งในวิธีการที่ได้รับอนุญาตคือ "return" ดังนั้นในขณะที่นี่ไม่ใช่โปรแกรมเต็มรูปแบบมันเป็นคำตอบที่ถูกต้อง
isaacg

3

Jagl Alpha 1.2 - 20 bytes

อินพุตอยู่ในรูปแบบ stdin (3 4 5 6)เอาต์พุตจะถูกทิ้งไว้บนสแต็ก:

T~dqZ*S1 5r]%{U*}/b+

รอการตอบรับจากโปสเตอร์ต้นฉบับเกี่ยวกับรูปแบบผลลัพธ์ เนื่องจากอินพุตถูกระบุเป็น"สิ่งที่คุณชอบ"ฉันจะสมมติว่าอินพุตของฉันสามารถเป็นอาร์เรย์ที่ด้านบนของสแต็ก ตอนนี้รับอินพุตบน stdin

คำอธิบาย:

T~                            Get input from stdin and evaluate
  dqZ*                      Duplicate, get minimum, and multiply that by 10
      S1 5r]                Swap (so array is on top), push range 1-5 exclusive, and rotate
            %{U*}/          Zip arrays together, and multiply each pair
                  b+P       Get the sum of that, add the common minimum, and print

คำตอบแรกได้รับการยอมรับโพสต์ที่แก้ไขแล้วเพื่อให้ชัดเจน
Charlie

@Optimizer ที่ถ่าย แก้ไข
globby

3

Haskell, 40

g l@[a,b,c,d]=2*a+3*b+4*c+d+10*minimum l

แทนที่จะลบหมายเลขขั้นต่ำออกจากส่วนที่เหลือและเพิ่มจำนวนเพิ่มเติม20นี่จะเป็นการเพิ่ม10จำนวนขั้นต่ำเพิ่มเติม


ทางออกที่ดี คุณรวมคำสั่งซื้อเข้าด้วยกันมันควรจะเป็น..4*c+d..

3

Matlab, 27

เอาฉันสักครู่เพื่อทำความเข้าใจว่ามันเป็นเกมที่เล่นคนเดียว ด้วยความช่วยเหลือของฟังก์ชั่นที่ไม่ระบุชื่อ

f=@(N)N*[2;3;4;1]+10*min(N)

ซึ่งเรียกใช้กับเวกเตอร์แถว

f([3 5 4 3]) == 70
f([7 7 9 7]) == 148

1
ฉันคิดว่าเป็นที่ยอมรับกันโดยทั่วไปในส่วนเหล่านี้เพื่อลดf=จำนวน 2 ไบต์ให้น้อยลง ฟังก์ชั่นได้รับการจัดเก็บไว้ในansตัวแปรแทน
BrainSteel

1
[2:4,1]จะโกนออก 2 ไบต์หากอินพุตคือเวกเตอร์คอลัมน์
Sanchises

2

Java, 84 ไบต์

int A(int[]a){int m=9;for(int i:a)m=i<m?i:m;return 10*m+a[3]+2*a[0]+3*a[1]+4*a[2];}

ฉันมีความคิดว่าสิ่งนี้สามารถตีกอล์ฟได้ต่อไป แต่ตอนนี้มันเป็นตอนนี้แล้ว

โทรด้วยA(new int[]{3,5,4,3})เอาต์พุตจะถูกส่งกลับเป็น int (เพราะSystem.out.println()จะเพิ่มเป็นสองเท่าของไบต์)

Ungolfed

int getScore(int[] input){
    int min=9;

    for(int x:input) {
        if(x<min){
            min=x;
        }
    }

    return 10*min + 2*input[0] + 3*input[1] + 4*input[2] + 1*input[3];
}

2

GolfScript ขนาด 22 ไบต์

~3,{1$>~;}%+$(11*+{+}*

อ่านข้อมูลจาก stdin, [3 5 4 3]ในรูปแบบ เขียนเอาต์พุตไปยัง stdout (หากนำอินพุตเป็นอาร์เรย์บนสแต็กจะอนุญาตการนำหน้า~ได้รวม 21 ไบต์)

สิ่งนี้ใช้กลยุทธ์ที่ค่อนข้างแตกต่างจากโซลูชั่น CJam / Pyth / ฯลฯ : ฉันสร้างอาเรย์ด้วย 2 สำเนาของค่าอินพุตแรก, 3 จากสอง, 4 ในสามและหนึ่งในสี่ จากนั้นฉันเรียงลำดับอาร์เรย์นี้ดึงองค์ประกอบที่เล็กที่สุดคูณด้วย 11 และรวมกับองค์ประกอบอื่น ๆ


2

Python 2, 51

ไม่น่าเบื่อ แต่สั้น:

l=input()
print l[0]*2+l[1]*3+l[2]*4+l[3]+10*min(l)

pythonic เพิ่มเติม:

l=input()
print sum(map(lambda x,y:x*y,l,[2,3,4,1]))+10*min(l)

ถ้าอินพุตเป็น [3,5,4,3] นี่จะส่งคืน 70 หรือไม่
Charlie

ใช่มันใช้ได้ทั้งสองกรณี และส่งคืน 84 สำหรับ [4,5,4,5]
user2487951

2

จูเลีย 48 35 ตัวอักษร

function p(m);sum([2 3 4 1].*m)+10minimum(m);end

ในรูปแบบการกำหนดขนาดกะทัดรัด:

p(m)=sum([2 3 4 1].*m)+10minimum(m)

ตัวอย่าง:

julia> p([3 5 4 3])
70


1

Javascript, ES6, 57

f=(a,b,c,d)=>a*b*c*d?20+f(--a,--b,--c,--d):a*2+b*3+c*4+d

ฉันต้องการดูว่าการเรียกซ้ำจะกลายเป็นอย่างไรและแม้ว่าจะไม่ใช่คำตอบที่สั้นที่สุด แต่ฉันก็รู้สึกว่ามันกลับกลายเป็นดี

a*b*c*d: มันใช้ค่าอินพุตและค้นหาผลิตภัณฑ์ของพวกเขาทั้งหมดและประเมินว่าเป็นนิพจน์บูลีนสำหรับคำสั่ง inline if สิ่งนี้จะคืนค่าเท็จหากค่าหนึ่งหรือมากกว่านั้นเป็น 0 และเป็นจริงสำหรับค่าอื่น ๆ

20+f(--a,--b,--c,--d): ถ้ามันคืนจริงฟังก์ชั่นกลับ 20 (สำหรับชุดschijven ) บวกกับการเรียกซ้ำของฟังก์ชั่นสำหรับค่าทั้งหมดลบหนึ่ง (เพื่อลบschijvenนั้นชุด ) ด้วยวิธีนี้มันจะวนซ้ำจนกว่าอย่างน้อยหนึ่งกล่องจะว่างเปล่า

a*2+b*3+c*4+dอย่างน้อยหนึ่งกล่องหลังจากนั้นว่างส่วนอื่นของอินไลน์ถ้าคำสั่งจะทำงาน มันแค่คืนคะแนนให้ส่วนที่เหลือ schijvenในกล่อง

ดังนั้นเมื่อสิ้นสุดชุดschijven 20 จุดทั้งหมดและจุดที่เหลือจะถูกรวมและส่งคืนจากฟังก์ชันทำให้เกิดคำตอบ


1

Haskell 42 ตัวอักษร

f l=10*minimum l+sum(zipWith(*)[2,3,4,1]l)

กำหนดรหัสผลรวมอย่างชัดเจน: f l@[a,b,c,d]=10*minimum l+2*a+3*b+4*c+d- บันทึก 2 ตัวอักษร
MtnViewMark

1

HPPPL (ภาษาการเขียนโปรแกรม HP Prime) 58 57 ไบต์

ไม่จำเป็น * ระหว่าง 10 ถึงขั้นต่ำดังนั้นฉันจึงลบออก

EXPORT s(m)
BEGIN
return sum([2,3,4,1].*m)+10min(m);
END;

HPPPL เป็นภาษาโปรแกรมสำหรับเครื่องคิดเลขกราฟสี / Prime ของ HP

ตัวอย่างการทำงาน:

การจับภาพหน้าจอ HPPPL ของโปรแกรมนับคะแนน sjoelen

หากไม่จำเป็นต้องเป็นโปรแกรมแสดงว่าสามารถใช้งานได้ใน 40 39 ไบต์แบบหนึ่งซับ:

m:=[3,5,4,3];sum([2,3,4,1].*m)+10min(m)

1

Staq, 72 ตัวอักษร

't't't't{aii*XX}$&iia$&ia$&a+XX+XX+|{mxx}{lxX}{k>?m!l}kkk&iiqi&ii*s*t|+:

ตัวอย่างการเรียกใช้:

Executing D:\codegolf\Staq\sjoelen codegolf.txt

3
5
4
3
70

Execution complete.
>

Staq มีสองสแต็คหนึ่งแอ็คทีฟหนึ่งพาสซีฟ |คำสั่งสวิทช์สแต็คที่ใช้งานไปเรื่อย ๆ และในทางกลับกัน

ทุกอย่างระหว่างวงเล็บปีกกากำหนดฟังก์ชั่นตัวอักษรตัวแรกหลังจากวงเล็บเปิดคือชื่อฟังก์ชั่นส่วนที่เหลือจนกระทั่งวงเล็บปีกกาปิดเป็นฟังก์ชั่นของตัวเอง สามารถแทนที่ฟังก์ชันการเรียกซ้ำและฟังก์ชันซ้อนได้ {aii}จะกำหนดฟังก์ชั่นaที่จะเพิ่มส่วนบนของสแต็กสองครั้ง ทุกตัวอย่างaในรหัสต่อไปนี้จะถูกแทนที่ด้วยiiในรหัสที่จะถูกแทนที่ด้วย

ความคิดเห็นภายในStaq prorams: &เพิ่มศูนย์ที่ด้านบนสุดของสแต็ก[แนะนำให้ตัวชี้เพื่อข้ามไปที่เกี่ยวข้อง]หากด้านบนของสแต็คเป็นศูนย์xลบค่าสูงสุดบนสแต็ก ดังนั้นความคิดเห็นสามารถเขียนลงในรหัสในรูปแบบของ&[here is a comment]x

คำอธิบาย (ปฏิบัติการได้):

'                                      &[input number]x
 t                                     &[copy top of active stack to passive stack]x
  t't't                                &[input next three numbers and copy them to the passive stack]x
       {aii*XX}                        &[define function a (increment twice, multiply the two topmost values, then delete the second value on the stack twice)]x
               $                       &[move top value to the bottom of the stack]x
                &ii                    &[put zero on top of the stack, incremment twice]x
                   a                   &[function a]x
                    $&ia$&a
                           +           &[put sum of the two topmost values on top of the stack]x
                            XX         &[delete second stack value, twice]x
                              +XX+
                                  |    &[switch active/passive stack]x
{mxx}                                  &[define function m: delete two topmost stack values]x
     {lxX}                             &[define function l: delete topmost stack value, then delete second value of remaining stack]x
          {k>?m!l}                     &[define function k: boolean top > second value? put result on top of the stack, if top>0 then execute m, if top = 0 then execute l]x
                  kkk&ii
                        q              &[put square of top value on top of the stack]x
                         i&ii
                             *         &[multiply two topmost values and put result on top of the stack]x
                              s        &[move bottom stack value to the top]x
                               *t|+
                                   :   &[output result]x

https://esolangs.org/wiki/Staq

โปรแกรมใช้หนึ่งสแต็ค (เริ่มใช้งานครั้งแรก) ในการคำนวณ 2a + 3b + 4c + d และสแต็กที่สอง (เริ่มต้นเรื่อย ๆ ) เพื่อคำนวณ 10 เท่าของค่าอินพุตขั้นต่ำ จากนั้นผลลัพธ์ทั้งคู่จะถูกสรุปและแสดงผล


1

PowerShell สำหรับ Windows , 48 47 ไบต์

-1 byte ขอบคุณ mazzy

$args|%{$a+=++$i%4*$_+$_}
$a+10*($args|sort)[0]

ลองออนไลน์!


1
ลองออนไลน์! . เราควรระบุPowershell for Windowsเมื่อเราใช้sortนามแฝง ดูmeta
mazzy

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