Giter Club home page Giter Club logo

Comments (20)

BethanyG avatar BethanyG commented on June 4, 2024 2

Up for helping. Editing in process.

from python.

iHiD avatar iHiD commented on June 4, 2024 1

Thank you! Just in time for Erik to start working on today :)

from python.

ErikSchierboom avatar ErikSchierboom commented on June 4, 2024 1

Thanks for the help! We've updated the tags.

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: word-count

Code

from collections import Counter
import re


def count_words(sentence):
    return Counter(re.findall(r"([a-z\d]+(?:\'[a-z\d]+)?)", sentence.lower()))

Tags:

construct:dictionary
construct:from-import
construct:function
construct:import
construct:instantiation
construct:invocation
construct:parameter
construct:python-raw-string
construct:return
construct:string
paradigm:imperative
technique:regular-expression
uses:collections.Counter
uses:positional-argument
uses:positional-parameter
uses:re.findall
uses:str.lower

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: acronym

Code

import re

def abbreviate(phrase):
    new_str = []
    last_char = None
    for char in phrase:
        if _is_letter(char) and (_not_letter(last_char) or _cap_follows_lower(char, last_char)):
            new_str.append(char.upper())
        last_char = char
    return ''.join(new_str)

def _is_letter(char):
    return re.search('\w', char)

def _not_letter(char):
    return char is None or re.search(r'[\W]', char)

def _cap_follows_lower(char, last_char):
    return re.search(r'[a-z]', last_char) and re.search(r'[A-Z]', char)

Tags:

construct:and
construct:assignment
construct:conditional
construct:definition
construct:for-loop
construct:function
construct:identity-comparison
construct:if-statement
construct:import
construct:invocation
construct:list
construct:literal
construct:logical-and
construct:logical-or
construct:loop
construct:parameter
construct:python-None
construct:return
construct:string
construct:variable
paradigm:functional
paradigm:imperative
technique:boolean-logic
technique:looping
technique:regular-expression
uses:identity-operator
uses:list.append
uses:def-keyword
uses:positional-arguments
uses:positional-parameters
uses:python-None
uses:python-raw-string
uses:re.search
uses:str.join
uses:str.upper

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: scrabble-score

Code

_letter_scores = (
    ('AEIOULNRST', 1),
    ('DG', 2),
    ('BCMP', 3),
    ('FHVWY', 4),
    ('K', 5),
    ('JX', 8),
    ('QZ', 10)
)

SCORES = {}
for letters, score in _letter_scores:
    SCORES.update(dict.fromkeys(letters, score))


def score(word):
    try:
        return sum(SCORES[c] for c in word.upper())
    except KeyError:
        return 0

Tags:

construct:assignment
construct:call
construct:constant
construct:dict
construct:except
construct:for-loop
construct:function
construct:generator-expression
construct:indexing
construct:int
construct:invocation
construct:literal
construct:nested-dict
construct:nested-tuple
construct:parameter
construct:return
construct:string
construct:try
construct:tuple
construct:unpacking
construct:variable
paradigm:declarative
paradigm:functional
paradigm:imperative
technique: laziness
technique:error-handling
technique:exceptions
technique:generators
technique:looping
uses:bracket-notation
uses:builtins
uses:dict.fromkeys
uses:dict.update
uses:dot-notation
uses:generator-iterator
uses:global-variables
uses:positional-arguments
uses:positional-parameters
uses:str.upper
uses:try-except

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: sublist

Code

EQUAL = 0
SUBLIST = 1
SUPERLIST = 2
UNEQUAL = 3


def list_in_list(little, big):
    # Find little list in big list
    n = len(little)
    sublists = (big[i:i+n] for i in range(0, len(big)))
    return little in sublists


def check_lists(list1, list2):
    if list1 == list2:
        return EQUAL

    if len(list1) > len(list2):
        return SUPERLIST if list_in_list(list2, list1) else UNEQUAL

    if len(list1) < len(list2):
        return SUBLIST if list_in_list(list1, list2) else UNEQUAL

    return UNEQUAL

