กระปุกออมสินอิเล็กทรอนิกส์


11

กระปุกออมสินเป็นภาชนะที่ใช้ในการเก็บเหรียญในสำหรับความท้าทายนี้ใช้สี่เหรียญสหรัฐ. ไตรมาสเล็กน้อยนิกเกิลและเงิน

ท้าทาย

ความท้าทายของคุณคือการสร้างกระปุกออมสินอิเล็กทรอนิกส์ เขียนโปรแกรม (หรือฟังก์ชั่น) ที่เมื่อรัน (หรือเรียกว่า) เอาต์พุต (หรือส่งคืน) จำนวนของแต่ละเหรียญที่คุณมีรวมถึงจำนวนเหรียญทั้งหมด

อินพุต

สตริง, อาร์เรย์, ฯลฯ ... (ตัวเลือกของคุณ) ของเหรียญในกระปุกออมสินของคุณ (ตัวพิมพ์เล็กและตัวพิมพ์เล็ก)

 Q - Quarter(Value of 25)
 D - Dime(Value of 10)
 N - Nickel(Value of 5)
 P - Penny(Value of 1)

เอาท์พุต

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

ตัวอย่าง

 Input          ->       Output

 P              ->       1,0,0,0,1 or 0,0,0,1,1 or 0,0,1,0,1 or 1,1
 N              ->       0,1,0,0,5
 D              ->       0,0,1,0,10 
 Q              ->       0,0,0,1,25
 QQQQ           ->       0,0,0,4,100
 QNDPQNDPQNDP   ->       3,3,3,3,123
 PPPPPPPPPP     ->       10,0,0,0,10
 PNNDNNQPDNPQND ->       3,6,3,2,113

กฎระเบียบ

ไม่อนุญาตช่องโหว่มาตรฐาน

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์สำหรับแต่ละภาษาจะชนะ!


1
@Shaggy ใช่คุณทำได้
กำลังพัฒนาผู้พัฒนา

1
คำสั่งของเหรียญในทั้งหมด เราจะให้มันเรียงตามลำดับที่ปรากฏในอินพุตได้ไหม
อดัม

1
ดังนั้นหากคำสั่งซื้ออาจอนุมานจากอินพุตเราอาจละเว้น 0s ได้หรือไม่ จะยังคงชัดเจนซึ่งตัวอักษรแต่ละหมายเลขหมายถึง
อดัม

1
รูปแบบผลลัพธ์นี้อยู่ไกลเกินไปหรือไม่ ตอบ 19 ไบต์ที่ฉันไม่แน่ใจว่าถูกต้อง: ลองออนไลน์!
Magic Octopus Urn

1
ฉันรู้สึกว่าควรมีแท็ก [เงิน]
12Me21

คำตอบ:




4

APL (Dyalog Unicode) , 28 27 ไบต์

1 5 10 25(⊢,+.×)'PNDQ'+.=¨⊂

ลองออนไลน์!

ฟังก์ชั่น Tacit ,'<input>'จะเข้าเป็นพาหะในรูปแบบที่

ขอบคุณ ngn สำหรับหนึ่งไบต์!

อย่างไร?

1 5 10 25(⊢,+.×)'PNDQ'+.=¨⊂  Main function, tacit.
                            Enclose
                         ¨   Each character of the input
                      +.=    Sum the number of matched characters
                'PNDQ'       From this string
1 5 10 25(  +.×)             Multiply the values with the left argument, then sum them.
          ⊢,                 And append to the original vector of coins.

1⊥∘.=∘'PNDQ'->'PNDQ'+.=¨⊂
ngn

4

R , 70 69 ไบต์

function(n)c(x<-table(factor(n,c("P","N","Q","D"))),x%*%c(1,5,25,10))

ลองออนไลน์!

รับอินพุตเป็นเวกเตอร์ของอักขระแต่ละตัว แปลงให้factorsและtabulates พวกเขาแล้วคำนวณค่ากับผลิตภัณฑ์ dot

