From 60c8fe6ec139ec65766bc30e41b50c2582ddf244 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Tue, 19 Dec 2023 02:00:49 +0000 Subject: - Added solutions by Laurent Rosenfeld. - Added solutions by Ulrich Rieke. --- challenge-248/laurent-rosenfeld/blog.txt | 1 + challenge-248/laurent-rosenfeld/perl/ch-1.pl | 26 ++++++++++++ challenge-248/laurent-rosenfeld/raku/ch-1.raku | 22 ++++++++++ challenge-248/ulrich-rieke/cpp/ch-1.cpp | 52 +++++++++++++++++++++++ challenge-248/ulrich-rieke/cpp/ch-2.cpp | 59 ++++++++++++++++++++++++++ challenge-248/ulrich-rieke/haskell/ch-1.hs | 17 ++++++++ challenge-248/ulrich-rieke/haskell/ch-2.hs | 41 ++++++++++++++++++ challenge-248/ulrich-rieke/perl/ch-1.pl | 34 +++++++++++++++ challenge-248/ulrich-rieke/perl/ch-2.pl | 34 +++++++++++++++ challenge-248/ulrich-rieke/raku/ch-1.raku | 28 ++++++++++++ challenge-248/ulrich-rieke/raku/ch-2.raku | 29 +++++++++++++ challenge-248/ulrich-rieke/rust/ch-1.rs | 31 ++++++++++++++ challenge-248/ulrich-rieke/rust/ch-2.rs | 42 ++++++++++++++++++ 13 files changed, 416 insertions(+) create mode 100644 challenge-248/laurent-rosenfeld/blog.txt create mode 100644 challenge-248/laurent-rosenfeld/perl/ch-1.pl create mode 100644 challenge-248/laurent-rosenfeld/raku/ch-1.raku create mode 100755 challenge-248/ulrich-rieke/cpp/ch-1.cpp create mode 100755 challenge-248/ulrich-rieke/cpp/ch-2.cpp create mode 100755 challenge-248/ulrich-rieke/haskell/ch-1.hs create mode 100755 challenge-248/ulrich-rieke/haskell/ch-2.hs create mode 100755 challenge-248/ulrich-rieke/perl/ch-1.pl create mode 100755 challenge-248/ulrich-rieke/perl/ch-2.pl create mode 100755 challenge-248/ulrich-rieke/raku/ch-1.raku create mode 100755 challenge-248/ulrich-rieke/raku/ch-2.raku create mode 100755 challenge-248/ulrich-rieke/rust/ch-1.rs create mode 100755 challenge-248/ulrich-rieke/rust/ch-2.rs (limited to 'challenge-248') diff --git a/challenge-248/laurent-rosenfeld/blog.txt b/challenge-248/laurent-rosenfeld/blog.txt new file mode 100644 index 0000000000..ac370f6989 --- /dev/null +++ b/challenge-248/laurent-rosenfeld/blog.txt @@ -0,0 +1 @@ +https://blogs.perl.org/users/laurent_r/2023/12/perl-weekly-challenge-248-shortest-distance.html diff --git a/challenge-248/laurent-rosenfeld/perl/ch-1.pl b/challenge-248/laurent-rosenfeld/perl/ch-1.pl new file mode 100644 index 0000000000..3f17cfa906 --- /dev/null +++ b/challenge-248/laurent-rosenfeld/perl/ch-1.pl @@ -0,0 +1,26 @@ +use strict; +use warnings; +use feature 'say'; + +sub shortest_distance { + my ($char, $str) = @_; + my @result; + my $max_idx = length($str) - 1; + for my $i (0..$max_idx) { + my $next = index ($str, $char, $i); + my $prev = rindex( $str, $char, $i); + push @result, abs($i - $next) and next if $prev < 0; + push @result, abs($i - $prev) and next if $next < 0; + my $dist = abs($i - $next) < abs($i - $prev) ? + abs($i - $next) : abs($i - $prev); + push @result, $dist; + } + return "@result"; +} + +my @tests = ( { str => "loveleetcode", char => "e" }, + { str => "aaab", char => "b" } ); +for my $t (@tests) { + printf "%-1s - %-15s => ", $t->{"char"}, $t->{"str"}; + say shortest_distance $t->{"char"}, $t->{"str"}; +} diff --git a/challenge-248/laurent-rosenfeld/raku/ch-1.raku b/challenge-248/laurent-rosenfeld/raku/ch-1.raku new file mode 100644 index 0000000000..4909cf9e3a --- /dev/null +++ b/challenge-248/laurent-rosenfeld/raku/ch-1.raku @@ -0,0 +1,22 @@ +sub shortest-distance ($char, $str) { + my @result; + for 0..^$str.chars -> $i { + my $next = $str.index($char, $i); + my $prev = $str.rindex($char, $i); + push @result, abs($i - $next) and next + unless defined $prev; + push @result, abs($i - $prev) and next + unless defined $next; + my $dist = abs($i - $next) < abs($i - $prev) ?? + abs($i - $next) !! abs($i - $prev); + push @result, $dist; + } + return "@result[]"; +} + +my @tests = { str => "loveleetcode", char => "e" }, + { str => "aaab", char => "b"}; +for @tests -> %test { + printf "%-1s - %-15s => ", %test{"char"}, %test{"str"}; + say shortest-distance %test{"char"}, %test{"str"}; +} diff --git a/challenge-248/ulrich-rieke/cpp/ch-1.cpp b/challenge-248/ulrich-rieke/cpp/ch-1.cpp new file mode 100755 index 0000000000..adda570afd --- /dev/null +++ b/challenge-248/ulrich-rieke/cpp/ch-1.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include + +std::vector split( const std::string & startline , + const std::string & sep ) { + std::vector separated ; + std::string::size_type start { 0 } ; + std::string::size_type pos ; + do { + pos = startline.find_first_of( sep , start ) ; + separated.push_back( startline.substr(start , pos - start )) ; + start = pos + 1 ; + } while ( pos != std::string::npos ) ; + return separated ; +} + +int main( ) { + std::cout << "Enter a string and a letter from this string, separated by blank!\n" ; + std::string line ; + std::getline( std::cin , line ) ; + std::vector parts ( split( line, " " ) ) ; + std::string searchstring { parts[0] } ; + std::string letter { parts[1] } ; + std::vector letterpositions ; + for ( int i = 0 ; i < searchstring.length( ) ; i++ ) { + if ( searchstring.substr( i , 1 ) == letter ) + letterpositions.push_back( i ) ; + } + for ( int n : letterpositions ) + std ::cout << n << " " ; + std::cout << '\n' ; + std::vector result ; + for ( int i = 0 ; i < searchstring.length( ) ; i++ ) { + if ( searchstring.substr( i , 1 ) != letter ) { + std::vector differences ; + for ( int p = 0 ; p < letterpositions.size( ) ; p++ ) + differences.push_back( abs( letterpositions[p] - i ) ) ; + result.push_back( *std::min_element( differences.begin( ) , differences.end( ) )) ; + } + else { + result.push_back( 0 ) ; + } + } + std::cout << "( " ; + for ( int i : result ) { + std::cout << i << " " ; + } + std::cout << " )\n" ; + return 0 ; +} diff --git a/challenge-248/ulrich-rieke/cpp/ch-2.cpp b/challenge-248/ulrich-rieke/cpp/ch-2.cpp new file mode 100755 index 0000000000..a20957bbd9 --- /dev/null +++ b/challenge-248/ulrich-rieke/cpp/ch-2.cpp @@ -0,0 +1,59 @@ +#include +#include +#include + +std::vector split( const std::string & startline , + const std::string & sep ) { + std::vector separated ; + std::string::size_type start { 0 } ; + std::string::size_type pos ; + do { + pos = startline.find_first_of( sep , start ) ; + separated.push_back( startline.substr(start , pos - start )) ; + start = pos + 1 ; + } while ( pos != std::string::npos ) ; + return separated ; +} + +void print( const std::vector & numbers ) { + std::cout << " ( " ; + for ( int i : numbers ) { + std::cout << i << " " ; + } + std::cout << ")\n" ; +} + +int main( ) { + std::cout << "Enter a matrix by inputting an equal number of integers per line!\n" ; + std::cout << "Enter to end!\n" ; + std::vector> matrix ; + std::string line ; + std::getline( std::cin , line ) ; + while ( line.length( ) > 0 ) { + std::vector linenumbers ( split( line , " " ) ) ; + std::vector numbers ; + for ( auto s : linenumbers ) + numbers.push_back( std::stoi( s ) ) ; + matrix.push_back( numbers ) ; + std::getline( std::cin , line ) ; + } + int matrixlen = matrix.size( ) ; + int rowlen = matrix[0].size( ) ; + std::vector> result ; + for ( int r = 0 ; r < matrixlen - 1 ; r++ ) { + std::vector resultline ; + for ( int col = 0 ; col < rowlen - 1 ; col++ ) { + int sum = matrix[ r ][col] + matrix[r][ col + 1 ] + + matrix[ r + 1][ col ] + matrix[ r + 1 ][ col + 1 ] ; + resultline.push_back( sum ) ; + } + result.push_back( resultline ) ; + } + std::cout << "(\n" ; + for ( const auto & numline : result ) { + print( numline ) ; + } + std::cout << ")\n" ; + return 0 ; +} + diff --git a/challenge-248/ulrich-rieke/haskell/ch-1.hs b/challenge-248/ulrich-rieke/haskell/ch-1.hs new file mode 100755 index 0000000000..190c1f498a --- /dev/null +++ b/challenge-248/ulrich-rieke/haskell/ch-1.hs @@ -0,0 +1,17 @@ +module Challenge248 + where + +solution :: String -> Char -> [Int] +solution stri letter = map (\i -> minimum $ map (\d -> abs ( d - i ) ) positions ) + [0..length stri - 1] + where + positions :: [Int] + positions = map snd $ filter ((letter == ) . fst ) $ zip stri [0, 1..] + +main :: IO ( ) +main = do + putStrLn "Please enter a string and a letter from the string, separated by a blank!" + input <- getLine ; + let searchstring = head $ words input + char_wanted = head $ last $ words input + print $ solution searchstring char_wanted diff --git a/challenge-248/ulrich-rieke/haskell/ch-2.hs b/challenge-248/ulrich-rieke/haskell/ch-2.hs new file mode 100755 index 0000000000..d333896311 --- /dev/null +++ b/challenge-248/ulrich-rieke/haskell/ch-2.hs @@ -0,0 +1,41 @@ +module Challenge248_2 + where +import Data.List ( intercalate , (!!) ) +import Data.List.Split ( chunksOf ) + +getMultipleLines :: Int -> IO [String] +getMultipleLines n + |n <= 0 = return [] + |otherwise = do + x <- getLine + xs <- getMultipleLines ( n - 1 ) + let ret = (x:xs) + return ret + +convert :: [String] -> [[Int]] +convert list = map (\li -> map read $ words li ) list + +printRow :: [Int] -> String +printRow row = " (" ++ (intercalate ", " $ map show row ) ++ ")" + +solution :: [[Int]] -> [[Int]] +solution numberlist = chunksOf ( l - 1 ) [(numberlist !! r !! col) + + ( numberlist !! r !! (col + 1 ) ) + ( numberlist !! ( r + 1 ) !! col ) + + ( numberlist !! (r + 1) !! (col + 1 )) | r <- [0..length numberlist - 2] , col <- [0..l + - 2] ] + where + l :: Int + l = length ( numberlist !! 0 ) + +main :: IO ( ) +main = do + putStrLn "Enter a matrix of an equal number of integers per line!" + putStrLn "How many lines do you want to enter?" + linenum <- getLine + numberLines <- getMultipleLines ( read linenum ) + let matrix = convert numberLines + sums = solution matrix + putStrLn "(" ; + mapM_ (\subli -> putStrLn $ printRow subli ) sums + putStrLn ")" + diff --git a/challenge-248/ulrich-rieke/perl/ch-1.pl b/challenge-248/ulrich-rieke/perl/ch-1.pl new file mode 100755 index 0000000000..ac5ce4baa4 --- /dev/null +++ b/challenge-248/ulrich-rieke/perl/ch-1.pl @@ -0,0 +1,34 @@ +#!/usr/bin/perl ; +use strict ; +use warnings ; +use feature 'say' ; +use List::Util qw ( min ) ; + +say "Enter a string and a letter from this string , separated by a blank!" ; +my $line = ; +chomp $line ; +my @parts = split( /\s+/ , $line ) ; +my $string = $parts[0] ; +my $letter = $parts[ 1 ] ; +my @letterpositions ; +my $pos = 0 ; +for my $current ( split( // , $string ) ) { + if ( $current eq $letter ) { + push @letterpositions , $pos ; + } + $pos++ ; +} +my @result ; +$pos = 0 ; +for my $current ( split( // , $string )) { + if ( $current ne $letter ) { + my @distances = map { abs( $pos - $_ ) } @letterpositions ; + push @result , min( @distances ) ; + } + else { + push @result , 0 ; + } + $pos++ ; +} +say ( "(" . join( ',' , @result) . ")" ) ; + diff --git a/challenge-248/ulrich-rieke/perl/ch-2.pl b/challenge-248/ulrich-rieke/perl/ch-2.pl new file mode 100755 index 0000000000..38cb396976 --- /dev/null +++ b/challenge-248/ulrich-rieke/perl/ch-2.pl @@ -0,0 +1,34 @@ +#!/usr/bin/perl ; +use strict ; +use warnings ; +use feature 'say' ; + +say "Enter some rows of the same number of integers each!" ; +say "Enter to end entry!" ; +my @matrix ; +my $line = ; +chomp $line ; +while ( $line ) { + my @numbers = split( /\s/ , $line ) ; + push @matrix , \@numbers ; + $line = ; + chomp $line ; +} +my $matrixlen = scalar( @matrix ) ; +my $rowlen = scalar( @{$matrix[0]} ) ; +my @result ; +for my $r (0..$matrixlen - 2 ) { + my @resultline ; + for my $col( 0..$rowlen - 2 ) { + my $sum = $matrix[$r]->[$col] + $matrix[$r]->[$col + 1] + + $matrix[ $r + 1]->[$col] + $matrix[$r + 1]->[$col + 1] ; + push @resultline , $sum ; + } + push @result , \@resultline ; +} +say "(" ; +for my $subarray ( @result ) { + say ( " (" . join( ',' , @$subarray) . ")" ) ; +} +say ")" ; + diff --git a/challenge-248/ulrich-rieke/raku/ch-1.raku b/challenge-248/ulrich-rieke/raku/ch-1.raku new file mode 100755 index 0000000000..ab5981d2ce --- /dev/null +++ b/challenge-248/ulrich-rieke/raku/ch-1.raku @@ -0,0 +1,28 @@ +use v6 ; + +say "Enter a string and a letter from this string, separated by a blank!" ; +my $line = $*IN.get ; +my @parts = $line.words ; +my $string = @parts[ 0 ] ; +my $letter = @parts[ 1 ] ; +my @result ; +my @letterpositions ; +my $pos = 0 ; +for $string.comb -> $current { + if ( $current eq $letter ) { + @letterpositions.push( $pos ) ; + } + $pos++ ; +} +$pos = 0 ; +for $string.comb -> $current { + if ( $current ne $letter ) { + my @differences = @letterpositions.map( { abs( $_ - $pos) } ) ; + @result.push( @differences.min ) ; + } + else { + @result.push( 0 ) ; + } + $pos++ ; +} +say ( "(" ~ @result.join( ',' ) ~ ")" ) ; diff --git a/challenge-248/ulrich-rieke/raku/ch-2.raku b/challenge-248/ulrich-rieke/raku/ch-2.raku new file mode 100755 index 0000000000..f97504a009 --- /dev/null +++ b/challenge-248/ulrich-rieke/raku/ch-2.raku @@ -0,0 +1,29 @@ +use v6 ; + +say "Enter a matrix with some lines each consisting the same number of integers!" ; +say "Enter to end entry!" ; +my $line = $*IN.get ; +my @matrix ; +while ( $line ) { + @matrix.push( $line.words.map( {.Int} )) ; + $line = $*IN.get ; +} +my $matrix_len = @matrix.elems ; +my $row_len = @matrix[0].elems ; +my @result ; +for ( 0..$matrix_len - 2 ) -> $row { + my @resultline ; + for ( 0..$row_len - 2 ) -> $col { + my $sum = @matrix[ $row ][ $col ] + @matrix[$row][$col + 1 ] + + @matrix[ $row + 1 ][ $col ] + @matrix[ $row + 1 ][$col + 1] ; + @resultline.push( $sum ) ; + } + @result.push( @resultline ) ; +} +say "(" ; +for @result -> @columns { + say ( " (" ~ @columns.join( ',' ) ~ ")" ) ; +} +say ")" ; + + diff --git a/challenge-248/ulrich-rieke/rust/ch-1.rs b/challenge-248/ulrich-rieke/rust/ch-1.rs new file mode 100755 index 0000000000..0a1305039b --- /dev/null +++ b/challenge-248/ulrich-rieke/rust/ch-1.rs @@ -0,0 +1,31 @@ +use std::io ; + +fn main() { + println!("Enter a string and, separated by a blank, a letter from that string!"); + let mut inline : String = String::new( ) ; + io::stdin( ).read_line( &mut inline ).unwrap( ) ; + let entered_line : &str = &*inline ; + let strings : Vec<&str> = entered_line.split_whitespace( ).map( | s | + s.trim( ) ).collect( ) ; + let searchstring : &str = strings[0] ; + let second_string : &str = strings[1] ; + let mut chars = second_string.chars( ) ; + let char_wanted = chars.next( ).unwrap( ) ; + let mut character_pos : Vec = Vec::new( ) ; + searchstring.chars( ).enumerate( ).filter( | el | el.1 == + char_wanted ).for_each( | el | character_pos.push( el.0 as i16 ) ) ; + let mut result : Vec = Vec::new( ) ; + let mut pos : usize = 0 ; + for c in searchstring.chars( ) { + if c != char_wanted { + let min_distance = character_pos.iter( ).map( | n | (pos as i16).abs_diff( + *n as i16 )).min( ).unwrap( ) ; + result.push( min_distance ) ; + } + else { + result.push( 0u16 ) ; + } + pos += 1 ; + } + println!("{:?}" , result ) ; +} diff --git a/challenge-248/ulrich-rieke/rust/ch-2.rs b/challenge-248/ulrich-rieke/rust/ch-2.rs new file mode 100755 index 0000000000..09944e6337 --- /dev/null +++ b/challenge-248/ulrich-rieke/rust/ch-2.rs @@ -0,0 +1,42 @@ +use std::io ; +use std::io::BufRead ; + +fn main() -> io::Result<( )> { + println!("Please enter integers as rows of a matrix, separated by blanks!") ; + println!("Enter to end!" ) ; + let mut lines = io::stdin( ).lock( ).lines( ) ; + let mut user_input = String::new( ) ; + while let Some( line ) = lines.next( ) { + let last_input = line.unwrap( ) ; + if last_input.len( ) == 0 { + break ; + } + else { + user_input.push_str("\n" ) ; + } + user_input.push_str( &last_input ) ; + } + let all_rows : Vec<&str> = user_input.split( "\n" ).collect( ) ; + let mut matrix : Vec> = Vec::new( ) ; + for a_row in &all_rows { + if a_row.len( ) > 0 { + let number_row : Vec = a_row.split_whitespace( ).map( | s | + s.trim( ).parse::( ).unwrap( )).collect( ) ; + matrix.push( number_row ) ; + } + } + let matrix_len : usize = matrix.len( ) ; + let row_len : usize = matrix[0].len( ) ; + let mut result : Vec> = Vec::new( ) ; + for r in 0..matrix_len - 1 { + let mut result_line : Vec = Vec::new( ) ; + for col in 0..row_len - 1 { + let sum = matrix[r][col] + matrix[r][col + 1] + matrix[r + 1][col] + + matrix[r + 1][col + 1] ; + result_line.push( sum ) ; + } + result.push( result_line ) ; + } + println!("{:?}" , result ) ; + Ok(()) +} -- cgit