2022-12-03 03:40:46 +01:00
package helper
import (
2022-12-11 04:28:52 +01:00
"constraints"
2022-12-15 01:02:04 +01:00
"errors"
2022-12-07 16:45:39 +01:00
"fmt"
2022-12-03 03:40:46 +01:00
"os"
2022-12-18 19:39:49 +01:00
"strconv"
2022-12-03 03:40:46 +01:00
"strings"
2022-12-07 16:45:39 +01:00
"time"
2022-12-03 03:40:46 +01:00
)
func check ( e error ) {
if e != nil {
panic ( e )
}
}
func RemoveError [ T any ] ( value T , e error ) T {
check ( e )
return value
}
func ReadTextFile ( filePath string ) [ ] string {
file , err := os . ReadFile ( filePath )
check ( err )
return strings . Split ( string ( file ) , "\r\n" )
}
2022-12-06 10:44:00 +01:00
func GetKeysOfSetMap [ T int | string ] ( inputMap map [ T ] bool ) [ ] T {
keys := make ( [ ] T , len ( inputMap ) )
i := 0
for k := range inputMap {
keys [ i ] = k
i ++
}
return keys
}
2022-12-07 16:45:39 +01:00
func MeasureTime ( process string ) func ( ) {
fmt . Printf ( "Start %s\n" , process )
start := time . Now ( )
return func ( ) {
2022-12-07 18:47:24 +01:00
fmt . Printf ( "Time taken by %s is %v\n" , process , time . Since ( start ) . Nanoseconds ( ) )
2022-12-07 16:45:39 +01:00
}
}
2022-12-04 23:09:37 +01:00
func FindRepeatedItems [ T int | int64 ] ( itemgroup1 , itemgroup2 [ ] T ) [ ] T {
elementsCompartment1 := map [ T ] bool { }
repeatedElemnts := map [ T ] bool { }
for _ , item := range itemgroup1 {
elementsCompartment1 [ item ] = true
}
for _ , item := range itemgroup2 {
if elementsCompartment1 [ item ] {
repeatedElemnts [ item ] = true
}
}
v := make ( [ ] T , 0 , len ( repeatedElemnts ) )
for key , _ := range repeatedElemnts {
v = append ( v , key )
}
return v
}
2022-12-03 03:40:46 +01:00
func FindMax [ T int | int64 ] ( slice [ ] T ) ( m T ) {
for i , e := range slice {
if i == 0 || e > m {
m = e
}
}
return
}
func Sum [ T int | int64 ] ( slice [ ] T ) ( s T ) {
for _ , e := range slice {
s += e
}
return
}
2022-12-09 21:37:26 +01:00
2022-12-11 04:28:52 +01:00
func Contains2Int [ T [ 2 ] int ] ( elems [ ] T , v T ) bool {
for _ , s := range elems {
if v == s {
return true
}
}
return false
}
func Contains [ T constraints . Ordered ] ( elems [ ] T , v T ) bool {
2022-12-09 21:37:26 +01:00
for _ , s := range elems {
if v == s {
return true
}
}
return false
}
2022-12-12 21:54:34 +01:00
2022-12-17 18:02:58 +01:00
func Remove [ T any ] ( s * [ ] T , i int ) {
( * s ) [ i ] = ( * s ) [ len ( * s ) - 1 ]
* s = ( * s ) [ : len ( * s ) - 1 ]
2022-12-12 21:54:34 +01:00
}
2022-12-15 01:02:04 +01:00
2022-12-17 19:32:19 +01:00
func RemoveElement [ T constraints . Ordered ] ( s [ ] T , i T ) [ ] T {
newS := [ ] T { }
for _ , val := range s {
if val != i {
newS = append ( newS , val )
}
}
return newS
}
2022-12-15 01:02:04 +01:00
func GetValueOf2DMap [ T any ] ( location [ 2 ] int , map2D * [ ] [ ] T ) ( T , error ) {
if location [ 0 ] >= len ( * map2D ) {
return ( * map2D ) [ 0 ] [ 0 ] , errors . New ( "First location value too big" )
}
if location [ 1 ] >= len ( ( * map2D ) [ location [ 0 ] ] ) {
return ( * map2D ) [ 0 ] [ 0 ] , errors . New ( "Second location value too big" )
}
return ( * map2D ) [ location [ 0 ] ] [ location [ 1 ] ] , nil
}
func SetValueOf2DMap [ T any ] ( location [ 2 ] int , value T , map2D * [ ] [ ] T ) int {
if location [ 0 ] >= len ( * map2D ) {
return - 1
}
if location [ 1 ] >= len ( ( * map2D ) [ location [ 0 ] ] ) {
return - 1
}
( * map2D ) [ location [ 0 ] ] [ location [ 1 ] ] = value
return 0
}
2022-12-16 00:29:33 +01:00
func Abs [ T constraints . Integer ] ( x T ) T {
if x < 0 {
return - x
}
return x
}
func ManHattanDistance ( p1 , p2 [ 2 ] int ) int {
return Abs ( p1 [ 0 ] - p2 [ 0 ] ) + Abs ( p1 [ 1 ] - p2 [ 1 ] )
}
2022-12-18 19:39:49 +01:00
func StringSliceToIntSlice ( input [ ] string ) [ ] int {
intSlice := [ ] int { }
for _ , str := range input {
intSlice = append ( intSlice , RemoveError ( strconv . Atoi ( str ) ) )
}
return intSlice
}