Jewels and Stones

From Rosetta Code
Jewels and Stones is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task

Create a function which takes two string parameters: 'stones' and 'jewels' and returns an integer.

Both strings can contain any number of upper or lower case letters. However, in the case of 'jewels', all letters must be distinct.

The function should count (and return) how many 'stones' are 'jewels' or, in other words, how many letters in 'stones' are also letters in 'jewels'.


Note that:

  1. Only letters in the ISO basic Latin alphabet i.e. 'A to Z' or 'a to z' need be considered.
  2. A lower case letter is considered to be different to its upper case equivalent for this purpose i.e. 'a' != 'A'.
  3. The parameters do not need to have exactly the same names.
  4. Validating the arguments is unnecessary.

So, for example, if passed "aAAbbbb" for 'stones' and "aA" for 'jewels', the function should return 3.

This task was inspired by this problem.

AWK[edit]

 
# syntax: GAWK -f JEWELS_AND_STONES.AWK
BEGIN {
printf("%d\n",count("aAAbbbb","aA"))
printf("%d\n",count("ZZ","z"))
exit(0)
}
function count(stone,jewel, i,total) {
for (i=1; i<length(stone); i++) {
if (jewel ~ substr(stone,i,1)) {
total++
}
}
return(total)
}
 
Output:
3
0

C[edit]

Translation of: Kotlin
#include <stdio.h>
#include <string.h>
 
int count_jewels(const char *s, const char *j) {
int count = 0;
for ( ; *s; ++s) if (strchr(j, *s)) ++count;
return count;
}
 
int main() {
printf("%d\n", count_jewels("aAAbbbb", "aA"));
printf("%d\n", count_jewels("ZZ", "z"));
return 0;
}
Output:
3
0

Factor[edit]

USING: kernel prettyprint sequences ;
: count-jewels ( stones jewels -- n ) [ member? ] curry count ;
 
"aAAbbbb" "aA"
"ZZ" "z" [ count-jewels . ] [email protected]
Output:
3
0

Kotlin[edit]

// Version 1.2.40
 
fun countJewels(s: String, j: String) = s.count { it in j }
 
fun main(args: Array<String>) {
println(countJewels("aAAbbbb", "aA"))
println(countJewels("ZZ", "z"))
}
Output:
3
0

Perl 6[edit]

sub count-jewels ( Str $j, Str $s --> Int ) {
my %counts_of_all = $s.comb.Bag;
my @jewel_list = $j.comb.unique;
 
return %counts_of_all@jewel_list.Bag ?? %counts_of_all{ @jewel_list }.sum !! 0;
}
 
say count-jewels 'aA' , 'aAAbbbb';
say count-jewels 'z' , 'ZZ';
Output:
3
0

Python[edit]

def countJewels(s, j):
return sum(x in j for x in s)
 
print countJewels("aAAbbbb", "aA")
print countJewels("ZZ", "z")
Output:
3
0

Python 3 Alternative[edit]

def countJewels(stones, jewels):
jewelset = set(jewels)
return sum(1 for stone in stones if stone in jewelset)
 
print(countJewels("aAAbbbb", "aA"))
print(countJewels("ZZ", "z"))
Output:
3
0

Racket[edit]

 
#lang racket
 
(define (jewels-and-stones stones jewels)
(length (filter (curryr member (string->list jewels)) (string->list stones))))
 
(module+ main
(jewels-and-stones "aAAbbbb" "aA")
(jewels-and-stones "ZZ" "z"))
 
Output:
3
0

REXX[edit]

Programming note:   a check was made so that only (Latin) letters are counted as a match.

/*REXX pgm counts how many letters (in the 1st string) are in common with the 2nd string*/
say count('aAAbbbb', "aA")
say count('ZZ' , "z" )
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
count: procedure; parse arg stones,jewels /*obtain the two strings specified. */
#=0 /*initalize the variable # to zero. */
do j=1 for length(stones) /*scan STONES for matching JEWELS chars*/
x=substr(stones, j, 1) /*obtain a character of the STONES var.*/
if datatype(x, 'M') then if pos(x, jewels)\==0 then #=# + 1
end /*j*/ /*if a letter & a match, bump # counter*/
return # /*return the number of common letters. */
output   when using the default inputs:
3
0

Ring[edit]

 
# Project Jewels and Stones
# Date 2018/04/25
# Author Gal Zsolt (~ CalmoSoft ~)
# Email <[email protected]>
 
jewels = "aA"
stones = "aAAbbbb"
see jewelsandstones(jewels,stones) + nl
jewels = "z"
stones = "ZZ"
see jewelsandstones(jewels,stones) + nl
 
func jewelsandstones(jewels,stones)
num = 0
for n = 1 to len(stones)
pos = substr(jewels,stones[n])
if pos > 0
num = num + 1
ok
next
return num
 

Output:

3
0

Sidef[edit]

func countJewels(s, j) {
s.chars.count { |c|
j.contains(c)
}
}
 
say countJewels("aAAbbbb", "aA") #=> 3
say countJewels("ZZ", "z") #=> 0

zkl[edit]

fcn countJewels(a,b){ a.inCommon(b).len() }
println(countJewels("aAAbbbb", "aA"));
println(countJewels("ZZ", "z"));
Output:
3
0