diff --git a/MANIFEST b/MANIFEST index 05f4d13b7..3de56dfcf 100644 --- a/MANIFEST +++ b/MANIFEST @@ -674,6 +674,7 @@ scripts/Rosettacode/Order_disjoint_list_items.sf scripts/Rosettacode/Palindrome_detection.sf scripts/Rosettacode/Palindrome_detection_1.sf scripts/Rosettacode/Pangram_checker.sf +scripts/Rosettacode/Partial_function_application.sf scripts/Rosettacode/Pascal_s_triangle.sf scripts/Rosettacode/Permutations.sf scripts/Rosettacode/Permutations_1.sf @@ -882,6 +883,7 @@ scripts/unique_prefixes.sf scripts/url_encoding_decoding.sf scripts/var_ref.sf scripts/var_scoping.sf +scripts/vigenere_cipher.sf scripts/virtual_machine.sf scripts/while_loop.sf scripts/word_roots.sf diff --git a/lib/Sidef/Types/Array/Array.pm b/lib/Sidef/Types/Array/Array.pm index 617c7c20b..87df98297 100644 --- a/lib/Sidef/Types/Array/Array.pm +++ b/lib/Sidef/Types/Array/Array.pm @@ -45,8 +45,11 @@ package Sidef::Types::Array::Array { my @array; if (defined $arg) { - foreach my $i (0 .. $#{$self}) { - push @array, $self->[$i]->get_value->$operator($arg->[$i]->get_value); + my $argc = @{$arg}; + my $selfc = @{$self}; + my $max = $argc > $selfc ? $argc - 1 : $selfc - 1; + foreach my $i (0 .. $max) { + push @array, $self->[$i % $selfc]->get_value->$operator($arg->[$i % $argc]->get_value); } } else { diff --git a/scripts/Rosettacode/Partial_function_application.sf b/scripts/Rosettacode/Partial_function_application.sf new file mode 100644 index 000000000..6fc249bf3 --- /dev/null +++ b/scripts/Rosettacode/Partial_function_application.sf @@ -0,0 +1,25 @@ +#!/usr/bin/ruby + +# +## http://rosettacode.org/wiki/Partial_function_application +# + +func fs(f) { + closure func(*args) { + args.map {f(_)} + } +} + +func double(n) { n * 2 }; +func square(n) { n ** 2 }; + +var fs_double = fs(double); +var fs_square = fs(square); + +var s = (0 .. 3); +say "fs_double(#{s}): #{fs_double(s...)}"; +say "fs_square(#{s}): #{fs_square(s...)}"; + +s = [2, 4, 6, 8]; +say "fs_double(#{s}): #{fs_double(s...)}"; +say "fs_square(#{s}): #{fs_square(s...)}"; diff --git a/scripts/vigenere_cipher.sf b/scripts/vigenere_cipher.sf new file mode 100644 index 000000000..bdd859f5a --- /dev/null +++ b/scripts/vigenere_cipher.sf @@ -0,0 +1,22 @@ +#!/usr/bin/ruby + +# +## http://rosettacode.org/wiki/Vigen%C3%A8re_cipher +# + +func s2v(s) { s.uc.scan(/[A-Z]/)»ord»() »-» 65 }; +func v2s(v) { (v »%» 26 »+» 65)»chr»().join }; + +func blacken (red, key) { v2s(s2v(red) »+« s2v(key)) }; +func redden (blk, key) { v2s(s2v(blk) »-« s2v(key)) }; + +var red = "Beware the Jabberwock, my son! The jaws that bite, the claws that catch!"; +var key = "Vigenere Cipher!!!"; + +var black = blacken(red, key); +var ured = redden(black, key); + +assert_eq('WMCEEIKLGRPIFVMEUGXQPWQVIOIAVEYXUEKFKBTALVXTGAFXYEVKPAGY', black); +assert_eq('BEWARETHEJABBERWOCKMYSONTHEJAWSTHATBITETHECLAWSTHATCATCH', ured); + +say "** Test passed!";