Widespread Augmented Reality

Widespread Augmented Reality
Click on the image to get the Android Augmented Reality Heads up Display

Thursday, March 30, 2023

Python Brute Force Solution to Euler Project Problem 60

My cumbersome solution to https://projecteuler.net/problem=60 but I'll take it. I cheated by setting the loop limits to 10000.

import math
from math import sqrt
def isPrime(n):
prime_flag = 0
if(n > 1):
for i in range(2, int(sqrt(n)) + 1):
if (n % i == 0):
prime_flag = 1
break
if (prime_flag == 0):
return True
else:
return False
else:
return False
# main sequence
concatprime = False
start = 2
for a in range(start, 10000):
if isPrime(a) and concatprime == False:
for b in range(a+1, 10000):
if isPrime(b):
ab = str(a)+str(b)
ba = str(b)+str(a)
if isPrime(int(ab)) and isPrime(int(ba)):
#print(str(a)+","+str(b))
for c in range(b+1, 10000):
if isPrime(c):
ac = str(a)+str(c)
ca = str(c)+str(a)
bc = str(b)+str(c)
cb = str(c)+str(b)
if isPrime(int(ac)) and isPrime(int(ca)) and isPrime(int(bc)) and isPrime(int(cb)):
#print(str(a)+","+str(b)+","+str(c))
for d in range(c+1, 10000):
if isPrime(d):
da = str(d)+str(a)
ad = str(a)+str(d)
db = str(d)+str(b)
bd = str(b)+str(d)
dc = str(d)+str(c)
cd = str(c)+str(d)
if isPrime(int(da)) and isPrime(int(ad)) and isPrime(int(db)) and isPrime(int(bd)) and isPrime(int(dc)) and isPrime(int(cd)):
#print(str(a)+","+str(b)+","+str(c)+","+str(d))
for e in range(d+1, 10000):
if isPrime(e):
ea = str(e)+str(a)
ae = str(a)+str(e)
eb = str(e)+str(b)
be = str(b)+str(e)
ec = str(e)+str(c)
ce = str(c)+str(e)
ed = str(e)+str(d)
de = str(d)+str(e)
if isPrime(int(ea)) and isPrime(int(ae)) and isPrime(int(eb)) and isPrime(int(be)) and isPrime(int(ec)) and isPrime(int(ce)) and isPrime(int(ed)) and isPrime(int(de)):
print(str(a)+","+str(b)+","+str(c)+","+str(d)+","+str(e))
print(a+b+c+d+e)
concatprime = True
#start = 10000
break

Sunday, March 26, 2023

Python - Count Winning Poker Hands in File

