Unable to replicate shuffle in a array in Swift - swift

I have two arrays that I want to shuffle. These are the two arrays:
var allCards = ["2_of_clubs", "2_of_spades", "2_of_diamonds", "2_of_hearts", "3_of_clubs", "3_of_spades", "3_of_diamonds", "3_of_hearts", "4_of_clubs", "4_of_spades", "4_of_diamonds", "4_of_hearts", "5_of_clubs", "5_of_spades", "5_of_diamonds", "5_of_hearts", "6_of_clubs", "6_of_spades", "6_of_diamonds", "6_of_hearts", "7_of_clubs", "7_of_spades","7_of_diamonds","7_of_hearts", "8_of_clubs", "8_of_spades", "8_of_diamonds", "8_of_hearts", "9_of_clubs", "9_of_spades", "9_of_diamonds", "9_of_hearts", "10_of_clubs", "10_of_spades", "10_of_diamonds", "10_of_hearts", "jack_of_clubs", "jack_of_spades", "jack_of_diamonds", "jack_of_hearts", "queen_of_clubs", "queen_of_spades", "queen_of_diamonds", "queen_of_hearts", "king_of_clubs", "king_of_spades", "king_of_diamonds", "king_of_hearts", "ace_of_clubs", "ace_of_spades", "ace_of_diamonds", "ace_of_hearts"]
var allValues = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14]
I want to shuffle them equally, so value 2 stays at 2 of clubs, 2 of spades and so on. I tried using the answers from Shuffle array swift 3 and How do I shuffle an array in Swift? they stated this should work:
let randomIndex = UInt64(arc4random_uniform(UInt32(1000)))
let randomShuffle = GKLinearCongruentialRandomSource(seed: randomIndex)
let shuffledValues = randomShuffle.arrayByShufflingObjects(in: allValues)
let shuffledCards = randomShuffle.arrayByShufflingObjects(in: allCards)
print(shuffledValues)
print(shuffledCards)
I get this as a print:
[3, 6, 5, 5, 9, 10, 11, 11, 8, 6, 5, 3, 14, 12, 3, 8, 2, 3, 10, 4, 13, 12, 7, 12, 10, 5, 12, 13, 14, 11, 2, 6, 9, 7, 10, 14, 7, 8, 6, 14, 4, 9, 13, 2, 11, 9, 4, 7, 8, 2, 13, 4]
[jack_of_clubs, 6_of_hearts, 10_of_hearts, 6_of_spades, king_of_hearts, 5_of_spades, 5_of_hearts, ace_of_diamonds, queen_of_diamonds, 10_of_spades, 7_of_hearts, queen_of_spades, 9_of_clubs, 2_of_diamonds, 3_of_hearts, 3_of_diamonds, 9_of_spades, queen_of_clubs, 8_of_clubs, 9_of_diamonds, 7_of_clubs, 3_of_spades, 8_of_spades, 8_of_hearts, 5_of_clubs, 6_of_diamonds, ace_of_spades, 2_of_spades, ace_of_clubs, 10_of_diamonds, 4_of_spades, 2_of_clubs, 10_of_clubs, king_of_diamonds, 7_of_diamonds, 6_of_clubs, 8_of_diamonds, queen_of_hearts, 9_of_hearts, jack_of_diamonds, 2_of_hearts, king_of_clubs, jack_of_spades, 4_of_hearts, 7_of_spades, 3_of_clubs, 4_of_diamonds, 4_of_clubs, king_of_spades, jack_of_hearts, ace_of_hearts, 5_of_diamonds]
Both have the same count. I am curious why this does not work. Is it possible to edit this code to make it work, else I would like to know how to shuffle an array and replicate that.