Tags:

construct:assignment
construct:boolean
construct:call
construct:comment
construct:comparison
construct:constant
construct:definition
construct:function
construct:generator-expression
construct:if-statement
construct:indexing
construct:int
construct:integral-number
construct:invocation
construct:list
construct:membership-test
construct:number
construct:parameter
construct:return
construct:slice
construct:ternary
construct:value-comparison
construct:variable
paradigm:functional
paradigm:imperative
paradigm:reflective
technique:laziness
uses:bracket-notation
uses:builtins
uses:generator-iterator
uses:len
uses:list
uses:list-slicing
uses:positional-arguments
uses:positional-parameters
uses:range
uses:slice-notation

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: alphametics

Code

from itertools import chain, repeat, permutations
from string import digits


BASETRANS = str.maketrans('+=', '  ')


def solve(puzzle):
    *left_hand, right_hand = words = puzzle.translate(BASETRANS).split()

    letters = ''.join(set(chain.from_iterable(words)))
    nb_letters = len(letters)
    if nb_letters > 10:
        return dict()
    first_letters = set(ord(w[0]) for w in words)

    possible_numbers = permutations(digits, nb_letters)
    for l, nums in zip(repeat(letters), possible_numbers):
        table = str.maketrans(l, ''.join(nums))
        # if first_letters & set(k for k, v in table.items() if v == 48):
        #     continue
        if 48 in set(v for k, v in table.items() if k in first_letters):
            continue
        left_hand_sum = sum(int(w.translate(table)) for w in left_hand)
        right_hand_num = int(right_hand.translate(table))
        if left_hand_sum == right_hand_num:
            return {chr(k): v - 48 for k, v in table.items()}
    return dict()

Tags:

construct:assignment
construct:call
construct:comment
construct:comparison
construct:constant
construct:continue
construct:definition
construct:dict
construct:dictionary-comprehension
construct:equality-comparison
construct:explicit-conversion
construct:for-loop
construct:from-import
construct:function
construct:generator
construct:generator-expression
construct:global-variable
construct:if-statement
construct:implicit-conversion
construct:import
construct:indexing
construct:infinite-iterator
construct:int
construct:integral-number
construct:invocation
construct:iterable
construct:iteration
construct:iterator
construct:list
construct:membership-test
construct:method
construct:multiple-assignment
construct:number
construct:parameter
construct:return
construct:set
construct:string
construct:subtract
construct:tuple
construct:unpacking
construct:value-comparison
construct:variable
paradigm:functional
paradigm:imperative
technique:higher-order-functions
technique:laziness
technique:looping
technique:type-conversion
uses:bracket-notation
uses:builtins
uses:chr
uses:def-keyword
uses:dict
uses:dict-comprehension
uses:dict.items
uses:dot-notation
uses:for-keyword
uses:generator-iterator
uses:itertools.chain.from_iterable
uses:itertools.permutations
uses:itertools.repeat
uses:len
uses:list
uses:ord
uses:positional-arguments
uses:positional-parameters
uses:set
uses:str.join
uses:str.maketrans
uses:str.split
uses:str.translate
uses:sum
uses:tuple
uses:unpacking
uses:zip

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: collatz-conjecture

Code

def steps(num, count):
    if num == 1:
        return count
    elif num %2 == 0:
        return steps( num/2, count + 1)
    else:
        return steps( 1 + (num * 3), count + 1)


def collatz_steps(number):
    if( number <=0 ):
        return None
    else:
        return steps(number, 0)

Tags:

construct:add
construct:boolean
construct:call
construct:definition
construct:divide
construct:elif-statement
construct:else-statement
construct:equality-test
construct:float
construct:function
construct:if-statement
construct:implicit-conversion
construct:int
construct:integral-number
construct:invocation
construct:modulus
construct:multiply
construct:number
construct:parameter
construct:return
construct:value-comparison
construct:variable
paradigm:functional
technique:boolean-logic
technique:recursion
uses:positional-arguments
uses:positional-parameters
uses:python-None

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: go-counting