เพื่อความสะดวกในการทดสอบฉันได้เพิ่มวิธีการแปลงจากกรณีทดสอบด้านบนเป็นอินพุตที่ฟังก์ชันคาดหวัง

สิ่งนี้แทบจะไม่ชนะการจัดเก็บชื่อเหรียญเป็นเวกเตอร์namesซึ่งหมายความว่าวิธีการด้านล่างน่าจะเป็นนักกอล์ฟถ้าเรามีประเภทเหรียญมากกว่านี้:

R , 71 70 ไบต์

function(n)c(x<-table(factor(n,names(v<-c(P=1,N=5,Q=25,D=10)))),x%*%v)

ลองออนไลน์!


3

เยลลี่ขนาด 19 ไบต์

ċЀ“PNDQ”µæ.“¢¦½ı‘ṭ

ลองออนไลน์!

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

ċЀ“PNDQ”µæ.“¢¦½ı‘ṭ    Main link. Arguments: s (string)
 Ѐ“PNDQ”              For each char in "PNDQ":
ċ                        Count the occurrences of the char in s.
                       Collect the results in an array. Call this a.
         µ             Start a new monadic chain. Argument: a
          æ.           Take the dot product of a with
            “¢¦½ı‘       [1, 5, 10, 25].
                  ṭ    Tack this onto the end of a.

3

JavaScript (ES6), 63 61 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ Shaggy

รับอินพุตเป็นอาร์เรย์ของอักขระ P,N,D,Q,totalเอาท์พุท
แรงบันดาลใจจากOVS' คำตอบหลาม

a=>eval(a.join`++,`+`++,[P,N,D,Q,P+N*5+D*10+Q*25]`,P=N=D=Q=0)

ลองออนไลน์!


คำตอบเดิม 73 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ Q,D,N,P,totalเอาท์พุท

a=>a.map(c=>o[o[4]+='521'[i='QDNP'.search(c)]*5||1,i]++,o=[0,0,0,0,0])&&o

ลองออนไลน์!


ทำได้ดีมาก! คุณสามารถเคาะ 2 ไบต์โดยการสับบางสิ่งรอบ ๆ
Shaggy

3

MATL , 22 20 ไบต์

!'PNDQ'=Xst[l5X25]*s

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบายพร้อมตัวอย่าง

พิจารณาอินพุต'PNNDNNQPDNPQND'เป็นตัวอย่าง เนื้อหาสแต็กจะแสดงกลับหัวคือองค์ประกอบด้านบนจะปรากฏด้านล่าง

!        % Implicit input: string (row vector of chars). Transpose into a
         % column vector of chars
         % STACK: ['P';
                   'N';
                   'N';
                   'D';
                   'N';
                   'N';
                   'Q';
                   'P';
                   'D';
                   'N';
                   'P';
                   'Q';
                   'N';
                   'D']
'PNDQ'   % Push this string (row vector of chars)
         % STACK: ['P';
                   'N';
                   'N';
                   'D';
                   'N';
                   'N';
                   'Q';
                   'P';
                   'D';
                   'N';
                   'P';
                   'Q';
                   'N';
                   'D'],
                  'PNDQ'
=        % Implicit input. Test for equality, element-wise with broadcast
         % STACK: [1 0 0 0;
                   0 1 0 0;
                   0 1 0 0;
                   0 0 1 0;
                   0 1 0 0;
                   0 1 0 0;
                   0 0 0 1;
                   1 0 0 0;
                   0 0 1 0;
                   0 1 0 0;
                   1 0 0 0;
                   0 0 0 1;
                   0 1 0 0;
                   0 0 1 0]
Xs       % Sum of each column
         % STACK: [3 6 3 2]
t        % Duplicate
         % STACK: [3 6 3 2],
                  [3 6 3 2]
[l5X25]  % Push array [1 5 10 25]
         % STACK: [3 6 3 2],
                  [3 6 3 2],
                  [1 5 10 25]
