Celengan Elektronik

11

Sebuah celengan adalah wadah yang digunakan untuk mengumpulkan koin di Untuk tantangan ini menggunakan empat koin AS:. Kuartal, sepeser pun, nikel, dan sen .

Tantangan

Tantangan Anda adalah membuat celengan elektronik. Tulis sebuah program (atau fungsi) yang ketika dijalankan (atau dipanggil), menampilkan (atau mengembalikan) jumlah setiap koin yang Anda miliki, serta jumlah total jumlah koin tersebut.

Memasukkan

Sebuah string, array, dll ... (pilihan Anda) dari koin ke celengan Anda (case-sensitive).

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

Keluaran

Hitungan koin dari input dan jumlah total, dipisahkan oleh pembatas non-integer pilihan Anda. (Urutan di mana Anda menghasilkan total koin tidak masalah, tetapi total nilai koin (jumlah) harus menjadi elemen terakhir)

Contohnya

 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

Aturan

Tidak ada celah standar .

Ini adalah , jadi kode terpendek dalam byte untuk setiap bahasa menang!

Pengembang Berkembang
sumber
1
@Shaggy Ya Anda bisa
DevelopingDeveloper
1
Urutan koin dalam total . Bolehkah kita memberikannya sesuai urutan penampilan di input?
Adam
1
Jadi, jika pesanan dapat disimpulkan dari input, bisakah kita menghilangkan 0s? Masih akan jelas huruf mana yang mengacu pada masing-masing angka.
Adam
1
Apakah format output ini terlalu jauh? 19 byte jawaban yang saya tidak yakin valid: Coba online!
Magic Octopus Urn
1
Saya merasa harus ada tag [uang].
12Me21

Jawaban:

5

Python 2 , 73 byte

-3 byte terima kasih kepada @Rod

C=map(input().count,'QDNP')
print C+[sum(map(int.__mul__,C,[25,10,5,1]))]

Cobalah online!

Possum Mati
sumber
4
Anda dapat mengganti a*b for a,b in zip(C,[25,10,5,1])dengan map(int.__mul__,C,[25,10,5,1])untuk menyimpan beberapa byte
Rod
4

Python 2 , 63 byte

a,b,c,d=map(input().count,'PNDQ')
print a,b,c,d,a+b*5+c*10+d*25

Cobalah online!


Python 2 , 63 byte

l=map(input().count,'PNDQ')
a,b,c,d=l
print l+[a+b*5+c*10+d*25]

Cobalah online!

ovs
sumber
4

APL (Dyalog Unicode) , 28 27 byte

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

Cobalah online!

Fungsi diam-diam. Mengambil input sebagai vektor dalam format ,'<input>'.

Terima kasih ngn untuk satu byte!

Bagaimana?

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.
J. Sallé
sumber
1⊥∘.=∘'PNDQ'->'PNDQ'+.=¨⊂
ngn
4

R , 70 69 byte

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

Cobalah online!

Mengambil input sebagai vektor karakter individu. Konversi ke factorsdan tabulates mereka, lalu hitung nilainya dengan produk titik.

Untuk memudahkan tujuan pengujian, saya telah menambahkan cara untuk mengkonversi dari kasus uji di atas ke input yang diharapkan fungsi.

Ini hampir tidak perlu untuk menyimpan nama koin sebagai vektor names, yang berarti bahwa pendekatan di bawah ini kemungkinan akan menjadi lebih golf jika kita memiliki lebih banyak jenis koin:

R , 71 70 byte

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

Cobalah online!

Giuseppe
sumber
3

Jelly , 19 byte

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

Cobalah online!

Bagaimana itu bekerja

ċЀ“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.
Produksi ETH
sumber
3

JavaScript (ES6), 63 61 byte

Disimpan 2 byte berkat Shaggy

Mengambil input sebagai array karakter. Keluaran P,N,D,Q,total.
Terinspirasi oleh jawaban Python ovs .

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

Cobalah online!