Code

import numpy as np
from collections import defaultdict
NONE, WHITE, BLACK = 'none', 'W', 'B'


class Board:
    def __init__(self, board):
        self.board = np.array([list(x) for x in board])
        self.moves = self.neighbours()
        self.sets, self.terr_map= {}, {}
        self.assign_territory()

    def territory(self, x, y):
        if min(x, y) < 0 or x > len(self.board) - 1 or y > len(self.board[0]) - 1:
            raise ValueError(' ')
        return (self.terr_map[(y, x)], self.sets[(y, x)])

    def territories(self):
        d = {WHITE: set(), BLACK: set(), NONE: set()}
        for coords in self.terr_map:
            d[self.terr_map[coords]] =  d[self.terr_map[coords]].union(self.sets[coords])
        return d

    def assign_territory(self):
        for coords in self.moves:
            x = self.board[coords]
            if x != ' ':
                self.terr_map[coords], self.sets[coords] = 'none', set()
            elif coords not in self.terr_map:
                self.boundaries(coords)

    def boundaries(self, coords):
        edges, assigned, stack = set(), set(), [coords]
        assigned.add(coords)
        while stack:
            current = stack.pop()
            while self.moves[current]:
                cds = self.moves[current].pop()
                if self.board[cds] != ' ':
                    edges.add(self.board[cds])
                else:
                    stack.append(cds)
                    assigned.add(cds)
        appelation = 'none' if len(edges) != 1 else edges.pop()
        for cds in assigned:
            self.sets[cds] = {(y, x) for x, y in assigned}
            self.terr_map[cds] = appelation

    def neighbours(self):
        c, d = ((1, 0), (-1, 0), (0, -1), (0, 1)), defaultdict(list)
        if self.board.shape == (1, 1):
            d[(0, 0)].append((0, 0))
        for row, arr in enumerate(self.board):
            for col, char in enumerate(arr):
                for a, b in c:
                    a, b = a + row, b + col
                    if min(a, b) < 0 or a > len(self.board) - 1  or b > len(self.board[0]) - 1:
                        continue
                    d[(row, col)].append((a, b))
        return d

Tags:

construct:add
construct:assignment
construct:boolean
construct:call
construct:class
construct:composition
construct:constant
construct:constructor
construct:continue
construct:definition
construct:dict
construct:for-loop
construct:from-import
construct:function
construct:global-variables
construct:if-statement
construct:import
construct:indexing
construct:initializer
construct:invocation
construct:iteration
construct:list
construct:list-comprehension
construct:literal
construct:logical-or
construct:membership-test
construct:method
construct:multiple-assignment
construct:nested-loop
construct:nested-tuple
construct:number
construct:parameter
construct:return
construct:set
construct:set-comprehension
construct:slice
construct:string
construct:subtract
construct:trinary
construct:tuple
construct:variable
construct:while-loop
paradigm:functional
paradigm:imperative
paradigm:object-oriented
technique:boolean-logic
technique:exceptions
technique:higher-order-functions
technique:looping
uses:attributes
uses:bracket-notation
uses:builtins
uses:class-keyword
uses:collections.defaultdict
uses:comparison-chaining
uses:def-keyword
uses:dict.union
uses:dot-notation
uses:enumerate
uses:for-keyword
uses:len
uses:list.append
uses:list.pop
uses:loop-variables
uses:min
uses:multiple-assignment
uses:np.array
uses:raise-keyword
uses:set
uses:set.add
uses:set.pop
uses:str
uses:tuple
uses:unpacking

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: complex-numbers

Code

from math import sin, cos, exp, sqrt