*        % Multiply, element-wise
         % STACK: [3 6 3 2],
                  [3 30 30 50]
s        % Sum
         % STACK: [3 6 3 2],
                  113
         % Implicitly display

!'PNDQ'=Xst[l5X25]!Y*คือ 21 ไบต์ แม้ว่าฉันยอมรับว่าฉันยังไม่ได้ทดสอบ
Giuseppe

@Giuseppe ขอบคุณ แต่ความท้าทายว่า " คั่นที่ไม่ใช่จำนวนเต็มของทางเลือกของคุณ" ดังนั้นผมถือว่าเพียงคนเดียวที่ได้รับอนุญาตคั่น
หลุยส์ Mendo

ฉันไม่ได้สังเกตว่า อ่า
Giuseppe

1
ฉันคิดว่าวิธีการแก้ปัญหา 21 byte ก็โอเค ... OP แสดงความคิดเห็นบางอย่างกับผลกระทบนั้น
Giuseppe

@Giuseppe ยอดเยี่ยม! ลงไปที่ 20 ไบต์แล้ว ขอบคุณสำหรับ heads-up
Luis Mendo

3

Japt , 25 22 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ @Shaggy

`p˜q`¬£èX
pUí*38#éìH)x

ทดสอบออนไลน์! ใช้อินพุตเป็นตัวพิมพ์เล็ก

คำอธิบาย

`p˜q`¬         Split the compressed string "pndq" into chars, giving ["p", "n", "d", "q"].
      £        Map each char X to
       èX      the number of occurrences of X in the input.
<newline>      Set variable U to the resulting array.
 Uí*           Multiply each item in U by the corresponding item in
    38#é         38233
        ìH       converted to base-32, giving [1, 5, 10, 25].
           x   Take the sum.
p              Append this to the end of U.
               Implicit: output result of last expression

พยายามหาทางตีลูกน้ำออกไปโดยที่ยังไม่มีโชคมากนัก
Shaggy


และบันทึกไบต์อื่นด้วยการป้อนเป็นตัวพิมพ์เล็ก
Shaggy


@Shaggy ที่น่าประทับใจขอบคุณ!
ETHproductions

3

Excel (รุ่นภาษาโปแลนด์) 150 ไบต์

อินพุตอยู่ใน A1 สูตรอยู่ในเซลล์B1- F1:

cell  formula
------------------------------
B1    =DŁ(A1)-DŁ(PODSTAW(A1;"Q";""))
C1    =DŁ(A1)-DŁ(PODSTAW(A1;"D";""))
D1    =DŁ(A1)-DŁ(PODSTAW(A1;"N";""))
E1    =DŁ(A1)-DŁ(PODSTAW(A1;"P";""))
F1    =B1*25+C1*10+D1*10+E1

ส่งผลให้ในการส่งออกจำนวนของไตรมาสสลึง, เซ็น, pennys และผลรวมในเซลล์B1, C1, D1, E1และF1ตามลำดับ

เวอร์ชั่นภาษาอังกฤษ (162 ไบต์):

cell  formula
------------------------------
B1    =LEN(A1)-LEN(SUBSTITUTE(A1;"Q";""))
C1    =LEN(A1)-LEN(SUBSTITUTE(A1;"D";""))
D1    =LEN(A1)-LEN(SUBSTITUTE(A1;"N";""))
E1    =LEN(A1)-LEN(SUBSTITUTE(A1;"P";""))
F1    =B1*25+C1*10+D1*10+E1

3

APL + WIN, 33 27 ไบต์

บันทึก 5 ไบต์ด้วยอดัม

แสดงพร้อมต์สำหรับการป้อนข้อมูลหน้าจอของสตริงเหรียญ

n,+/1 5 10 25×n←+⌿⎕∘.='PNDQ'

บันทึกไบต์ 5:n,+/1 5 10 25×n←+⌿⎕∘.='PNDQ'
อดัม