Jawaban asli, 73 byte

Mengambil input sebagai array karakter. Keluaran 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

Cobalah online!

Arnauld
sumber
Dilakukan dengan sangat baik! Anda dapat menjatuhkan 2 byte dengan mengocok beberapa hal.
Shaggy
3

MATL , 22 20 byte

!'PNDQ'=Xst[l5X25]*s

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan dengan contoh

Pertimbangkan input 'PNNDNNQPDNPQND'sebagai contoh. Isi tumpukan ditampilkan terbalik, yaitu elemen atas muncul di bawah.

!        % 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
Luis Mendo
sumber
!'PNDQ'=Xst[l5X25]!Y*adalah 21 byte. meskipun saya akui saya belum mengujinya.
Giuseppe
@Giuseppe Terima kasih, tapi tantangan mengatakan " the pembatas non-integer pilihan Anda", jadi saya berasumsi hanya satu pembatas diperbolehkan
Luis Mendo
Saya tidak memperhatikan itu. Baiklah
Giuseppe
1
Saya pikir solusi 21 byte adalah OK ... OP berkomentar sesuatu untuk efek itu
Giuseppe
@Giuseppe Hebat! Turun ke 20 byte lalu. Terima kasih atas kunjungannya
Luis Mendo
3

Japt , 25 22 byte

Disimpan 3 byte berkat @Shaggy

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

Uji secara online! Mengambil input dalam huruf kecil

Penjelasan