class ComplexNumber(object):
    def __init__(self, real, imaginary):
        self.real = real
        self.imaginary = imaginary

    def add(self, other):
        return ComplexNumber(self.real + other.real,
                             self.imaginary + other.imaginary)

    def mul(self, other):
        return ComplexNumber(
            self.real * other.real - self.imaginary * other.imaginary,
            self.imaginary * other.real + self.real * other.imaginary)

    def sub(self, other):
        return ComplexNumber(self.real - other.real,
                             self.imaginary - other.imaginary)

    def div(self, other):
        denominator = float(other.real**2 + other.imaginary**2)
        result_real = (
            self.real * other.real + self.imaginary * other.imaginary
        ) / denominator
        result_imaginary = (
            self.imaginary * other.real - self.real * other.imaginary
        ) / denominator
        return ComplexNumber(result_real, result_imaginary)

    def abs(self):
        return sqrt(self.mul(self.conjugate()).real)

    def conjugate(self):
        return ComplexNumber(self.real, -self.imaginary)

    def exp(self):
        real_exp = exp(self.real)
        return ComplexNumber(real_exp * cos(self.imaginary),
                             real_exp * sin(self.imaginary))

Tags:

construct:add
construct:assignment
construct:attributes
construct:call
construct:class
construct:constructor
construct:definition
construct:divide
construct:explicit-conversion
construct:exponentiation
construct:float
construct:floating-point-number
construct:from-import
construct:imaginary-number
construct:implicit-conversion
construct:inheritance
construct:initialization
construct:instantiation
construct:int
construct:invocation
construct:method
construct:method-override
construct:multiply
construct:parameter
construct:return
construct:sqrt
construct:subtract
construct:variable
paradigm:imperative
paradigm:object-oriented
technique:higher-order-functions
uses:def-keyword
uses.math.cosin
uses.math.sin
uses:dot.notation
uses:math.exp
uses:math.mul
uses:math.sqrt
uses:positional-argument
uses:positional-parameter

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: markdown

Code

import re


def md_if_headers(line):
    if re.match('###### (.*)', line) is not None:
        line = '<h6>' + line[7:] + '</h6>'
    elif re.match('## (.*)', line) is not None:
        line = '<h2>' + line[3:] + '</h2>'
    elif re.match('# (.*)', line) is not None:
        line = '<h1>' + line[2:] + '</h1>'
    return line


def md_if_markup_or_list(in_list, line):
    m = re.match(r'\* (.*)', line)
    if m:
        if not in_list:
            in_list = True
            is_bold = False
            is_italic = False

            curr = m.group(1)
            m1 = re.match('(.*)__(.*)__(.*)', curr)
            if m1:
                curr = m1.group(1) + '<strong>' + \
                    m1.group(2) + '</strong>' + m1.group(3)
                is_bold = True
            m1 = re.match('(.*)_(.*)_(.*)', curr)
            if m1:
                curr = m1.group(1) + '<em>' + m1.group(2) + \
                    '</em>' + m1.group(3)
                is_italic = True
            if is_italic or is_bold:
                line = '<ul><li>' + curr + '</li>'
            else:
                line = '<ul><li><p>' + curr + '</p></li>'
        else:
            is_bold = False
            is_italic = False
            curr = m.group(1)
            m1 = re.match('(.*)__(.*)__(.*)', curr)
            if m1:
                curr = m1.group(1) + '<strong>' + \
                    m1.group(2) + '</strong>' + m1.group(3)
                is_bold = True
            m1 = re.match('(.*)_(.*)_(.*)', curr)
            if m1:
                curr = m1.group(1) + '<em>' + m1.group(2) + \
                    '</em>' + m1.group(3)
                is_italic = True
            if is_italic or is_bold:
                line = '<li>' + curr + '</li>'
            else:
                line = '<li><p>' + curr + '</p></li>'
    else:
        if in_list:
            line = '</ul>+i'
            in_list = False
    return in_list, line


def md_close_some(res, line):
    m = re.match('<h|<ul|<p|<li', line)
    if not m:
        line = '<p>' + line + '</p>'
    m = re.match('(.*)__(.*)__(.*)', line)
    if m:
        line = m.group(1) + '<strong>' + m.group(2) + '</strong>' + m.group(3)
    m = re.match('(.*)_(.*)_(.*)', line)
    if m:
        line = m.group(1) + '<em>' + m.group(2) + '</em>' + m.group(3)
    res += line
    return res