@ngn ขอบคุณ วัยชราเริ่มดีขึ้นจากฉัน :(
เกรแฮม

2

05AB1E , 30 26 22 21 19 ไบต์

X5T25)s.•50†•S¢=*O=

ลองออนไลน์!


X                   # Push 1.
 5                  # Push 5.
  T                 # Push 10.
   25               # Push 25.
     )s             # Wrap stack to array, swap with input.
       .•50†•       # Push 'pndq'.
             S      # Push ['p','n','d','q'] (split).
              ¢     # Count (vectorized).
               =    # Print counts, without popping.
                *   # Multiply counts by [1,2,10,25]
                 O  # Sum.
                  = # Print.

การถ่ายโอนข้อมูล:

Full program: X5T25)s.•50†•S¢=*O=
current >> X  ||  stack: []
current >> 5  ||  stack: [1]
current >> T  ||  stack: [1, '5']
current >> 2  ||  stack: [1, '5', 10]
current >> )  ||  stack: [1, '5', 10, '25']
current >> s  ||  stack: [[1, '5', 10, '25']]
current >> .  ||  stack: [[1, '5', 10, '25'], 'pnndnnqpdnpq']
current >> S  ||  stack: [[1, '5', 10, '25'], 'pnndnnqpdnpq', 'pndq']
current >> ¢  ||  stack: [[1, '5', 10, '25'], 'pnndnnqpdnpq', ['p', 'n', 'd', 'q']]
current >> =  ||  stack: [[1, '5', 10, '25'], [3, 5, 2, 2]]
[3, 5, 2, 2]
current >> *  ||  stack: [[1, '5', 10, '25'], [3, 5, 2, 2]]
current >> O  ||  stack: [[3, 25, 20, 50]]
current >> =  ||  stack: [98]
98
stack > [98]

พิมพ์ออก:

[3, 25, 20, 50]\n98 or [P, N, D, Q]\n<Sum>

เนื่องจากมีบางสิ่งถูกพิมพ์สแต็กสิ้นสุดจะถูกละเว้น


2

J , 29 ไบต์

1 5 10 25(],1#.*)1#.'PNDQ'=/]

ลองออนไลน์!

คำอธิบาย:

'PNDQ'=/] สร้างตารางความเท่าเทียมกัน

   'PNDQ' =/ 'PNNDNNQPDNPQND'
1 0 0 0 0 0 0 1 0 0 1 0 0 0
0 1 1 0 1 1 0 0 0 1 0 0 1 0
0 0 0 1 0 0 0 0 1 0 0 0 0 1
0 0 0 0 0 0 1 0 0 0 0 1 0 0

1#. ค้นหาผลรวมของแต่ละแถวของตารางดังนั้นจำนวนการเกิดของแต่ละค่า

   1#. 'PNDQ' =/ 'PNNDNNQPDNPQND'
3 6 3 2

1#.* ค้นหาผลลัพธ์ดอทของอาร์กิวเมนต์ซ้ายและขวา

    1 5 10 25(1#.*)3 6 3 2
113

], ผนวกผลิตภัณฑ์ dot เข้ากับรายการค่า

   1 5 10 25(],1#.*)1#.'PNDQ'=/] 'PNNDNNQPDNPQND'
3 6 3 2 113

2

C # (. NET Core) , 163 136 ไบต์

ขอบคุณ @raznagul สำหรับการบันทึกจำนวนไบต์!

n=>{var m="";int c=0,i=0,k=0;for(var v=new[]{1,5,10,25};i<4;m+=k+",",c+=k*v[i++],k=0)foreach(var x in n)k+=x=="PNDQ"[i]?1:0;return m+c;}

ลองออนไลน์!


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

n=>{var v=new[]{1,5,10,25};string l="PNDQ",m="";int c=0,i,j,k;for(i=0;i<4;i++){for(j=0,k=0;j<n.Length;j++)k+=n[j]==l[i]?1:0;m+=k+",";c+=k*v[i];k=0;}m+=c;return m;}