You can pair up your elements with zip, then shuffle, then unzip.
let pairs = Array(zip(allCards, allValues))
let randomIndex = UInt64(arc4random_uniform(UInt32(1000)))
let randomShuffle = GKLinearCongruentialRandomSource(seed: randomIndex)
let shuffledPairs = randomShuffle.arrayByShufflingObjects(in: pairs) as! [(String, Int)]
let shuffledCards = shuffledPairs.map { $0.0 }
let shuffledValues = shuffledPairs.map { $0.1 }

Related

Combined arrays and index out range issues in Swift array chunking problem

I am trying to chunk a given array as per pre-determined size, I know there are other solution to the same problem but I wanted mine to be a little simpler.
Here is my code:
import Foundation
let numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
var size = 2
var offset = size
var index = 0
while (index < (numbers.count) - 1)
{
var slicedArray = numbers[index...(size - 1)]
print(slicedArray)
let arrayOfInts = Array(slicedArray)
print(arrayOfInts)
index = index + offset
size = size + size
}
Desired output:
//[2, 3]
//[4, 5]
...
Actual output:
//[2, 3]
//[4, 5]
//[6, 7, 8, 9]
//[8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
//Fatal error: Array index is out of range
I know for sure this is logical error but unable to pin-point the exact reason. Also unable to understand as to why output arrays are being combined:
`[6, 7, 8, 9]` instead of `[6,7]` & `[8,9]`
You may use stride to divide your array into chunks.
For convenience you can use the extension proposed here:
extension Array {
func chunked(into size: Int) -> [[Element]] {
return stride(from: 0, to: count, by: size).map {
Array(self[$0 ..< Swift.min($0 + size, count)])
}
}
}
let numbers = Array(2...20)
let result = numbers.chunked(into: 2)
print(result)
// [[2, 3], [4, 5], [6, 7], [8, 9], [10, 11], [12, 13], [14, 15], [16, 17], [18, 19], [20]]
You can make it simpler:
let numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
var size = 2
let offset = size
var index = 0
while (index < (numbers.count) - 1) {
let slicedArray = numbers[index...index+1]
let arrayOfInts = Array(slicedArray)
print(arrayOfInts)
index = index + offset
}

How can I raise all the elements in an int array by a power of 3 in Swift?

For example say I have the array:
let nums = [1, 2, 3, 4, 5, 6]
I would like to output a new array with the cube values: [1, 8, 27, 64, 125, 216]
Do I have to use a loop?
You can use map() and pow() together:
import Foundation
let nums = [1, 2, 3, 4, 5, 6]
let cubes = nums.map { Int(pow(Double($0), 3)) }
let raisedBySix = nums.map { Int(pow(Double($0), 6)) }
print(cubes) // [1, 8, 27, 64, 125, 216]
print(raisedBySix) // [1, 64, 729, 4096, 15625, 46656]

Spark - Remove intersecting elements between two array type columns