def md_close_if_list(in_list, res):
    if in_list:
        res += '</ul>'
    return res


def parse_markdown(markdown):
    lines = markdown.split('\n')
    res = ''
    in_list = False
    for line in lines:
        line = md_if_headers(line)
        in_list, line = md_if_markup_or_list(in_list, line)
        res = md_close_some(res, line)
    res = md_close_if_list(in_list, res)
    return res

Tags:

consgruct:addition-assignment
construct:assignment
construct:boolean
construct:call
construct:comparison
construct:conditional
construct:definition
construct:elif
construct:else
construct:for-loop
construct:function
construct:identity-test
construct:if-statement
construct:implicit-conversion
construct:import
construct:indexing
construct:int
construct:invocation
construct:iteration
construct:list
construct:logical-or
construct:membership-test
construct:multiple-assignment
construct:multiply
construct:negation
construct:nested-if
construct:nested-conditional
construct:parameter
construct:python-raw-string
construct:regular-expression
construct:return
construct:slice
construct:string
construct:string-concatenation
construct:tuple
construct:variable
paradigm:imperative
techinique:regular-expressions
technique:boolean-logic
technique:looping
uses:bracket-notation
uses:def-keyword
uses:dot.notation
uses:not-keyword
uses:positional-argument
uses:positional-parameter
uses:python-None
uses:re
uses:re.match
uses:regex-groups
uses:slice-notation
uses:str.split
uses:string-concatenation
uses:string-slicing
uses:truthiness

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: error-handling

Code

def handle_error_by_throwing_exception():
    raise Exception('Opps')


def handle_error_by_returning_none(input_data):
    try:
        return int(input_data)
    except Exception:
        return None


def handle_error_by_returning_tuple(input_data):
    result = handle_error_by_returning_none(input_data)
    return (result is not None, result)


def filelike_objects_are_closed_on_exception(filelike_object):
    with filelike_object as f:
        f.do_something()

Tags:

construct:aliasing
construct:assignment
construct:boolean
construct:call
construct:context-manager
construct:definition
construct:except
construct:explicit-conversion
construct:function
construct:identity-test
construct:instantiation
construct:invocation
construct:iteration
construct:method
construct:negation
construct:parameter
construct:raise
construct:return
construct:string
construct:try
construct:tuple
construct:variable
paradigm:imperative
technique:exceptions
uses:aliasing
uses:context-manager
uses:def-keyword
uses:except-keyword
uses:dot-notation
uses:positional-arguments
uses:positional-parameters
uses:python-None
uses:try-keyword
uses:tuple
uses:with-keyword
uses:with-statement

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: accumulate

Code

def accumulate(collection, operation):
	return [operation(x) for x in collection]

Tags:

construct:call
construct:definition
construct:function
construct:iteration
construct:list
construct:list-comprehension
construct:literal
construct:parameter
construct:return
construct:return
paradigm:functional
uses:def-keyword
uses:list
uses:list-comprehension
uses:positional-argument
uses:positional-parameter

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: trinary

Code

max_base = 10 + 26


def digit_to_decimal(digit, base):
    """Convert a 'digit' of the given 'base' into a number."""
    if ('0' <= digit <= '9'):
        result = ord(digit) - ord('0')
    elif ('a' <= digit <= 'z'):
        result = ord(digit) - ord('a') + 10
    elif ('A' <= digit <= 'A'):
        result = ord(digit) - ord('A') + 10
    else:
        raise ValueError("not a digit: {}".format(digit))
    if result >= base:
        raise ValueError("invalid digit {} for base {}".format(digit, base))
    return result


def parse_integer(text, base):
    """Parse an 'text' representation of a number of given 'base'."""
    if not 2 <= base <= max_base:
        raise ValueError("invalid base: {}".format(base))
    result = 0
    for i, digit in enumerate(reversed(text)):
        result += base ** i * digit_to_decimal(digit, base)
    return result


def trinary(text):
    """Convert text representation of a trinary number to a number."""
    try:
        return parse_integer(text, 3)
    except ValueError:
        return 0