ลองออนไลน์!


1
ฉันจัดการเล่นกอล์ฟของคุณลงไปที่136 ไบต์แล้ว เพื่อการเปลี่ยนแปลงมากมายในรายการ
raznagul

@raznagul สุดยอดวิธีแก้ปัญหา! ฉันขอถามได้ไหมว่าเพราะเหตุใดคุณจึงเปลี่ยนอินพุตเป็นรายการทั่วไปแทนที่จะเป็นอาร์เรย์ AFAIK คุณสามารถวนซ้ำอักขระของสตริงโดยไม่ต้องใช้รายการ
Ian H.

นั่นคือคนที่เหลืออยู่จากรุ่นก่อนหน้านี้ดังนั้นฉันสามารถใช้แทนn.Count n.Lengthเหมือนที่ถูกทิ้งไปอย่างสิ้นเชิงคุณสามารถใช้stringตอนนี้
raznagul



1

05AB1E , 19 ไบต์

"PNDQ"S¢D•Ωт•₂в*O)˜

ลองออนไลน์!

คำอธิบาย

"PNDQ"                # push this string
      S               # split to list of chars
       ¢              # count the occurrences of each in input
        D             # duplicate
         •Ωт•         # push 21241
             ₂в       # convert to a list of base 26 digits
               *      # element-wise multiplication
                O     # sum
                 )˜   # wrap in a flattened list

1

Java (OpenJDK 8) , 148 ไบต์

c->{int q=0,d=0,n=0,p=0;for(char w:c){if(w=='Q')q++;if(w=='D')d++;if(w=='N')n++;if(w=='P')p++;}return ""+q+","+d+","+n+","+p+","+(q*25+d*10+n*5+p);}

ลองออนไลน์!

มันสั้นกว่าการส่งจาวาอื่นเพียงหนึ่งไบต์แต่ที่สั้นกว่านั้นจะสั้นกว่า: D

คำอธิบาย:

int q=0,d=0,n=0,p=0;    //Initialize too many integers
for(char w:c){    //Loop through each coin
  if(w=='Q')q++;if(w=='D')d++;if(w=='N')n++;if(w=='P')p++;    //Increment the correct coin
}return ""+q+","+d+","+n+","+p+","+(q*25+d*10+n*5+p);    //Return each coin count and the total monetary value 


1

Gol> <> , 47 ไบต์

5R0TiE!vD;
5+@P@@t>b%m$.
a+$P$t
PrPrt
9s+r$P$rt

ลองออนไลน์!

รูปแบบผลลัพธ์คือ [P Q N D Value]รูปแบบการออกเป็น

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

5R0TiE!vD;
       >b%m$.

5R0            Repeat command '0' (push 0) 5 times
   T           Set teleport location for later
    i          Input a char
     E         Pop if the last input was EOF; skip next otherwise

               If the last is EOF, the following is run:
      ! D;     Skip 'v', print the contents of the stack from bottom to top, then exit

               Otherwise the following is run:
       v
       >b%m$.  Take the top (input) modulo 11, and jump to (-1, input % 11)
               P%11 = 3, N%11 = 1, D%11 = 2, Q%11 = 4

5+@P@@t        Runs if the input is N
5+             Add 5 to top
  @            Rotate top 3 (the 3rd comes to the top)
   P           Increment the top
  @P@@         Increment the 3rd from top
      t        Teleport to the last 'T'

a+$P$t         Runs if the input is D
a+             Add 10 to top
  $            Swap top two
  $P$          Increment the 2nd from top
     t         Teleport to the last 'T'

PrPrt          Runs if the input is P
P              Increment the top
 r             Reverse the stack
 rPr           Increment the bottom
    t          Teleport to the last 'T'

9s+r$P$rt      Runs if the input is Q
9s+            Add 25 to the top ('s': add 16 to the top)
   r$P$r       Increment the 2nd from bottom
        t      Teleport to the last 'T'