import time
start = time.time()
pokerhands = open("p054_poker.txt", "r+")
#pokerhands = open("p054_poker_hand.txt", "r+")
print("File to read: ", pokerhands.name)
# Read single line in file
two_hands = pokerhands.readline().strip()
#---------------- functions -----------
def convertPic(c):
if c == "T":
c = 10
if c == "J":
c = 11
if c == "Q":
c = 12
if c == "K":
c = 13
if c == "A":
c = 14
return c
def stripNums(player):
nums = []
for card in player:
nums.append(int(convertPic(card[0])))
return nums
def stripSuits(player):
suits = []
for card in player:
suits.append(card[1])
return suits
def isFlush(s):
if([s[0]]*len(s) == s):
return True
else:
return False
def isRoyal(nums):
nums.sort()
if (nums == [10, 11, 12, 13, 14]):
return True
else:
return False
def isStraight(nums):
if sorted(nums) == list(range(min(nums), max(nums)+1)) or sorted(nums) == [2,3,4,5,14]:
return True
def lowStraight(nums):
if sorted(nums) == [2, 3, 4, 5, 14]:
return True
def countSimilar(cards):
#see groupcards.py
likecnt = 1
groupings = []
grouped = []
for index in range(0, len(cards)):
if index < 4:
if cards[index] == cards[index+1]:
likecnt+=1
else:
if likecnt > 1:
grouped = [cards[index], likecnt]
groupings.append(grouped)
likecnt = 1
grouped = []
else:
if likecnt > 1:
grouped = [cards[index], likecnt]
groupings.append(grouped)
# no combos
if len(groupings) == 0:
hand = 1
high = max(cards)
# one combo of either pair, three or four
if len(groupings) == 1:
if groupings[0][1] == 4:
hand = 8
high = groupings[0][0]
if groupings[0][1] == 3:
hand = 4
high = groupings[0][0]
if groupings[0][1] == 2:
hand = 2
high = groupings[0][0]
# two combos - two pair or full house
if len(groupings) == 2:
pairs = []
threes = 0
for g in groupings:
if g[1] == 2:
pairs.append(g[0])
if g[1] == 3:
threes = g[0]
# two pairs
if threes == 0:
hand = 3
high = max(pairs)
else:
# full house with high of 3 combo
hand = 7
high = threes
result = [hand, high]
return result
#---------------------
def calcHand(player):
hand = 1
high = 1
nums = stripNums(player)
suits = stripSuits(player)
#check for flush first
if isFlush(suits) == True:
hand = 6
high = max(nums)
if isRoyal(nums) == True:
hand = 10
high = 15
if isStraight(nums) == True:
hand = 9
high = max(nums)
if lowStraight(nums) == True:
hand = 9
nums.remove(14)
high = max(nums)
#fall through to all other possible groupings including none
#scored 1,2,4,3,7,8
if hand == 1 and high == 1:
hand = countSimilar(nums)[0]
high = countSimilar(nums)[1]
return [hand, high]
def nextHigh(player, high):
#get next high if hands identical
nums = stripNums(player)
newnums = [i for i in nums if i != high]
return max(newnums)
# ------ start main
rec_cnt = 0
player1wins = 0
player2wins = 0
while two_hands:
cardarray = two_hands.split(" ")
player1 = cardarray[0:5]
player1.sort()
player1hand = calcHand(player1)[0]
player1high = calcHand(player1)[1]
###################
player2 = cardarray[5:10]
player2.sort()
player2hand = calcHand(player2)[0]
player2high = calcHand(player2)[1]
# compare and count wins
if player1hand > player2hand:
player1wins+=1
else:
if player1hand < player2hand:
player2wins+=1
else:
if player1hand == player2hand:
if player1high > player2high:
player1wins+=1
else:
if player1high < player2high:
player2wins+=1
else:
if player1high == player2high:
if nextHigh(player1, player1high) > nextHigh(player2, player2high):
player1wins+=1
else:
player2wins+=1
############ continue reading file #######
# use readline() to read next line
two_hands = pokerhands.readline().strip()
rec_cnt+=1
end = time.time()
print("execution time : ", (end-start) * 10**3, "ms")
# print scores and close opened file
print("record_cnt = "+str(rec_cnt))
print("player1 wins = "+str(player1wins))
print("player2 wins = "+str(player2wins))
pokerhands.close()

File to read: p054_poker.txt
execution time : 627.8073787689209 ms
record_cnt = 1000
player1 wins = 376
player2 wins = 624
[Program finished]

Saturday, March 4, 2023

Updating Kali NetHunter on Nexus 7 Android Tablet

My last posts regarding Nethunter were back in August and October 2018.

  • Opened Nethunter terminal
  • cd /etc/apt
  • nano sources.list
  • FYI: path on Android root directory is /data/local/nhsystem/kali-armhf/etc/apt/sources.list
  • http://http.kali.org/kali kali-rolling main non-free contrib
  • sudo apt update
  • Got KEYEXPIRED error
  • apt-key list | grep "expired"
  • apt-key list
  • apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7D8D0BF6
  • sudo apt update
  • Now I can run "sudo apt install netdiscover". Beats downloading a Google Play network mapping app with ads and other neat stuff.

    Wednesday, February 22, 2023

    Tuesday, February 21, 2023

    Kali Linux: HackRF, CubicSDR and DSDPlus on Dell Laptop with 4GB RAM

    Enable 32 bit architecture for Wine to run DSDPlus
    sudo dpkg --add-architecture i386
    dpkg --print-foreign-architectures
    sudo apt update && sudo apt -y full-upgrade
    reboot
    sudo apt-get install wine32:i386
    Create DSDPlus folder
    Put all DSD files in that folder (see reference links below)
    Open terminal in DSDPlus folder
    wine DSDPlus.exe
    If get wine: could not load kernel32.dll, status c0000135
    then
    rm -R ~/.wine
    wine DSDPlus.exe
    exit

    Install SDR software
    sudo apt install hackrf
    sudo apt install gnuradio
    sudo apt install gr-osmosdr
    sudo apt install cubicsdr
    sudo apt install gqrx-sdr

    Start CubicSDR from App menu
    wine DSDPlus.exe
    pavucontrol
    Playback tab is:
    CubicSDR Audio Output on [Virtual Sink]
    DSDPlus.exe:audio stream... on [Built-in Audio Analog Stereo]
    Recording tab is:
    DSDPlus.exe ... from [Monitor Virtual_Sink]
    Test police frequencies 506.939 or 506.739 MHz

    Reference Links
    https://techviewleo.com/how-to-install-wine-on-kali-linux/ https://hagensieker.com/2018/04/29/dsd-in-ubuntu-18-04/