Tags:

construct:add
construct:addition-assignment
construct:assignment
construct:boolean
construct:call
construct:comment
construct:comparisons
construct:comparison-chaining
construct:conditional
construct:elif
construct:else
construct:error-handling
construct:except
construct:exponentiation
construct:for-loop
construct:format
construct:function
construct:global-variable
construct:if-statement
construct:instance
construct:int
construct:integral-number
construct:invocation
construct:multiply
construct:negation
construct:number
construct:parameter
construct:return
construct:string
construct:string-interpolation
construct:subtract
construct:try
construct:unpacking
construct:value-comparison
construct:variable
paradigm:imperative
technique:exceptions
technique:higher-order-functions
technique:looping
uses:ValueError
uses:builtins
uses:docstring
uses:enumerate
uses:ord
uses:positional-argument
uses:positional-parameter
uses:raise
uses:reversed
uses:str
uses:str.format
uses:unpacking
uses:value-comparison

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: parallel-letter-frequency

Code

import multiprocessing
from collections import Counter


def _calculate(text):
    return Counter([x for x in text.lower() if x.isalpha()])


def calculate(text_input):
    pool = multiprocessing.Pool()
    res = [pool.apply_async(_calculate, args=(x,)) for x in text_input]
    result = Counter()
    for x in res:
        result = result + x.get()

    return result

Tags:

construct:add
construct:call
construct:dict
construct:for-loop
construct:from-import
construct:if-statement
construct:import
construct:instance
construct:instantiation
construct:invocation
construct:iterable
construct:iteration
construct:list
construct:list-comprehension
construct:literal
construct:named-arguments
construct:parameter
construct:return
construct:string
construct:tuple
construct:variable
paradigm:imperative
paradigm:object-oriented
technique:async
technique:higher-order-functions
technique:multiprocessing
uses:collections.Counter
uses:dict.get
uses:dot-notation
uses:multiprocessing
uses:multiprocessing.Pool
construct:positional-arguments
construct:positional-parameter
uses:str.isalpha
uses:str.lower

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: rest-api

Code

from collections import Counter
import json


class RestAPI(object):
    def __init__(self, database=None):
        self._users = {}
        for user in database['users']:
            owed_by = Counter(user['owed_by'])
            owes = Counter(user['owes'])
            owed_by.subtract(owes)
            self._users[user['name']] = owed_by

    def getuser(self, name):
        user = self._users.get(name)
        if user is None:
            return False

        item = {}
        item['name'] = name
        item['owes'] = {}
        item['owed_by'] = {}
        for k, v in dict(user).items():
            if v > 0:
                item['owed_by'][k] = v
            else:
                item['owes'][k] = v * -1
        item['balance'] = sum(user.values())
        return item

    def get(self, url, payload=None):
        if url == '/users':
            if payload:
                users = json.loads(payload)['users']
                if not isinstance(users, list):
                    users = [users]
            else:
                users = list(self._users.keys())
            return json.dumps(
                {'users': [self.getuser(user) for user in users]}
            )

    def post(self, url, payload=None):
        loaded = json.loads(payload)
        if url == '/iou':
            lender = self._users.get(loaded['lender'])
            borrower = self._users.get(loaded['borrower'])
            if (lender is None) or (borrower is None):
                return False

            lender[loaded['borrower']] += loaded['amount']
            borrower[loaded['lender']] -= loaded['amount']
            users = [loaded['lender'], loaded['borrower']]
            result = \
                {'users': [self.getuser(u) for u in self._users if u in users]}
        elif url == '/add':
            self._users[loaded['user']] = Counter()
            result = self.getuser(loaded['user'])
        return json.dumps(result)

Tags:

construct:add
construct:addition-assignment
construct:assignment
construct:attribute
construct:boolean
construct:calls
construct:class
construct:comparison
construct:constructor
construct:definition
construct:default-argument
construct:dict
construct:elif
construct:else
construct:equality-test
construct:for-loop
construct:from-import
construct:getter
construct:identity-test
construct:if-statement
construct:import
construct:inheritance
construct:initialization
construct:instantiation
construct:integer
construct:invocation
construct:list
construct:list-comprehension
construct:literal
construct:logical-or
construct:method
construct:multiply
construct:named-parameter
construct:nested-dict
construct:negation
construct:number
construct:parameter
construct:positional-parameter
construct:private-attribute
construct:return
construct:string
construct:subtract
construct:subtraction-assignment
construct:value-test
construct:value-comparision
construct:variable
paradigm:imperative
paradigm:object-oriented
technique:boolean-logic
technique:higher-order-functions
technique:looping
uses:Counter.subtract
uses:bracket-notation
uses:builtins
uses:collections.Counter
uses:def-keyword
uses:dict.get
uses:dict.items
uses:dict.keys
uses:dict.values
uses:dot-notation
uses:isintance
uses:json.dumps
uses:json.loads
uses:named-parameter
uses:default-argument
uses:positional-arguments
uses:positional-parameters
uses:python-None
uses:self-keyword
uses:sum
uses:unpacking

from python.

iHiD avatar iHiD commented on June 4, 2024

Exercise: affine-cipher

Code

ltn = dict(zip('abcdefghijklmnopqrstuvwxyz',range(26)))
ntl= dict(zip(ltn.values(),ltn.keys()))

def encode(plain_text, a, b):
    for check in [2,13,26]:
        if a % check == 0:
            raise ValueError("not coprime")
    plain_text_clean = ''.join([p if p.isalnum() else '' for p in plain_text.lower()])
    raw = ''.join([ntl[(a*ltn[p]+b)%26] if p.isalpha() else p for p in plain_text_clean])
    return ' '.join([raw[i:i+5] for i in range(0,len(raw),5)])


def decode(ciphered_text, a, b):
    for check in [2,13,26]:
        if a % check == 0:
            raise ValueError("not coprime")
    ciph = ''.join(ciphered_text.split(' '))
    mmi = calc_mmi(a,26)
    dec = ''.join([ntl[(mmi*(ltn[c]-b)) % 26] if c.isalpha() else c for c in ciph])
    return dec

def calc_mmi(a,m=26):
    n = 1
    while (a * n) % m != 1:
        n += 1
        if n > 1000:
            raise ValueError("not coprime or small")
    return n

Tags:

construct:add
construct:addition-assignment
construct:assignment
construct:call
construct:comparison
construct:copy
construct:default-argument
construct:definition
construct:dict
construct:else
construct:equality-test
construct:for-loop
construct:function
construct:generator
construct:if-statement
construct:indexing
construct:int
construct:integral-number
construct:invocation
construct:iterable
construct:iteration
construct:list
construct:list-comprehension
construct:literal
construct:membership-test
construct:modulus
construct:multiply
construct:named-parameter
construct:negation
construct:number
construct:parameter
construct:raise
construct:return
construct:slice
construct:string
construct:subtract
construct:ternary
construct:tuple
construct:value-test
construct:variable
construct:while-loop
paradigm:imperative
technique:exceptions
technique:higher-order-functions
technique:laziness
technique:looping
uses:ValueError
uses:bracket-notation
uses:builtins
uses:def-keyword
uses:dict-constructor
uses:dict.keys
uses:dict.values
uses:len
uses:positional-parameters
uses:range
uses:slicing
uses:slice-notation
uses:str.isalpha
uses:str.join
uses:str.lower
uses:str.split
uses:ternary-expression
uses:zip

from python.

ErikSchierboom avatar ErikSchierboom commented on June 4, 2024

This is an automated comment

Hello πŸ‘‹ Next week we're going to start using the tagging work people are doing on these. If you've already completed the work, thank you! If you've not, but intend to this week, that's great! If you're not going to get round to doing it, and you've not yet posted a comment letting us know, could you please do so, so that we can find other people to do it. Thanks!

from python.

BethanyG avatar BethanyG commented on June 4, 2024

Ok. Think I'm done now. Probably missed some things, but will have to catch them later. πŸ˜…

from python.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.