1

Pyth, 23 27 26 ไบต์

+Jm/Qd"PNDQ"s.b*NYJ[h05T25

บันทึกเป็นไบต์ด้วย @RK เอาต์พุตเป็น [P, N, D, Q, value]
ลองที่นี่

คำอธิบาย

+Jm/Qd"PNDQ"s.b*NYJ[h05T25
 Jm/Qd"PNDQ"                Save the count of each coin (in PNDQ order) as J.
                   [h05T25  [1, 5, 10, 25].
             .b   J       For each pair of count and value...
               *NY          ... take the product...
            s               ... and get the sum.
+                          Stick that onto the list of counts.

คุณสามารถย่อนิยามของ J และการใช้ J ครั้งแรกเพื่อรับ+Jm/Qd"PNDQ"s.b*NYJ[h05T25
RK

1

C (เสียงดังกราว) , 112 ไบต์

f(char *i){int c,d,v[5]={0};for(;c=*i++;v[d=(c|c/2)&3]++,v[4]+="AYJE"[d]-64);for(c=0;c<5;printf("%d,",v[c++]));}

ลองออนไลน์!

เอาต์พุต seq ปัจจุบันคือ P, Q, D, N, มูลค่ารวมใช้
งานได้กับทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

คำอธิบาย:

"AYJE"หรือ{64+1,64+25,64+10,64+5}เป็น 64 + ค่าของเหรียญ
d=(c|c/2)&3(ใช้เป็นดัชนี) มีค่า1,2,3,0สำหรับq,d,n,pอินพุตตามลำดับทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก



การกำจัด c = 0 เป็นสิ่งที่ดี ขอบคุณ
GPS



0

เรติน่า 50 ไบต์

P
P_
N
N5*
D
D10*
Q
Q25*
^
PNDQ_
O`.
(.)(\1*)
$.2¶

ลองออนไลน์! เอาต์พุตในลำดับ D, N, P, Q, ทั้งหมด คำอธิบาย:

P
P_
N
N5*
D
D10*
Q
Q25*

คำนวณผลรวมโดยการใส่_s ที่สอดคล้องกับค่าของแต่ละเหรียญ

^
PNDQ_

แทรกสำเนาพิเศษของตัวละครแต่ละตัวเพื่อให้มีอย่างน้อยหนึ่งตัวที่ตรงกัน

O`.

เรียงอักขระตามลำดับ

(.)(\1*)
$.2¶

นับจำนวนตัวละครแต่ละตัวหลังตัวแรก


0

SmileBASIC ขนาด 70 ไบต์

INPUT C$P=N+D+Q
WHILE""<C$INC VAR(POP(C$))WEND?P,N,D,Q,P+N*5+D*10+Q*25

ตัวอย่าง:

? PNDNDNDQP
2   3   3   1   72

คำอธิบาย:

INPUT COINS$
P=N+D+Q 'create variables
WHILE COINS$>"" 'loop until the coin list is empty
 'pop a character from the coin list
 'and increment the variable with that name
 INC VAR(POP(COINS$))
WEND
PRINT P,N,D,Q,P+N*5+D*10+Q*25

0

C, 149 ไบต์

f(char*s){int a[81]={},b[]={1,5,10,25},c=0;char*t,*v="PNDQ";for(t=s;*t;a[*t++]++);for(t=v;*t;printf("%d,",a[*t++]))c+=a[*t]*b[t-v];printf("%d\n",c);}

ลองออนไลน์!

C ไม่มีอาร์เรย์ที่เชื่อมโยงกันดังนั้นฉันจึงทำการปลอม (ไม่มีประสิทธิภาพมากหน่วยความจำที่ชาญฉลาด!) แล้ววนซ้ำอีกครั้งด้วยอาร์เรย์การค้นหาเพื่อเพิ่มเหรียญ มันจะไม่คำนวณสกุลเงินต่างประเทศแม้ว่า :-)


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