I have dataframe like this
+---------+--------------------+----------------------------+
| Name| rem1| quota |
+---------+--------------------+----------------------------+
|Customer_3|[258, 259, 260, 2...|[1, 2, 3, 4, 5, 6, 7,..500]|
|Customer_4|[18, 19, 20, 27, ...|[1, 2, 3, 4, 5, 6, 7,..500]|
|Customer_5|[16, 17, 51, 52, ...|[1, 2, 3, 4, 5, 6, 7,..500]|
|Customer_6|[6, 7, 8, 9, 10, ...|[1, 2, 3, 4, 5, 6, 7,..500]|
|Customer_7|[0, 30, 31, 32, 3...|[1, 2, 3, 4, 5, 6, 7,..500]|
I would like to remove list value in rem1 from quota and create as one new column. I have tried.
val dfleft = dfpci_remove2.withColumn("left",$"quota".filter($"rem1"))
<console>:123: error: value filter is not a member of org.apache.spark.sql.ColumnName
Please advise.
You can use a filter in a column in such way, you can write an udf as below
val filterList = udf((a: Seq[Int], b: Seq[Int]) => a diff b)
df.withColumn("left", filterList($"rem1", $"quota") )
This should give you the expected result.
Hope this helps!

illegal division by zero:Perl

I have written a code to find determinant of a 10X10 matrix. This code gives the proper result till 9X9 matrix. But for 10X10 matrix gives the following error
"Use of Uninitialized value in multiplication <*> at line 23
Illegal division by zero at line 21"
I tried for 11X11 matrix also, but it is giving the wrong answer.
Why this code is giving such error...
Following is the code:
#!/usr/bin/perl
use strict;
use warnings;
my #x1=(
[5, 6, 3, 2, 4, 9, 3, 5, 4, 2],
[12, 9, 8, 3, 3, 0, 6, 9, 3, 4],
[8, 6, 5, 8, 9, 3, 9, 3, 9, 5],
[6, 4, 3, 0, 6, 4, 8, 2, 22, 8],
[8, 3, 2, 5, 2, 12, 7, 1, 6, 9],
[5, 9, 3, 9, 5, 1, 3, 8, 4, 2],
[3, 10, 4, 16, 4, 7, 2, 12, 9, 6],
[2, 12, 9, 13, 8, 3, 1, 16, 0, 6],
[3, 6, 8, 5, 12, 8, 4, 19, 8, 5],
[2, 5, 6, 4, 9, 10, 3, 11, 7, 3]
);
# Matrix of nxn
for (my $i=0;$i le 9;$i++) {
for (my $j=0;$j le 9;$j++) {
if($j>$i) {
my $ratio = $x1[$j][$i]/$x1[$i][$i];
for(my $k = 0; $k le 9; $k++){
$x1[$j][$k] -= $ratio * $x1[$i][$k];
}
}
}
}
my $det1 = 1;
for(my $i = 0; $i le 9; $i++){
$det1 *= $x1[$i][$i];
}
printf $det1," ";
le doesn't do what you think it does. http://perldoc.perl.org/perlop.html
Binary "le" returns true if the left argument is stringwise less than or equal to the right argument.
print 10 le 9,"\n";
print 10 <= 9,"\n";
It's a stringwise comparison not a numeric one.
So "10" le "9" is true, because alphabetically 10 is before 9.
But this would work fine for a smaller matrix, because 9 le 8 is a valid comparison and works the 'right way'.
You should use <= instead:
Binary "<=" returns true if the left argument is numerically less than or equal to the right argument.
You can also probably auto-scale by using $#x1 for your comparison, which is the value of the last array index. In your example above, $#x1 is 9, because your array is 0-9

Octave(MATLAB): Error in function on some inputs

I wrote the following function for my filter,
function filteredX=dftFilter(X,lowerBound,upperBound)
lower=max(ceil((lowerBound/(2*pi))*length(X)), 1);
upper=floor((upperBound/(2*pi))*length(X));
filteredX=zeros(1,length(X));
for int=lower:upper
filteredX(int)=X(int);
end
endfunction
If I use it for the following input, everything works correctly
dftFilter([3, 5, 7, 9, 11, 13, 12, 14, 16, 18, 20], (pi / 4), ((3 * pi) / 4))
dftFilter([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ((3 * pi) / 4), (2 * pi)
but when I use it on this one (notice that the length of array is now 11 instead of 10)
dftFilter([2, 4, 6, 7, 2, 11, 23, 12, 34, 21, 17], 0, 2 * pi)
it gives an error
subscript indices must be either positive integers or logicals.
on line
filteredX(int)=X(int);
I tried to emulate this process in console.
X = [2, 4, 6, 7, 2, 11, 23, 12, 34, 21, 17];
lower=max(ceil((0/(2*pi))*length(X)), 1);
upper=floor((2*pi/(2*pi))*length(X));
filterexX=zeros(1,length(X));
for int=lower:upper;
filteredX(int)=X(int)
end
and it works fine.
PS: I'm using Octave
Print the value of int, inside your loop! You will see it is not an integer one, thus you indexing the matrix, with a real number, not an integer!