`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
Produksi ETH
sumber
Mencoba mencari cara untuk menghilangkan koma, sejauh ini tidak memiliki banyak keberuntungan.
Shaggy
Oke!
Shaggy
Dan simpan byte lain dengan mengambil input dalam huruf kecil.
Shaggy
@Shaggy Impressive, terima kasih!
ETHproductions
3

Excel (versi bahasa Polandia), 150 byte

Masukan dalam A1. Rumusnya ada di sel 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

menghasilkan output dari jumlah perempat, dime, sen, pennys dan jumlah dalam sel B1, C1, D1, E1dan F1masing-masing.

Versi bahasa Inggris (162 byte):

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
pajonk
sumber
3

APL + WIN, 33 27 byte

5 byte disimpan berkat Adam

Meminta input layar dari string koin.

n,+/1 5 10 25×n←+⌿⎕∘.='PNDQ'
Graham
sumber
Hemat 5 byte:n,+/1 5 10 25×n←+⌿⎕∘.='PNDQ'
Ad
@ ngn Terima kasih. Usia tua semakin baik dari saya :(
Graham
2

05AB1E , 30 26 22 21 19 byte

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

Cobalah online!


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.

Membuang:

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]

Hasil cetak:

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

Karena ada sesuatu yang dicetak, tumpukan akhir diabaikan.

Guci Gurita Ajaib
sumber
2

J , 29 byte

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

Cobalah online!

Penjelasan:

'PNDQ'=/] menciptakan tabel kesetaraan

   '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#. menemukan jumlah setiap baris tabel, sehingga jumlah kemunculan setiap nilai

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

1#.* menemukan produk titik argumen kiri dan kanannya

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

], menambahkan produk titik ke daftar nilai

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

C # (.NET Core) , 163 136 byte

Terima kasih kepada @raznagul karena telah menghemat banyak byte di sana!

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

Cobalah online!


Versi lama:

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

Cobalah online!

Ian H.
sumber
1
Saya telah berhasil mengubah soultion Anda hingga 136 byte . Banyak perubahan ke daftar.
raznagul
@raznagul Solusi hebat! Bolehkah saya bertanya mengapa Anda mengalihkan input ke daftar generik alih-alih array? AFAIK Anda dapat mengulangi karakter string tanpa menggunakan daftar.
Ian H.
Itu merupakan sisa dari versi sebelumnya, jadi saya bisa menggunakan n.Countbukan n.Length. Seperti yang dijatuhkan sepenuhnya, Anda dapat menggunakannya stringsekarang.
raznagul
1

Perl 5 -pF , 59 byte

for$i(P,N,D,Q){say s:$i:$\+={P,1,Q,25,D,10,N,5}->{$&}:eg}}{

Cobalah online!

Xcali
sumber
1

Ruby , 66 byte

->s{t=0;{P:1,N:5,D:10,Q:25}.map{|c,v|t+=v*m=s.count(c.to_s);m}<<t}

Cobalah online!

Tidak hebat.

Pasang kembali Monica - notmaynard
sumber
1

05AB1E , 19 byte

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

Cobalah online!

Penjelasan

"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
Emigna
sumber
1

Java (OpenJDK 8) , 148 byte

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

Cobalah online!

Yah itu hanya satu byte lebih pendek dari pengiriman Java lainnya , tapi hei-pendek lebih pendek: D

Penjelasan:

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 
X1M4L
sumber
143 byte
ceilingcat
1

Gol> <> , 47 byte

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

Cobalah online!

Format output adalah [P Q N D Value].

Bagaimana itu bekerja

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'
Bubbler
sumber
1

Pyth, 23 27 26 byte

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

Menyimpan satu byte berkat @RK. Output sebagai [P, N, D, Q, nilai].
Coba di sini

Penjelasan

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

sumber
Anda dapat menyingkat definisi J dan penggunaan pertama J untuk mendapatkan+Jm/Qd"PNDQ"s.b*NYJ[h05T25
RK.
1

C (dentang) , 112 byte

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++]));}

Cobalah online!

Output seq sekarang dari P, Q, D, N, total-nilai
Bekerja dengan input huruf kecil dan huruf besar.

Penjelasan:

"AYJE"atau {64+1,64+25,64+10,64+5}apakah. 64+ nilai koin.
d=(c|c/2)&3(digunakan sebagai indeks) memiliki nilai 1,2,3,0untuk q,d,n,pinput masing-masing, baik dalam huruf besar dan kecil.

GPS
sumber
106 byte
ceilingcat
Menghilangkan c = 0 adalah tangkapan yang bagus. Terima kasih.
GPS
0

C # (.NET Core) , 156 byte

s=>{Func<char,int>f=i=>{return s.Split(i).Length-1;};var a=new[]{f('P'),f('N'),f('D'),f('Q')};return$"{string.Join(",",a)},{a[0]+a[1]*5+a[2]*10+a[3]*25}";};
Romen
sumber
0

Java (OpenJDK 8) , 149 byte

a->{int[]c={0,0,0,0,0};for(String g:a){if(g=="P")c[0]+=1;if(g=="N")c[1]+=5;if(g=="D")c[2]+=10;if(g=="Q")c[3]+=25;}c[4]=c[0]+c[1]+c[2]+c[3];return c;}

Cobalah online!

Pengembang Berkembang
sumber
144 byte
ceilingcat
0

Retina , 50 byte

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

Cobalah online! Output dalam urutan D, N, P, Q, total. Penjelasan:

P
P_
N
N5*
D
D10*
Q
Q25*

Hitung total dengan memasukkan _s yang sesuai dengan nilai setiap koin.

^
PNDQ_

Masukkan salinan tambahan dari setiap karakter sehingga setidaknya ada satu yang cocok.

O`.

Urutkan karakter ke dalam urutan.

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

Hitung jumlah setiap karakter setelah yang pertama.

Neil
sumber
0

SmileBASIC, 70 byte

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

Contoh:

? PNDNDNDQP
2   3   3   1   72

Penjelasan:

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
12Me21
sumber
0

C, 149 byte

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

Cobalah online!

C tidak memiliki array asosiatif, jadi saya memalsukannya (sangat tidak efisien, hemat memori!) Dan kemudian mengulanginya lagi dengan array pencarian untuk menambah koin. Itu tidak akan menghitung mata uang asing, meskipun :-)

ErikF
sumber
133 byte
ceilingcat