Fix: Ensure all skills are tracked as files, not submodules
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
# Loki Mode Benchmark Results
|
||||
|
||||
## Overview
|
||||
|
||||
This directory contains benchmark results for Loki Mode multi-agent system.
|
||||
|
||||
## Benchmarks Available
|
||||
|
||||
### HumanEval
|
||||
- **Problems:** 164 Python programming problems
|
||||
- **Metric:** Pass@1 (percentage of problems solved on first attempt)
|
||||
- **Competitor Baseline:** MetaGPT achieves 85.9-87.7%
|
||||
|
||||
### SWE-bench Lite
|
||||
- **Problems:** 300 real-world GitHub issues
|
||||
- **Metric:** Resolution rate
|
||||
- **Competitor Baseline:** Top agents achieve 45-77%
|
||||
|
||||
## Running Benchmarks
|
||||
|
||||
```bash
|
||||
# Run all benchmarks
|
||||
./benchmarks/run-benchmarks.sh all
|
||||
|
||||
# Run specific benchmark
|
||||
./benchmarks/run-benchmarks.sh humaneval --execute
|
||||
./benchmarks/run-benchmarks.sh swebench --execute
|
||||
```
|
||||
|
||||
## Results Format
|
||||
|
||||
Results are saved as JSON files with:
|
||||
- Timestamp
|
||||
- Problem count
|
||||
- Pass rate
|
||||
- Individual problem results
|
||||
- Token usage
|
||||
- Execution time
|
||||
|
||||
## Methodology
|
||||
|
||||
Loki Mode uses its multi-agent architecture to solve each problem:
|
||||
1. **Architect Agent** analyzes the problem
|
||||
2. **Engineer Agent** implements the solution
|
||||
3. **QA Agent** validates with test cases
|
||||
4. **Review Agent** checks code quality
|
||||
|
||||
This mirrors real-world software development more accurately than single-agent approaches.
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"benchmark": "HumanEval",
|
||||
"version": "1.0",
|
||||
"timestamp": "2026-01-05T00:24:04.904083",
|
||||
"total_problems": 164,
|
||||
"status": "INFRASTRUCTURE_READY",
|
||||
"note": "Benchmark infrastructure created. Run with --execute to run actual tests.",
|
||||
"sample_problems": [
|
||||
"HumanEval/0",
|
||||
"HumanEval/1",
|
||||
"HumanEval/2",
|
||||
"HumanEval/3",
|
||||
"HumanEval/4"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"benchmark": "SWE-bench Lite",
|
||||
"version": "1.0",
|
||||
"timestamp": "2026-01-05T00:24:04.950779",
|
||||
"total_problems": 300,
|
||||
"status": "INFRASTRUCTURE_READY",
|
||||
"note": "Benchmark infrastructure created. Install swebench package for full evaluation.",
|
||||
"install": "pip install swebench",
|
||||
"evaluation": "python -m swebench.harness.run_evaluation --predictions predictions.json"
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
# Loki Mode Benchmark Results
|
||||
|
||||
**Generated:** 2026-01-05 01:10:21
|
||||
|
||||
## Overview
|
||||
|
||||
This directory contains benchmark results for Loki Mode multi-agent system.
|
||||
|
||||
## HumanEval Results
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Problems | 164 |
|
||||
| Passed | 161 |
|
||||
| Failed | 3 |
|
||||
| **Pass Rate** | **98.17%** |
|
||||
| Model | opus |
|
||||
| Time | 1263.46s |
|
||||
|
||||
### Competitor Comparison
|
||||
|
||||
| System | Pass@1 |
|
||||
|--------|--------|
|
||||
| MetaGPT | 85.9-87.7% |
|
||||
| **Loki Mode** | **98.17%** |
|
||||
|
||||
## Methodology
|
||||
|
||||
Loki Mode uses its multi-agent architecture to solve each problem:
|
||||
1. **Architect Agent** analyzes the problem
|
||||
2. **Engineer Agent** implements the solution
|
||||
3. **QA Agent** validates with test cases
|
||||
4. **Review Agent** checks code quality
|
||||
|
||||
This mirrors real-world software development more accurately than single-agent approaches.
|
||||
|
||||
## Running Benchmarks
|
||||
|
||||
```bash
|
||||
# Setup only (download datasets)
|
||||
./benchmarks/run-benchmarks.sh all
|
||||
|
||||
# Execute with Claude
|
||||
./benchmarks/run-benchmarks.sh humaneval --execute
|
||||
./benchmarks/run-benchmarks.sh humaneval --execute --limit 10 # First 10 only
|
||||
./benchmarks/run-benchmarks.sh swebench --execute --limit 5 # First 5 only
|
||||
|
||||
# Use different model
|
||||
./benchmarks/run-benchmarks.sh humaneval --execute --model opus
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def has_close_elements(numbers: List[float], threshold: float) -> bool:
|
||||
""" Check if in given list of numbers, are any two numbers closer to each other than
|
||||
given threshold.
|
||||
>>> has_close_elements([1.0, 2.0, 3.0], 0.5)
|
||||
False
|
||||
>>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)
|
||||
True
|
||||
"""
|
||||
for i in range(len(numbers)):
|
||||
for j in range(i + 1, len(numbers)):
|
||||
if abs(numbers[i] - numbers[j]) < threshold:
|
||||
return True
|
||||
return False
|
||||
@@ -0,0 +1,28 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def separate_paren_groups(paren_string: str) -> List[str]:
|
||||
""" Input to this function is a string containing multiple groups of nested parentheses. Your goal is to
|
||||
separate those group into separate strings and return the list of those.
|
||||
Separate groups are balanced (each open brace is properly closed) and not nested within each other
|
||||
Ignore any spaces in the input string.
|
||||
>>> separate_paren_groups('( ) (( )) (( )( ))')
|
||||
['()', '(())', '(()())']
|
||||
"""
|
||||
paren_string = paren_string.replace(' ', '')
|
||||
result = []
|
||||
current_group = ''
|
||||
depth = 0
|
||||
|
||||
for char in paren_string:
|
||||
if char == '(':
|
||||
depth += 1
|
||||
current_group += char
|
||||
elif char == ')':
|
||||
depth -= 1
|
||||
current_group += char
|
||||
if depth == 0:
|
||||
result.append(current_group)
|
||||
current_group = ''
|
||||
|
||||
return result
|
||||
@@ -0,0 +1,25 @@
|
||||
def is_palindrome(string: str) -> bool:
|
||||
""" Test if given string is a palindrome """
|
||||
return string == string[::-1]
|
||||
|
||||
|
||||
def make_palindrome(string: str) -> str:
|
||||
""" Find the shortest palindrome that begins with a supplied string.
|
||||
Algorithm idea is simple:
|
||||
- Find the longest postfix of supplied string that is a palindrome.
|
||||
- Append to the end of the string reverse of a string prefix that comes before the palindromic suffix.
|
||||
>>> make_palindrome('')
|
||||
''
|
||||
>>> make_palindrome('cat')
|
||||
'catac'
|
||||
>>> make_palindrome('cata')
|
||||
'catac'
|
||||
"""
|
||||
if not string:
|
||||
return ''
|
||||
|
||||
for i in range(len(string)):
|
||||
if is_palindrome(string[i:]):
|
||||
return string + string[:i][::-1]
|
||||
|
||||
return string
|
||||
@@ -0,0 +1,20 @@
|
||||
def make_a_pile(n):
|
||||
"""
|
||||
Given a positive integer n, you have to make a pile of n levels of stones.
|
||||
The first level has n stones.
|
||||
The number of stones in the next level is:
|
||||
- the next odd number if n is odd.
|
||||
- the next even number if n is even.
|
||||
Return the number of stones in each level in a list, where element at index
|
||||
i represents the number of stones in the level (i+1).
|
||||
|
||||
Examples:
|
||||
>>> make_a_pile(3)
|
||||
[3, 5, 7]
|
||||
"""
|
||||
result = []
|
||||
current = n
|
||||
for _ in range(n):
|
||||
result.append(current)
|
||||
current += 2
|
||||
return result
|
||||
@@ -0,0 +1,15 @@
|
||||
def words_string(s):
|
||||
"""
|
||||
You will be given a string of words separated by commas or spaces. Your task is
|
||||
to split the string into words and return an array of the words.
|
||||
|
||||
For example:
|
||||
words_string("Hi, my name is John") == ["Hi", "my", "name", "is", "John"]
|
||||
words_string("One, two, three, four, five, six") == ["One", "two", "three", "four", "five", "six"]
|
||||
"""
|
||||
if not s:
|
||||
return []
|
||||
|
||||
# Replace commas with spaces, then split on whitespace
|
||||
s = s.replace(',', ' ')
|
||||
return s.split()
|
||||
@@ -0,0 +1,16 @@
|
||||
def choose_num(x, y):
|
||||
"""This function takes two positive numbers x and y and returns the
|
||||
biggest even integer number that is in the range [x, y] inclusive. If
|
||||
there's no such number, then the function should return -1.
|
||||
|
||||
For example:
|
||||
choose_num(12, 15) = 14
|
||||
choose_num(13, 12) = -1
|
||||
"""
|
||||
if x > y:
|
||||
return -1
|
||||
if y % 2 == 0:
|
||||
return y
|
||||
if y - 1 >= x:
|
||||
return y - 1
|
||||
return -1
|
||||
@@ -0,0 +1,15 @@
|
||||
def rounded_avg(n, m):
|
||||
"""You are given two positive integers n and m, and your task is to compute the
|
||||
average of the integers from n through m (including n and m).
|
||||
Round the answer to the nearest integer and convert that to binary.
|
||||
If n is greater than m, return -1.
|
||||
Example:
|
||||
rounded_avg(1, 5) => "0b11"
|
||||
rounded_avg(7, 5) => -1
|
||||
rounded_avg(10, 20) => "0b1111"
|
||||
rounded_avg(20, 33) => "0b11010"
|
||||
"""
|
||||
if n > m:
|
||||
return -1
|
||||
avg = round((n + m) / 2)
|
||||
return bin(avg)
|
||||
@@ -0,0 +1,22 @@
|
||||
def unique_digits(x):
|
||||
"""Given a list of positive integers x. return a sorted list of all
|
||||
elements that hasn't any even digit.
|
||||
|
||||
Note: Returned list should be sorted in increasing order.
|
||||
|
||||
For example:
|
||||
>>> unique_digits([15, 33, 1422, 1])
|
||||
[1, 15, 33]
|
||||
>>> unique_digits([152, 323, 1422, 10])
|
||||
[]
|
||||
"""
|
||||
def has_even_digit(n):
|
||||
while n > 0:
|
||||
digit = n % 10
|
||||
if digit % 2 == 0:
|
||||
return True
|
||||
n //= 10
|
||||
return False
|
||||
|
||||
result = [num for num in x if not has_even_digit(num)]
|
||||
return sorted(result)
|
||||
@@ -0,0 +1,39 @@
|
||||
def by_length(arr):
|
||||
"""
|
||||
Given an array of integers, sort the integers that are between 1 and 9 inclusive,
|
||||
reverse the resulting array, and then replace each digit by its corresponding name from
|
||||
"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine".
|
||||
|
||||
For example:
|
||||
arr = [2, 1, 1, 4, 5, 8, 2, 3]
|
||||
-> sort arr -> [1, 1, 2, 2, 3, 4, 5, 8]
|
||||
-> reverse arr -> [8, 5, 4, 3, 2, 2, 1, 1]
|
||||
return ["Eight", "Five", "Four", "Three", "Two", "Two", "One", "One"]
|
||||
|
||||
If the array is empty, return an empty array:
|
||||
arr = []
|
||||
return []
|
||||
|
||||
If the array has any strange number ignore it:
|
||||
arr = [1, -1 , 55]
|
||||
-> sort arr -> [-1, 1, 55]
|
||||
-> reverse arr -> [55, 1, -1]
|
||||
return = ['One']
|
||||
"""
|
||||
names = {
|
||||
1: "One",
|
||||
2: "Two",
|
||||
3: "Three",
|
||||
4: "Four",
|
||||
5: "Five",
|
||||
6: "Six",
|
||||
7: "Seven",
|
||||
8: "Eight",
|
||||
9: "Nine"
|
||||
}
|
||||
|
||||
filtered = [x for x in arr if 1 <= x <= 9]
|
||||
filtered.sort()
|
||||
filtered.reverse()
|
||||
|
||||
return [names[x] for x in filtered]
|
||||
@@ -0,0 +1,21 @@
|
||||
def f(n):
|
||||
""" Implement the function f that takes n as a parameter,
|
||||
and returns a list of size n, such that the value of the element at index i is the factorial of i if i is even
|
||||
or the sum of numbers from 1 to i otherwise.
|
||||
i starts from 1.
|
||||
the factorial of i is the multiplication of the numbers from 1 to i (1 * 2 * ... * i).
|
||||
Example:
|
||||
f(5) == [1, 2, 6, 24, 15]
|
||||
"""
|
||||
result = []
|
||||
for i in range(1, n + 1):
|
||||
if i % 2 == 0:
|
||||
# factorial of i
|
||||
factorial = 1
|
||||
for j in range(1, i + 1):
|
||||
factorial *= j
|
||||
result.append(factorial)
|
||||
else:
|
||||
# sum of numbers from 1 to i
|
||||
result.append(sum(range(1, i + 1)))
|
||||
return result
|
||||
@@ -0,0 +1,35 @@
|
||||
def even_odd_palindrome(n):
|
||||
"""
|
||||
Given a positive integer n, return a tuple that has the number of even and odd
|
||||
integer palindromes that fall within the range(1, n), inclusive.
|
||||
|
||||
Example 1:
|
||||
|
||||
Input: 3
|
||||
Output: (1, 2)
|
||||
Explanation:
|
||||
Integer palindrome are 1, 2, 3. one of them is even, and two of them are odd.
|
||||
|
||||
Example 2:
|
||||
|
||||
Input: 12
|
||||
Output: (4, 6)
|
||||
Explanation:
|
||||
Integer palindrome are 1, 2, 3, 4, 5, 6, 7, 8, 9, 11. four of them are even, and 6 of them are odd.
|
||||
|
||||
Note:
|
||||
1. 1 <= n <= 10^3
|
||||
2. returned tuple has the number of even and odd integer palindromes respectively.
|
||||
"""
|
||||
even_count = 0
|
||||
odd_count = 0
|
||||
|
||||
for i in range(1, n + 1):
|
||||
s = str(i)
|
||||
if s == s[::-1]:
|
||||
if i % 2 == 0:
|
||||
even_count += 1
|
||||
else:
|
||||
odd_count += 1
|
||||
|
||||
return (even_count, odd_count)
|
||||
@@ -0,0 +1,22 @@
|
||||
def count_nums(arr):
|
||||
"""
|
||||
Write a function count_nums which takes an array of integers and returns
|
||||
the number of elements which has a sum of digits > 0.
|
||||
If a number is negative, then its first signed digit will be negative:
|
||||
e.g. -123 has signed digits -1, 2, and 3.
|
||||
>>> count_nums([]) == 0
|
||||
>>> count_nums([-1, 11, -11]) == 1
|
||||
>>> count_nums([1, 1, 2]) == 3
|
||||
"""
|
||||
count = 0
|
||||
for num in arr:
|
||||
if num == 0:
|
||||
continue
|
||||
elif num > 0:
|
||||
digit_sum = sum(int(d) for d in str(num))
|
||||
else:
|
||||
s = str(abs(num))
|
||||
digit_sum = -int(s[0]) + sum(int(d) for d in s[1:])
|
||||
if digit_sum > 0:
|
||||
count += 1
|
||||
return count
|
||||
@@ -0,0 +1,41 @@
|
||||
def move_one_ball(arr):
|
||||
"""We have an array 'arr' of N integers arr[1], arr[2], ..., arr[N].The
|
||||
numbers in the array will be randomly ordered. Your task is to determine if
|
||||
it is possible to get an array sorted in non-decreasing order by performing
|
||||
the following operation on the given array:
|
||||
You are allowed to perform right shift operation any number of times.
|
||||
|
||||
One right shift operation means shifting all elements of the array by one
|
||||
position in the right direction. The last element of the array will be moved to
|
||||
the starting position in the array i.e. 0th index.
|
||||
|
||||
If it is possible to obtain the sorted array by performing the above operation
|
||||
then return True else return False.
|
||||
If the given array is empty then return True.
|
||||
|
||||
Note: The given list is guaranteed to have unique elements.
|
||||
|
||||
For Example:
|
||||
|
||||
move_one_ball([3, 4, 5, 1, 2])==>True
|
||||
Explanation: By performin 2 right shift operations, non-decreasing order can
|
||||
be achieved for the given array.
|
||||
move_one_ball([3, 5, 4, 1, 2])==>False
|
||||
Explanation:It is not possible to get non-decreasing order for the given
|
||||
array by performing any number of right shift operations.
|
||||
|
||||
"""
|
||||
if len(arr) == 0:
|
||||
return True
|
||||
|
||||
# Count the number of "breaks" where arr[i] > arr[i+1]
|
||||
# For a rotated sorted array, there should be at most one such break
|
||||
breaks = 0
|
||||
n = len(arr)
|
||||
|
||||
for i in range(n):
|
||||
if arr[i] > arr[(i + 1) % n]:
|
||||
breaks += 1
|
||||
|
||||
# If there's at most one break, the array can be sorted by rotation
|
||||
return breaks <= 1
|
||||
@@ -0,0 +1,16 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def string_xor(a: str, b: str) -> str:
|
||||
""" Input are two strings a and b consisting only of 1s and 0s.
|
||||
Perform binary XOR on these inputs and return result also as a string.
|
||||
>>> string_xor('010', '110')
|
||||
'100'
|
||||
"""
|
||||
result = []
|
||||
for char_a, char_b in zip(a, b):
|
||||
if char_a == char_b:
|
||||
result.append('0')
|
||||
else:
|
||||
result.append('1')
|
||||
return ''.join(result)
|
||||
@@ -0,0 +1,20 @@
|
||||
def exchange(lst1, lst2):
|
||||
"""In this problem, you will implement a function that takes two lists of numbers,
|
||||
and determines whether it is possible to perform an exchange of elements
|
||||
between them to make lst1 a list of only even numbers.
|
||||
There is no limit on the number of exchanged elements between lst1 and lst2.
|
||||
If it is possible to exchange elements between the lst1 and lst2 to make
|
||||
all the elements of lst1 to be even, return "YES".
|
||||
Otherwise, return "NO".
|
||||
For example:
|
||||
exchange([1, 2, 3, 4], [1, 2, 3, 4]) => "YES"
|
||||
exchange([1, 2, 3, 4], [1, 5, 3, 4]) => "NO"
|
||||
It is assumed that the input lists will be non-empty.
|
||||
"""
|
||||
odd_count_lst1 = sum(1 for x in lst1 if x % 2 != 0)
|
||||
even_count_lst2 = sum(1 for x in lst2 if x % 2 == 0)
|
||||
|
||||
if even_count_lst2 >= odd_count_lst1:
|
||||
return "YES"
|
||||
else:
|
||||
return "NO"
|
||||
@@ -0,0 +1,28 @@
|
||||
def histogram(test):
|
||||
"""Given a string representing a space separated lowercase letters, return a dictionary
|
||||
of the letter with the most repetition and containing the corresponding count.
|
||||
If several letters have the same occurrence, return all of them.
|
||||
|
||||
Example:
|
||||
histogram('a b c') == {'a': 1, 'b': 1, 'c': 1}
|
||||
histogram('a b b a') == {'a': 2, 'b': 2}
|
||||
histogram('a b c a b') == {'a': 2, 'b': 2}
|
||||
histogram('b b b b a') == {'b': 4}
|
||||
histogram('') == {}
|
||||
|
||||
"""
|
||||
if not test or test.strip() == '':
|
||||
return {}
|
||||
|
||||
letters = test.split()
|
||||
counts = {}
|
||||
|
||||
for letter in letters:
|
||||
counts[letter] = counts.get(letter, 0) + 1
|
||||
|
||||
if not counts:
|
||||
return {}
|
||||
|
||||
max_count = max(counts.values())
|
||||
|
||||
return {letter: count for letter, count in counts.items() if count == max_count}
|
||||
@@ -0,0 +1,14 @@
|
||||
def reverse_delete(s,c):
|
||||
"""Task
|
||||
We are given two strings s and c, you have to deleted all the characters in s that are equal to any character in c
|
||||
then check if the result string is palindrome.
|
||||
A string is called palindrome if it reads the same backward as forward.
|
||||
You should return a tuple containing the result string and True/False for the check.
|
||||
Example
|
||||
For s = "abcde", c = "ae", the result should be ('bcd',False)
|
||||
For s = "abcdef", c = "b" the result should be ('acdef',False)
|
||||
For s = "abcdedcba", c = "ab", the result should be ('cdedc',True)
|
||||
"""
|
||||
result = ''.join(char for char in s if char not in c)
|
||||
is_palindrome = result == result[::-1]
|
||||
return (result, is_palindrome)
|
||||
@@ -0,0 +1,19 @@
|
||||
def odd_count(lst):
|
||||
"""Given a list of strings, where each string consists of only digits, return a list.
|
||||
Each element i of the output should be "the number of odd elements in the
|
||||
string i of the input." where all the i's should be replaced by the number
|
||||
of odd digits in the i'th string of the input.
|
||||
|
||||
>>> odd_count(['1234567'])
|
||||
["the number of odd elements 4n the str4ng 4 of the 4nput."]
|
||||
>>> odd_count(['3',"11111111"])
|
||||
["the number of odd elements 1n the str1ng 1 of the 1nput.",
|
||||
"the number of odd elements 8n the str8ng 8 of the 8nput."]
|
||||
"""
|
||||
result = []
|
||||
for s in lst:
|
||||
count = sum(1 for c in s if c in '13579')
|
||||
template = "the number of odd elements in the string i of the input."
|
||||
replaced = template.replace('i', str(count))
|
||||
result.append(replaced)
|
||||
return result
|
||||
@@ -0,0 +1,16 @@
|
||||
def minSubArraySum(nums):
|
||||
"""
|
||||
Given an array of integers nums, find the minimum sum of any non-empty sub-array
|
||||
of nums.
|
||||
Example
|
||||
minSubArraySum([2, 3, 4, 1, 2, 4]) == 1
|
||||
minSubArraySum([-1, -2, -3]) == -6
|
||||
"""
|
||||
min_sum = nums[0]
|
||||
current_sum = nums[0]
|
||||
|
||||
for i in range(1, len(nums)):
|
||||
current_sum = min(nums[i], current_sum + nums[i])
|
||||
min_sum = min(min_sum, current_sum)
|
||||
|
||||
return min_sum
|
||||
@@ -0,0 +1,41 @@
|
||||
def max_fill(grid, capacity):
|
||||
import math
|
||||
"""
|
||||
You are given a rectangular grid of wells. Each row represents a single well,
|
||||
and each 1 in a row represents a single unit of water.
|
||||
Each well has a corresponding bucket that can be used to extract water from it,
|
||||
and all buckets have the same capacity.
|
||||
Your task is to use the buckets to empty the wells.
|
||||
Output the number of times you need to lower the buckets.
|
||||
|
||||
Example 1:
|
||||
Input:
|
||||
grid : [[0,0,1,0], [0,1,0,0], [1,1,1,1]]
|
||||
bucket_capacity : 1
|
||||
Output: 6
|
||||
|
||||
Example 2:
|
||||
Input:
|
||||
grid : [[0,0,1,1], [0,0,0,0], [1,1,1,1], [0,1,1,1]]
|
||||
bucket_capacity : 2
|
||||
Output: 5
|
||||
|
||||
Example 3:
|
||||
Input:
|
||||
grid : [[0,0,0], [0,0,0]]
|
||||
bucket_capacity : 5
|
||||
Output: 0
|
||||
|
||||
Constraints:
|
||||
* all wells have the same length
|
||||
* 1 <= grid.length <= 10^2
|
||||
* 1 <= grid[:,1].length <= 10^2
|
||||
* grid[i][j] -> 0 | 1
|
||||
* 1 <= capacity <= 10
|
||||
"""
|
||||
total_lowerings = 0
|
||||
for row in grid:
|
||||
water_units = sum(row)
|
||||
if water_units > 0:
|
||||
total_lowerings += math.ceil(water_units / capacity)
|
||||
return total_lowerings
|
||||
@@ -0,0 +1,12 @@
|
||||
def sort_array(arr):
|
||||
"""
|
||||
In this Kata, you have to sort an array of non-negative integers according to
|
||||
number of ones in their binary representation in ascending order.
|
||||
For similar number of ones, sort based on decimal value.
|
||||
|
||||
It must be implemented like this:
|
||||
>>> sort_array([1, 5, 2, 3, 4]) == [1, 2, 3, 4, 5]
|
||||
>>> sort_array([-2, -3, -4, -5, -6]) == [-6, -5, -4, -3, -2]
|
||||
>>> sort_array([1, 0, 2, 3, 4]) [0, 1, 2, 3, 4]
|
||||
"""
|
||||
return sorted(arr, key=lambda x: (bin(x).count('1'), x))
|
||||
@@ -0,0 +1,25 @@
|
||||
def select_words(s, n):
|
||||
"""Given a string s and a natural number n, you have been tasked to implement
|
||||
a function that returns a list of all words from string s that contain exactly
|
||||
n consonants, in order these words appear in the string s.
|
||||
If the string s is empty then the function should return an empty list.
|
||||
Note: you may assume the input string contains only letters and spaces.
|
||||
Examples:
|
||||
select_words("Mary had a little lamb", 4) ==> ["little"]
|
||||
select_words("Mary had a little lamb", 3) ==> ["Mary", "lamb"]
|
||||
select_words("simple white space", 2) ==> []
|
||||
select_words("Hello world", 4) ==> ["world"]
|
||||
select_words("Uncle sam", 3) ==> ["Uncle"]
|
||||
"""
|
||||
if not s:
|
||||
return []
|
||||
|
||||
vowels = set('aeiouAEIOU')
|
||||
result = []
|
||||
|
||||
for word in s.split():
|
||||
consonant_count = sum(1 for char in word if char.isalpha() and char not in vowels)
|
||||
if consonant_count == n:
|
||||
result.append(word)
|
||||
|
||||
return result
|
||||
@@ -0,0 +1,26 @@
|
||||
def get_closest_vowel(word):
|
||||
"""You are given a word. Your task is to find the closest vowel that stands between
|
||||
two consonants from the right side of the word (case sensitive).
|
||||
|
||||
Vowels in the beginning and ending doesn't count. Return empty string if you didn't
|
||||
find any vowel met the above condition.
|
||||
|
||||
You may assume that the given string contains English letter only.
|
||||
|
||||
Example:
|
||||
get_closest_vowel("yogurt") ==> "u"
|
||||
get_closest_vowel("FULL") ==> "U"
|
||||
get_closest_vowel("quick") ==> ""
|
||||
get_closest_vowel("ab") ==> ""
|
||||
"""
|
||||
if len(word) < 3:
|
||||
return ""
|
||||
|
||||
vowels = "aeiouAEIOU"
|
||||
|
||||
for i in range(len(word) - 2, 0, -1):
|
||||
if word[i] in vowels:
|
||||
if word[i-1] not in vowels and word[i+1] not in vowels:
|
||||
return word[i]
|
||||
|
||||
return ""
|
||||
@@ -0,0 +1,30 @@
|
||||
def match_parens(lst):
|
||||
'''
|
||||
You are given a list of two strings, both strings consist of open
|
||||
parentheses '(' or close parentheses ')' only.
|
||||
Your job is to check if it is possible to concatenate the two strings in
|
||||
some order, that the resulting string will be good.
|
||||
A string S is considered to be good if and only if all parentheses in S
|
||||
are balanced. For example: the string '(())()' is good, while the string
|
||||
'())' is not.
|
||||
Return 'Yes' if there's a way to make a good string, and return 'No' otherwise.
|
||||
|
||||
Examples:
|
||||
match_parens(['()(', ')']) == 'Yes'
|
||||
match_parens([')', ')']) == 'No'
|
||||
'''
|
||||
def is_balanced(s):
|
||||
count = 0
|
||||
for c in s:
|
||||
if c == '(':
|
||||
count += 1
|
||||
else:
|
||||
count -= 1
|
||||
if count < 0:
|
||||
return False
|
||||
return count == 0
|
||||
|
||||
s1, s2 = lst[0], lst[1]
|
||||
if is_balanced(s1 + s2) or is_balanced(s2 + s1):
|
||||
return 'Yes'
|
||||
return 'No'
|
||||
@@ -0,0 +1,21 @@
|
||||
from typing import List, Optional
|
||||
|
||||
|
||||
def longest(strings: List[str]) -> Optional[str]:
|
||||
""" Out of list of strings, return the longest one. Return the first one in case of multiple
|
||||
strings of the same length. Return None in case the input list is empty.
|
||||
>>> longest([])
|
||||
|
||||
>>> longest(['a', 'b', 'c'])
|
||||
'a'
|
||||
>>> longest(['a', 'bb', 'ccc'])
|
||||
'ccc'
|
||||
"""
|
||||
if not strings:
|
||||
return None
|
||||
|
||||
longest_str = strings[0]
|
||||
for s in strings[1:]:
|
||||
if len(s) > len(longest_str):
|
||||
longest_str = s
|
||||
return longest_str
|
||||
@@ -0,0 +1,28 @@
|
||||
def maximum(arr, k):
|
||||
"""
|
||||
Given an array arr of integers and a positive integer k, return a sorted list
|
||||
of length k with the maximum k numbers in arr.
|
||||
|
||||
Example 1:
|
||||
|
||||
Input: arr = [-3, -4, 5], k = 3
|
||||
Output: [-4, -3, 5]
|
||||
|
||||
Example 2:
|
||||
|
||||
Input: arr = [4, -4, 4], k = 2
|
||||
Output: [4, 4]
|
||||
|
||||
Example 3:
|
||||
|
||||
Input: arr = [-3, 2, 1, 2, -1, -2, 1], k = 1
|
||||
Output: [2]
|
||||
|
||||
Note:
|
||||
1. The length of the array will be in the range of [1, 1000].
|
||||
2. The elements in the array will be in the range of [-1000, 1000].
|
||||
3. 0 <= k <= len(arr)
|
||||
"""
|
||||
sorted_arr = sorted(arr, reverse=True)
|
||||
top_k = sorted_arr[:k]
|
||||
return sorted(top_k)
|
||||
@@ -0,0 +1,10 @@
|
||||
def solution(lst):
|
||||
"""Given a non-empty list of integers, return the sum of all of the odd elements that are in even positions.
|
||||
|
||||
|
||||
Examples
|
||||
solution([5, 8, 7, 1]) ==> 12
|
||||
solution([3, 3, 3, 3, 3]) ==> 9
|
||||
solution([30, 13, 24, 321]) ==>0
|
||||
"""
|
||||
return sum(x for i, x in enumerate(lst) if i % 2 == 0 and x % 2 == 1)
|
||||
@@ -0,0 +1,19 @@
|
||||
def add_elements(arr, k):
|
||||
"""
|
||||
Given a non-empty array of integers arr and an integer k, return
|
||||
the sum of the elements with at most two digits from the first k elements of arr.
|
||||
|
||||
Example:
|
||||
|
||||
Input: arr = [111,21,3,4000,5,6,7,8,9], k = 4
|
||||
Output: 24 # sum of 21 + 3
|
||||
|
||||
Constraints:
|
||||
1. 1 <= len(arr) <= 100
|
||||
2. 1 <= k <= len(arr)
|
||||
"""
|
||||
total = 0
|
||||
for i in range(k):
|
||||
if -99 <= arr[i] <= 99:
|
||||
total += arr[i]
|
||||
return total
|
||||
@@ -0,0 +1,31 @@
|
||||
def get_odd_collatz(n):
|
||||
"""
|
||||
Given a positive integer n, return a sorted list that has the odd numbers in collatz sequence.
|
||||
|
||||
The Collatz conjecture is a conjecture in mathematics that concerns a sequence defined
|
||||
as follows: start with any positive integer n. Then each term is obtained from the
|
||||
previous term as follows: if the previous term is even, the next term is one half of
|
||||
the previous term. If the previous term is odd, the next term is 3 times the previous
|
||||
term plus 1. The conjecture is that no matter what value of n, the sequence will always reach 1.
|
||||
|
||||
Note:
|
||||
1. Collatz(1) is [1].
|
||||
2. returned list sorted in increasing order.
|
||||
|
||||
For example:
|
||||
get_odd_collatz(5) returns [1, 5] # The collatz sequence for 5 is [5, 16, 8, 4, 2, 1], so the odd numbers are only 1, and 5.
|
||||
"""
|
||||
odd_numbers = []
|
||||
current = n
|
||||
|
||||
while current != 1:
|
||||
if current % 2 == 1:
|
||||
odd_numbers.append(current)
|
||||
if current % 2 == 0:
|
||||
current = current // 2
|
||||
else:
|
||||
current = 3 * current + 1
|
||||
|
||||
odd_numbers.append(1)
|
||||
|
||||
return sorted(odd_numbers)
|
||||
@@ -0,0 +1,56 @@
|
||||
def valid_date(date):
|
||||
"""You have to write a function which validates a given date string and
|
||||
returns True if the date is valid otherwise False.
|
||||
The date is valid if all of the following rules are satisfied:
|
||||
1. The date string is not empty.
|
||||
2. The number of days is not less than 1 or higher than 31 days for months 1,3,5,7,8,10,12. And the number of days is not less than 1 or higher than 30 days for months 4,6,9,11. And, the number of days is not less than 1 or higher than 29 for the month 2.
|
||||
3. The months should not be less than 1 or higher than 12.
|
||||
4. The date should be in the format: mm-dd-yyyy
|
||||
|
||||
for example:
|
||||
valid_date('03-11-2000') => True
|
||||
|
||||
valid_date('15-01-2012') => False
|
||||
|
||||
valid_date('04-0-2040') => False
|
||||
|
||||
valid_date('06-04-2020') => True
|
||||
|
||||
valid_date('06/04/2020') => False
|
||||
"""
|
||||
if not date:
|
||||
return False
|
||||
|
||||
try:
|
||||
parts = date.split('-')
|
||||
if len(parts) != 3:
|
||||
return False
|
||||
|
||||
mm, dd, yyyy = parts
|
||||
|
||||
if len(mm) != 2 or len(dd) != 2 or len(yyyy) != 4:
|
||||
return False
|
||||
|
||||
month = int(mm)
|
||||
day = int(dd)
|
||||
year = int(yyyy)
|
||||
|
||||
if month < 1 or month > 12:
|
||||
return False
|
||||
|
||||
if day < 1:
|
||||
return False
|
||||
|
||||
if month in [1, 3, 5, 7, 8, 10, 12]:
|
||||
if day > 31:
|
||||
return False
|
||||
elif month in [4, 6, 9, 11]:
|
||||
if day > 30:
|
||||
return False
|
||||
elif month == 2:
|
||||
if day > 29:
|
||||
return False
|
||||
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
@@ -0,0 +1,20 @@
|
||||
def split_words(txt):
|
||||
'''
|
||||
Given a string of words, return a list of words split on whitespace, if no whitespaces exists in the text you
|
||||
should split on commas ',' if no commas exists you should return the number of lower-case letters with odd order in the
|
||||
alphabet, ord('a') = 0, ord('b') = 1, ... ord('z') = 25
|
||||
Examples
|
||||
split_words("Hello world!") ➞ ["Hello", "world!"]
|
||||
split_words("Hello,world!") ➞ ["Hello", "world!"]
|
||||
split_words("abcdef") == 3
|
||||
'''
|
||||
if ' ' in txt:
|
||||
return txt.split()
|
||||
elif ',' in txt:
|
||||
return txt.split(',')
|
||||
else:
|
||||
count = 0
|
||||
for char in txt:
|
||||
if char.islower() and (ord(char) - ord('a')) % 2 == 1:
|
||||
count += 1
|
||||
return count
|
||||
@@ -0,0 +1,29 @@
|
||||
def is_sorted(lst):
|
||||
'''
|
||||
Given a list of numbers, return whether or not they are sorted
|
||||
in ascending order. If list has more than 1 duplicate of the same
|
||||
number, return False. Assume no negative numbers and only integers.
|
||||
|
||||
Examples
|
||||
is_sorted([5]) ➞ True
|
||||
is_sorted([1, 2, 3, 4, 5]) ➞ True
|
||||
is_sorted([1, 3, 2, 4, 5]) ➞ False
|
||||
is_sorted([1, 2, 3, 4, 5, 6]) ➞ True
|
||||
is_sorted([1, 2, 3, 4, 5, 6, 7]) ➞ True
|
||||
is_sorted([1, 3, 2, 4, 5, 6, 7]) ➞ False
|
||||
is_sorted([1, 2, 2, 3, 3, 4]) ➞ True
|
||||
is_sorted([1, 2, 2, 2, 3, 4]) ➞ False
|
||||
'''
|
||||
# Check if sorted in ascending order
|
||||
for i in range(len(lst) - 1):
|
||||
if lst[i] > lst[i + 1]:
|
||||
return False
|
||||
|
||||
# Check for more than 1 duplicate of any number
|
||||
from collections import Counter
|
||||
counts = Counter(lst)
|
||||
for count in counts.values():
|
||||
if count > 2:
|
||||
return False
|
||||
|
||||
return True
|
||||
@@ -0,0 +1,47 @@
|
||||
def intersection(interval1, interval2):
|
||||
"""You are given two intervals,
|
||||
where each interval is a pair of integers. For example, interval = (start, end) = (1, 2).
|
||||
The given intervals are closed which means that the interval (start, end)
|
||||
includes both start and end.
|
||||
For each given interval, it is assumed that its start is less or equal its end.
|
||||
Your task is to determine whether the length of intersection of these two
|
||||
intervals is a prime number.
|
||||
Example, the intersection of the intervals (1, 3), (2, 4) is (2, 3)
|
||||
which its length is 1, which not a prime number.
|
||||
If the length of the intersection is a prime number, return "YES",
|
||||
otherwise, return "NO".
|
||||
If the two intervals don't intersect, return "NO".
|
||||
|
||||
|
||||
[input/output] samples:
|
||||
intersection((1, 2), (2, 3)) ==> "NO"
|
||||
intersection((-1, 1), (0, 4)) ==> "NO"
|
||||
intersection((-3, -1), (-5, 5)) ==> "YES"
|
||||
"""
|
||||
def is_prime(n):
|
||||
if n < 2:
|
||||
return False
|
||||
if n == 2:
|
||||
return True
|
||||
if n % 2 == 0:
|
||||
return False
|
||||
for i in range(3, int(n**0.5) + 1, 2):
|
||||
if n % i == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
start1, end1 = interval1
|
||||
start2, end2 = interval2
|
||||
|
||||
intersection_start = max(start1, start2)
|
||||
intersection_end = min(end1, end2)
|
||||
|
||||
if intersection_start > intersection_end:
|
||||
return "NO"
|
||||
|
||||
length = intersection_end - intersection_start
|
||||
|
||||
if is_prime(length):
|
||||
return "YES"
|
||||
else:
|
||||
return "NO"
|
||||
@@ -0,0 +1,25 @@
|
||||
def prod_signs(arr):
|
||||
"""
|
||||
You are given an array arr of integers and you need to return
|
||||
sum of magnitudes of integers multiplied by product of all signs
|
||||
of each number in the array, represented by 1, -1 or 0.
|
||||
Note: return None for empty arr.
|
||||
|
||||
Example:
|
||||
>>> prod_signs([1, 2, 2, -4]) == -9
|
||||
>>> prod_signs([0, 1]) == 0
|
||||
>>> prod_signs([]) == None
|
||||
"""
|
||||
if not arr:
|
||||
return None
|
||||
|
||||
sum_magnitudes = sum(abs(x) for x in arr)
|
||||
|
||||
sign_product = 1
|
||||
for x in arr:
|
||||
if x == 0:
|
||||
return 0
|
||||
elif x < 0:
|
||||
sign_product *= -1
|
||||
|
||||
return sum_magnitudes * sign_product
|
||||
@@ -0,0 +1,61 @@
|
||||
def minPath(grid, k):
|
||||
"""
|
||||
Given a grid with N rows and N columns (N >= 2) and a positive integer k,
|
||||
each cell of the grid contains a value. Every integer in the range [1, N * N]
|
||||
inclusive appears exactly once on the cells of the grid.
|
||||
|
||||
You have to find the minimum path of length k in the grid. You can start
|
||||
from any cell, and in each step you can move to any of the neighbor cells,
|
||||
in other words, you can go to cells which share an edge with you current
|
||||
cell.
|
||||
Please note that a path of length k means visiting exactly k cells (not
|
||||
necessarily distinct).
|
||||
You CANNOT go off the grid.
|
||||
A path A (of length k) is considered less than a path B (of length k) if
|
||||
after making the ordered lists of the values on the cells that A and B go
|
||||
through (let's call them lst_A and lst_B), lst_A is lexicographically less
|
||||
than lst_B, in other words, there exist an integer index i (1 <= i <= k)
|
||||
such that lst_A[i] < lst_B[i] and for any j (1 <= j < i) we have
|
||||
lst_A[j] = lst_B[j].
|
||||
It is guaranteed that the answer is unique.
|
||||
Return an ordered list of the values on the cells that the minimum path go through.
|
||||
|
||||
Examples:
|
||||
|
||||
Input: grid = [ [1,2,3], [4,5,6], [7,8,9]], k = 3
|
||||
Output: [1, 2, 1]
|
||||
|
||||
Input: grid = [ [5,9,3], [4,1,6], [7,8,2]], k = 1
|
||||
Output: [1]
|
||||
"""
|
||||
n = len(grid)
|
||||
|
||||
# Find position of value 1 (the minimum value)
|
||||
pos_1 = None
|
||||
for i in range(n):
|
||||
for j in range(n):
|
||||
if grid[i][j] == 1:
|
||||
pos_1 = (i, j)
|
||||
break
|
||||
if pos_1:
|
||||
break
|
||||
|
||||
# Find the minimum neighbor of cell containing 1
|
||||
i, j = pos_1
|
||||
min_neighbor = float('inf')
|
||||
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
|
||||
for di, dj in directions:
|
||||
ni, nj = i + di, j + dj
|
||||
if 0 <= ni < n and 0 <= nj < n:
|
||||
min_neighbor = min(min_neighbor, grid[ni][nj])
|
||||
|
||||
# The minimum path starting from 1 will alternate between 1 and its minimum neighbor
|
||||
# This is because we can always go back to 1 from any neighbor
|
||||
result = []
|
||||
for step in range(k):
|
||||
if step % 2 == 0:
|
||||
result.append(1)
|
||||
else:
|
||||
result.append(min_neighbor)
|
||||
|
||||
return result
|
||||
@@ -0,0 +1,10 @@
|
||||
def greatest_common_divisor(a: int, b: int) -> int:
|
||||
""" Return a greatest common divisor of two integers a and b
|
||||
>>> greatest_common_divisor(3, 5)
|
||||
1
|
||||
>>> greatest_common_divisor(25, 15)
|
||||
5
|
||||
"""
|
||||
while b:
|
||||
a, b = b, a % b
|
||||
return a
|
||||
@@ -0,0 +1,29 @@
|
||||
def tri(n):
|
||||
"""Everyone knows Fibonacci sequence, it was studied deeply by mathematicians in
|
||||
the last couple centuries. However, what people don't know is Tribonacci sequence.
|
||||
Tribonacci sequence is defined by the recurrence:
|
||||
tri(1) = 3
|
||||
tri(n) = 1 + n / 2, if n is even.
|
||||
tri(n) = tri(n - 1) + tri(n - 2) + tri(n + 1), if n is odd.
|
||||
For example:
|
||||
tri(2) = 1 + (2 / 2) = 2
|
||||
tri(4) = 3
|
||||
tri(3) = tri(2) + tri(1) + tri(4)
|
||||
= 2 + 3 + 3 = 8
|
||||
You are given a non-negative integer number n, you have to a return a list of the
|
||||
first n + 1 numbers of the Tribonacci sequence.
|
||||
Examples:
|
||||
tri(3) = [1, 3, 2, 8]
|
||||
"""
|
||||
if n == 0:
|
||||
return [1]
|
||||
|
||||
result = [1, 3]
|
||||
|
||||
for i in range(2, n + 1):
|
||||
if i % 2 == 0:
|
||||
result.append(1 + i // 2)
|
||||
else:
|
||||
result.append(result[i - 1] + result[i - 2] + (1 + (i + 1) // 2))
|
||||
|
||||
return result
|
||||
@@ -0,0 +1,18 @@
|
||||
def digits(n):
|
||||
"""Given a positive integer n, return the product of the odd digits.
|
||||
Return 0 if all digits are even.
|
||||
For example:
|
||||
digits(1) == 1
|
||||
digits(4) == 0
|
||||
digits(235) == 15
|
||||
"""
|
||||
product = 1
|
||||
has_odd = False
|
||||
|
||||
for digit in str(n):
|
||||
d = int(digit)
|
||||
if d % 2 == 1:
|
||||
product *= d
|
||||
has_odd = True
|
||||
|
||||
return product if has_odd else 0
|
||||
@@ -0,0 +1,36 @@
|
||||
def is_nested(string):
|
||||
'''
|
||||
Create a function that takes a string as input which contains only square brackets.
|
||||
The function should return True if and only if there is a valid subsequence of brackets
|
||||
where at least one bracket in the subsequence is nested.
|
||||
|
||||
is_nested('[[]]') ➞ True
|
||||
is_nested('[]]]]]]][[[[[]') ➞ False
|
||||
is_nested('[][]') ➞ False
|
||||
is_nested('[]') ➞ False
|
||||
is_nested('[[][]]') ➞ True
|
||||
is_nested('[[]][[') ➞ True
|
||||
'''
|
||||
opening_bracket_index = []
|
||||
closing_bracket_index = []
|
||||
|
||||
for i, c in enumerate(string):
|
||||
if c == '[':
|
||||
opening_bracket_index.append(i)
|
||||
else:
|
||||
closing_bracket_index.append(i)
|
||||
|
||||
closing_bracket_index.reverse()
|
||||
|
||||
cnt = 0
|
||||
i = 0
|
||||
j = 0
|
||||
|
||||
while i < len(opening_bracket_index) and j < len(closing_bracket_index):
|
||||
if opening_bracket_index[i] < closing_bracket_index[j]:
|
||||
cnt += 1
|
||||
i += 1
|
||||
else:
|
||||
j += 1
|
||||
|
||||
return cnt >= 2
|
||||
@@ -0,0 +1,16 @@
|
||||
import math
|
||||
|
||||
def sum_squares(lst):
|
||||
"""You are given a list of numbers.
|
||||
You need to return the sum of squared numbers in the given list,
|
||||
round each element in the list to the upper int(Ceiling) first.
|
||||
Examples:
|
||||
For lst = [1,2,3] the output should be 14
|
||||
For lst = [1,4,9] the output should be 98
|
||||
For lst = [1,3,5,7] the output should be 84
|
||||
For lst = [1.4,4.2,0] the output should be 29
|
||||
For lst = [-2.4,1,1] the output should be 6
|
||||
|
||||
|
||||
"""
|
||||
return sum(math.ceil(x) ** 2 for x in lst)
|
||||
@@ -0,0 +1,27 @@
|
||||
def check_if_last_char_is_a_letter(txt):
|
||||
'''
|
||||
Create a function that returns True if the last character
|
||||
of a given string is an alphabetical character and is not
|
||||
a part of a word, and False otherwise.
|
||||
Note: "word" is a group of characters separated by space.
|
||||
|
||||
Examples:
|
||||
check_if_last_char_is_a_letter("apple pie") ➞ False
|
||||
check_if_last_char_is_a_letter("apple pi e") ➞ True
|
||||
check_if_last_char_is_a_letter("apple pi e ") ➞ False
|
||||
check_if_last_char_is_a_letter("") ➞ False
|
||||
'''
|
||||
if len(txt) == 0:
|
||||
return False
|
||||
|
||||
last_char = txt[-1]
|
||||
|
||||
if not last_char.isalpha():
|
||||
return False
|
||||
|
||||
if len(txt) == 1:
|
||||
return True
|
||||
|
||||
second_last_char = txt[-2]
|
||||
|
||||
return second_last_char == ' '
|
||||
@@ -0,0 +1,15 @@
|
||||
def can_arrange(arr):
|
||||
"""Create a function which returns the largest index of an element which
|
||||
is not greater than or equal to the element immediately preceding it. If
|
||||
no such element exists then return -1. The given array will not contain
|
||||
duplicate values.
|
||||
|
||||
Examples:
|
||||
can_arrange([1,2,4,3,5]) = 3
|
||||
can_arrange([1,2,3]) = -1
|
||||
"""
|
||||
result = -1
|
||||
for i in range(1, len(arr)):
|
||||
if arr[i] < arr[i - 1]:
|
||||
result = i
|
||||
return result
|
||||
@@ -0,0 +1,19 @@
|
||||
def largest_smallest_integers(lst):
|
||||
'''
|
||||
Create a function that returns a tuple (a, b), where 'a' is
|
||||
the largest of negative integers, and 'b' is the smallest
|
||||
of positive integers in a list.
|
||||
If there is no negative or positive integers, return them as None.
|
||||
|
||||
Examples:
|
||||
largest_smallest_integers([2, 4, 1, 3, 5, 7]) == (None, 1)
|
||||
largest_smallest_integers([]) == (None, None)
|
||||
largest_smallest_integers([0]) == (None, None)
|
||||
'''
|
||||
negatives = [x for x in lst if x < 0]
|
||||
positives = [x for x in lst if x > 0]
|
||||
|
||||
a = max(negatives) if negatives else None
|
||||
b = min(positives) if positives else None
|
||||
|
||||
return (a, b)
|
||||
@@ -0,0 +1,26 @@
|
||||
def compare_one(a, b):
|
||||
"""
|
||||
Create a function that takes integers, floats, or strings representing
|
||||
real numbers, and returns the larger variable in its given variable type.
|
||||
Return None if the values are equal.
|
||||
Note: If a real number is represented as a string, the floating point might be . or ,
|
||||
|
||||
compare_one(1, 2.5) ➞ 2.5
|
||||
compare_one(1, "2,3") ➞ "2,3"
|
||||
compare_one("5,1", "6") ➞ "6"
|
||||
compare_one("1", 1) ➞ None
|
||||
"""
|
||||
def to_float(x):
|
||||
if isinstance(x, str):
|
||||
return float(x.replace(",", "."))
|
||||
return float(x)
|
||||
|
||||
val_a = to_float(a)
|
||||
val_b = to_float(b)
|
||||
|
||||
if val_a == val_b:
|
||||
return None
|
||||
elif val_a > val_b:
|
||||
return a
|
||||
else:
|
||||
return b
|
||||
@@ -0,0 +1,8 @@
|
||||
def is_equal_to_sum_even(n):
|
||||
"""Evaluate whether the given number n can be written as the sum of exactly 4 positive even numbers
|
||||
Example
|
||||
is_equal_to_sum_even(4) == False
|
||||
is_equal_to_sum_even(6) == False
|
||||
is_equal_to_sum_even(8) == True
|
||||
"""
|
||||
return n >= 8 and n % 2 == 0
|
||||
@@ -0,0 +1,18 @@
|
||||
def special_factorial(n):
|
||||
"""The Brazilian factorial is defined as:
|
||||
brazilian_factorial(n) = n! * (n-1)! * (n-2)! * ... * 1!
|
||||
where n > 0
|
||||
|
||||
For example:
|
||||
>>> special_factorial(4)
|
||||
288
|
||||
|
||||
The function will receive an integer as input and should return the special
|
||||
factorial of this integer.
|
||||
"""
|
||||
result = 1
|
||||
factorial = 1
|
||||
for i in range(1, n + 1):
|
||||
factorial *= i
|
||||
result *= factorial
|
||||
return result
|
||||
@@ -0,0 +1,9 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def all_prefixes(string: str) -> List[str]:
|
||||
""" Return list of all prefixes from shortest to longest of the input string
|
||||
>>> all_prefixes('abc')
|
||||
['a', 'ab', 'abc']
|
||||
"""
|
||||
return [string[:i+1] for i in range(len(string))]
|
||||
@@ -0,0 +1,30 @@
|
||||
def fix_spaces(text):
|
||||
"""
|
||||
Given a string text, replace all spaces in it with underscores,
|
||||
and if a string has more than 2 consecutive spaces,
|
||||
then replace all consecutive spaces with -
|
||||
|
||||
fix_spaces("Example") == "Example"
|
||||
fix_spaces("Example 1") == "Example_1"
|
||||
fix_spaces(" Example 2") == "_Example_2"
|
||||
fix_spaces(" Example 3") == "_Example-3"
|
||||
"""
|
||||
result = []
|
||||
i = 0
|
||||
while i < len(text):
|
||||
if text[i] == ' ':
|
||||
# Count consecutive spaces
|
||||
space_count = 0
|
||||
while i < len(text) and text[i] == ' ':
|
||||
space_count += 1
|
||||
i += 1
|
||||
# If more than 2 consecutive spaces, replace with -
|
||||
if space_count > 2:
|
||||
result.append('-')
|
||||
else:
|
||||
# Replace each space with underscore
|
||||
result.append('_' * space_count)
|
||||
else:
|
||||
result.append(text[i])
|
||||
i += 1
|
||||
return ''.join(result)
|
||||
@@ -0,0 +1,35 @@
|
||||
def file_name_check(file_name):
|
||||
"""Create a function which takes a string representing a file's name, and returns
|
||||
'Yes' if the the file's name is valid, and returns 'No' otherwise.
|
||||
A file's name is considered to be valid if and only if all the following conditions
|
||||
are met:
|
||||
- There should not be more than three digits ('0'-'9') in the file's name.
|
||||
- The file's name contains exactly one dot '.'
|
||||
- The substring before the dot should not be empty, and it starts with a letter from
|
||||
the latin alphapet ('a'-'z' and 'A'-'Z').
|
||||
- The substring after the dot should be one of these: ['txt', 'exe', 'dll']
|
||||
Examples:
|
||||
file_name_check("example.txt") # => 'Yes'
|
||||
file_name_check("1example.dll") # => 'No' (the name should start with a latin alphapet letter)
|
||||
"""
|
||||
# Check for exactly one dot
|
||||
if file_name.count('.') != 1:
|
||||
return 'No'
|
||||
|
||||
# Split the file name into name and extension
|
||||
name, extension = file_name.split('.')
|
||||
|
||||
# Check if the name is not empty and starts with a letter
|
||||
if len(name) == 0 or not name[0].isalpha():
|
||||
return 'No'
|
||||
|
||||
# Check if extension is valid
|
||||
if extension not in ['txt', 'exe', 'dll']:
|
||||
return 'No'
|
||||
|
||||
# Count digits in the entire file name
|
||||
digit_count = sum(1 for char in file_name if char.isdigit())
|
||||
if digit_count > 3:
|
||||
return 'No'
|
||||
|
||||
return 'Yes'
|
||||
@@ -0,0 +1,20 @@
|
||||
def sum_squares(lst):
|
||||
""""
|
||||
This function will take a list of integers. For all entries in the list, the function shall square the integer entry if its index is a
|
||||
multiple of 3 and will cube the integer entry if its index is a multiple of 4 and not a multiple of 3. The function will not
|
||||
change the entries in the list whose indexes are not a multiple of 3 or 4. The function shall then return the sum of all entries.
|
||||
|
||||
Examples:
|
||||
For lst = [1,2,3] the output should be 6
|
||||
For lst = [] the output should be 0
|
||||
For lst = [-1,-5,2,-1,-5] the output should be -126
|
||||
"""
|
||||
result = 0
|
||||
for i, val in enumerate(lst):
|
||||
if i % 3 == 0:
|
||||
result += val ** 2
|
||||
elif i % 4 == 0:
|
||||
result += val ** 3
|
||||
else:
|
||||
result += val
|
||||
return result
|
||||
@@ -0,0 +1,35 @@
|
||||
def words_in_sentence(sentence):
|
||||
"""
|
||||
You are given a string representing a sentence,
|
||||
the sentence contains some words separated by a space,
|
||||
and you have to return a string that contains the words from the original sentence,
|
||||
whose lengths are prime numbers,
|
||||
the order of the words in the new string should be the same as the original one.
|
||||
|
||||
Example 1:
|
||||
Input: sentence = "This is a test"
|
||||
Output: "is"
|
||||
|
||||
Example 2:
|
||||
Input: sentence = "lets go for swimming"
|
||||
Output: "go for"
|
||||
|
||||
Constraints:
|
||||
* 1 <= len(sentence) <= 100
|
||||
* sentence contains only letters
|
||||
"""
|
||||
def is_prime(n):
|
||||
if n < 2:
|
||||
return False
|
||||
if n == 2:
|
||||
return True
|
||||
if n % 2 == 0:
|
||||
return False
|
||||
for i in range(3, int(n ** 0.5) + 1, 2):
|
||||
if n % i == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
words = sentence.split()
|
||||
prime_words = [word for word in words if is_prime(len(word))]
|
||||
return " ".join(prime_words)
|
||||
@@ -0,0 +1,19 @@
|
||||
def simplify(x, n):
|
||||
"""Your task is to implement a function that will simplify the expression
|
||||
x * n. The function returns True if x * n evaluates to a whole number and False
|
||||
otherwise. Both x and n, are string representation of a fraction, and have the following format,
|
||||
<numerator>/<denominator> where both numerator and denominator are positive whole numbers.
|
||||
|
||||
You can assume that x, and n are valid fractions, and do not have zero as denominator.
|
||||
|
||||
simplify("1/5", "5/1") = True
|
||||
simplify("1/6", "2/1") = False
|
||||
simplify("7/10", "10/2") = False
|
||||
"""
|
||||
x_num, x_den = map(int, x.split('/'))
|
||||
n_num, n_den = map(int, n.split('/'))
|
||||
|
||||
numerator = x_num * n_num
|
||||
denominator = x_den * n_den
|
||||
|
||||
return numerator % denominator == 0
|
||||
@@ -0,0 +1,22 @@
|
||||
def order_by_points(nums):
|
||||
"""
|
||||
Write a function which sorts the given list of integers
|
||||
in ascending order according to the sum of their digits.
|
||||
Note: if there are several items with similar sum of their digits,
|
||||
order them based on their index in original list.
|
||||
|
||||
For example:
|
||||
>>> order_by_points([1, 11, -1, -11, -12]) == [-1, -11, 1, -12, 11]
|
||||
>>> order_by_points([]) == []
|
||||
"""
|
||||
def digit_sum(n):
|
||||
s = str(abs(n))
|
||||
total = 0
|
||||
for i, digit in enumerate(s):
|
||||
if i == 0 and n < 0:
|
||||
total -= int(digit)
|
||||
else:
|
||||
total += int(digit)
|
||||
return total
|
||||
|
||||
return sorted(nums, key=digit_sum)
|
||||
@@ -0,0 +1,21 @@
|
||||
def specialFilter(nums):
|
||||
"""Write a function that takes an array of numbers as input and returns
|
||||
the number of elements in the array that are greater than 10 and both
|
||||
first and last digits of a number are odd (1, 3, 5, 7, 9).
|
||||
For example:
|
||||
specialFilter([15, -73, 14, -15]) => 1
|
||||
specialFilter([33, -2, -3, 45, 21, 109]) => 2
|
||||
"""
|
||||
count = 0
|
||||
odd_digits = {'1', '3', '5', '7', '9'}
|
||||
|
||||
for num in nums:
|
||||
if num > 10:
|
||||
num_str = str(num)
|
||||
first_digit = num_str[0]
|
||||
last_digit = num_str[-1]
|
||||
|
||||
if first_digit in odd_digits and last_digit in odd_digits:
|
||||
count += 1
|
||||
|
||||
return count
|
||||
@@ -0,0 +1,22 @@
|
||||
def get_max_triples(n):
|
||||
"""
|
||||
You are given a positive integer n. You have to create an integer array a of length n.
|
||||
For each i (1 ≤ i ≤ n), the value of a[i] = i * i - i + 1.
|
||||
Return the number of triples (a[i], a[j], a[k]) of a where i < j < k,
|
||||
and a[i] + a[j] + a[k] is a multiple of 3.
|
||||
|
||||
Example :
|
||||
Input: n = 5
|
||||
Output: 1
|
||||
Explanation:
|
||||
a = [1, 3, 7, 13, 21]
|
||||
The only valid triple is (1, 7, 13).
|
||||
"""
|
||||
a = [i * i - i + 1 for i in range(1, n + 1)]
|
||||
count = 0
|
||||
for i in range(n):
|
||||
for j in range(i + 1, n):
|
||||
for k in range(j + 1, n):
|
||||
if (a[i] + a[j] + a[k]) % 3 == 0:
|
||||
count += 1
|
||||
return count
|
||||
@@ -0,0 +1,28 @@
|
||||
def bf(planet1, planet2):
|
||||
'''
|
||||
There are eight planets in our solar system: the closerst to the Sun
|
||||
is Mercury, the next one is Venus, then Earth, Mars, Jupiter, Saturn,
|
||||
Uranus, Neptune.
|
||||
Write a function that takes two planet names as strings planet1 and planet2.
|
||||
The function should return a tuple containing all planets whose orbits are
|
||||
located between the orbit of planet1 and the orbit of planet2, sorted by
|
||||
the proximity to the sun.
|
||||
The function should return an empty tuple if planet1 or planet2
|
||||
are not correct planet names.
|
||||
Examples
|
||||
bf("Jupiter", "Neptune") ==> ("Saturn", "Uranus")
|
||||
bf("Earth", "Mercury") ==> ("Venus")
|
||||
bf("Mercury", "Uranus") ==> ("Venus", "Earth", "Mars", "Jupiter", "Saturn")
|
||||
'''
|
||||
planets = ("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune")
|
||||
|
||||
if planet1 not in planets or planet2 not in planets:
|
||||
return ()
|
||||
|
||||
idx1 = planets.index(planet1)
|
||||
idx2 = planets.index(planet2)
|
||||
|
||||
if idx1 > idx2:
|
||||
idx1, idx2 = idx2, idx1
|
||||
|
||||
return planets[idx1 + 1:idx2]
|
||||
@@ -0,0 +1,17 @@
|
||||
def sorted_list_sum(lst):
|
||||
"""Write a function that accepts a list of strings as a parameter,
|
||||
deletes the strings that have odd lengths from it,
|
||||
and returns the resulted list with a sorted order,
|
||||
The list is always a list of strings and never an array of numbers,
|
||||
and it may contain duplicates.
|
||||
The order of the list should be ascending by length of each word, and you
|
||||
should return the list sorted by that rule.
|
||||
If two words have the same length, sort the list alphabetically.
|
||||
The function should return a list of strings in sorted order.
|
||||
You may assume that all words will have the same length.
|
||||
For example:
|
||||
assert list_sort(["aa", "a", "aaa"]) => ["aa"]
|
||||
assert list_sort(["ab", "a", "aaa", "cd"]) => ["ab", "cd"]
|
||||
"""
|
||||
filtered = [s for s in lst if len(s) % 2 == 0]
|
||||
return sorted(filtered, key=lambda x: (len(x), x))
|
||||
@@ -0,0 +1,8 @@
|
||||
def string_sequence(n: int) -> str:
|
||||
""" Return a string containing space-delimited numbers starting from 0 upto n inclusive.
|
||||
>>> string_sequence(0)
|
||||
'0'
|
||||
>>> string_sequence(5)
|
||||
'0 1 2 3 4 5'
|
||||
"""
|
||||
return ' '.join(str(i) for i in range(n + 1))
|
||||
@@ -0,0 +1,15 @@
|
||||
def x_or_y(n, x, y):
|
||||
"""A simple program which should return the value of x if n is
|
||||
a prime number and should return the value of y otherwise.
|
||||
|
||||
Examples:
|
||||
for x_or_y(7, 34, 12) == 34
|
||||
for x_or_y(15, 8, 5) == 5
|
||||
|
||||
"""
|
||||
if n < 2:
|
||||
return y
|
||||
for i in range(2, int(n ** 0.5) + 1):
|
||||
if n % i == 0:
|
||||
return y
|
||||
return x
|
||||
@@ -0,0 +1,20 @@
|
||||
def double_the_difference(lst):
|
||||
'''
|
||||
Given a list of numbers, return the sum of squares of the numbers
|
||||
in the list that are odd. Ignore numbers that are negative or not integers.
|
||||
|
||||
double_the_difference([1, 3, 2, 0]) == 1 + 9 + 0 + 0 = 10
|
||||
double_the_difference([-1, -2, 0]) == 0
|
||||
double_the_difference([9, -2]) == 81
|
||||
double_the_difference([0]) == 0
|
||||
|
||||
If the input list is empty, return 0.
|
||||
'''
|
||||
if not lst:
|
||||
return 0
|
||||
|
||||
result = 0
|
||||
for num in lst:
|
||||
if isinstance(num, int) and not isinstance(num, bool) and num > 0 and num % 2 == 1:
|
||||
result += num ** 2
|
||||
return result
|
||||
@@ -0,0 +1,16 @@
|
||||
def compare(game,guess):
|
||||
"""I think we all remember that feeling when the result of some long-awaited
|
||||
event is finally known. The feelings and thoughts you have at that moment are
|
||||
definitely worth noting down and comparing.
|
||||
Your task is to determine if a person correctly guessed the results of a number of matches.
|
||||
You are given two arrays of scores and guesses of equal length, where each index shows a match.
|
||||
Return an array of the same length denoting how far off each guess was. If they have guessed correctly,
|
||||
the value is 0, and if not, the value is the absolute difference between the guess and the score.
|
||||
|
||||
|
||||
example:
|
||||
|
||||
compare([1,2,3,4,5,1],[1,2,3,4,2,-2]) -> [0,0,0,0,3,3]
|
||||
compare([0,5,0,0,0,4],[4,1,1,0,0,-2]) -> [4,4,1,0,0,6]
|
||||
"""
|
||||
return [abs(g - s) for g, s in zip(guess, game)]
|
||||
@@ -0,0 +1,30 @@
|
||||
def Strongest_Extension(class_name, extensions):
|
||||
"""You will be given the name of a class (a string) and a list of extensions.
|
||||
The extensions are to be used to load additional classes to the class. The
|
||||
strength of the extension is as follows: Let CAP be the number of the uppercase
|
||||
letters in the extension's name, and let SM be the number of lowercase letters
|
||||
in the extension's name, the strength is given by the fraction CAP - SM.
|
||||
You should find the strongest extension and return a string in this
|
||||
format: ClassName.StrongestExtensionName.
|
||||
If there are two or more extensions with the same strength, you should
|
||||
choose the one that comes first in the list.
|
||||
For example, if you are given "Slices" as the class and a list of the
|
||||
extensions: ['SErviNGSliCes', 'Cheese', 'StuFfed'] then you should
|
||||
return 'Slices.SErviNGSliCes' since 'SErviNGSliCes' is the strongest extension
|
||||
(its strength is -1).
|
||||
Example:
|
||||
for Strongest_Extension('my_class', ['AA', 'Be', 'CC']) == 'my_class.AA'
|
||||
"""
|
||||
strongest_ext = None
|
||||
max_strength = None
|
||||
|
||||
for ext in extensions:
|
||||
cap = sum(1 for c in ext if c.isupper())
|
||||
sm = sum(1 for c in ext if c.islower())
|
||||
strength = cap - sm
|
||||
|
||||
if max_strength is None or strength > max_strength:
|
||||
max_strength = strength
|
||||
strongest_ext = ext
|
||||
|
||||
return f"{class_name}.{strongest_ext}"
|
||||
@@ -0,0 +1,15 @@
|
||||
def cycpattern_check(a , b):
|
||||
"""You are given 2 words. You need to return True if the second word or any of its rotations is a substring in the first word
|
||||
cycpattern_check("abcd","abd") => False
|
||||
cycpattern_check("hello","ell") => True
|
||||
cycpattern_check("whassup","psus") => False
|
||||
cycpattern_check("abab","baa") => True
|
||||
cycpattern_check("efef","eeff") => False
|
||||
cycpattern_check("himenss","simen") => True
|
||||
|
||||
"""
|
||||
for i in range(len(b)):
|
||||
rotation = b[i:] + b[:i]
|
||||
if rotation in a:
|
||||
return True
|
||||
return False
|
||||
@@ -0,0 +1,15 @@
|
||||
def even_odd_count(num):
|
||||
"""Given an integer. return a tuple that has the number of even and odd digits respectively.
|
||||
|
||||
Example:
|
||||
even_odd_count(-12) ==> (1, 1)
|
||||
even_odd_count(123) ==> (1, 2)
|
||||
"""
|
||||
even_count = 0
|
||||
odd_count = 0
|
||||
for digit in str(abs(num)):
|
||||
if int(digit) % 2 == 0:
|
||||
even_count += 1
|
||||
else:
|
||||
odd_count += 1
|
||||
return (even_count, odd_count)
|
||||
@@ -0,0 +1,32 @@
|
||||
def int_to_mini_roman(number):
|
||||
"""
|
||||
Given a positive integer, obtain its roman numeral equivalent as a string,
|
||||
and return it in lowercase.
|
||||
Restrictions: 1 <= num <= 1000
|
||||
|
||||
Examples:
|
||||
>>> int_to_mini_roman(19) == 'xix'
|
||||
>>> int_to_mini_roman(152) == 'clii'
|
||||
>>> int_to_mini_roman(426) == 'cdxxvi'
|
||||
"""
|
||||
val = [
|
||||
1000, 900, 500, 400,
|
||||
100, 90, 50, 40,
|
||||
10, 9, 5, 4,
|
||||
1
|
||||
]
|
||||
syms = [
|
||||
'm', 'cm', 'd', 'cd',
|
||||
'c', 'xc', 'l', 'xl',
|
||||
'x', 'ix', 'v', 'iv',
|
||||
'i'
|
||||
]
|
||||
|
||||
roman_num = ''
|
||||
i = 0
|
||||
while number > 0:
|
||||
for _ in range(number // val[i]):
|
||||
roman_num += syms[i]
|
||||
number -= val[i]
|
||||
i += 1
|
||||
return roman_num
|
||||
@@ -0,0 +1,12 @@
|
||||
def right_angle_triangle(a, b, c):
|
||||
'''
|
||||
Given the lengths of the three sides of a triangle. Return True if the three
|
||||
sides form a right-angled triangle, False otherwise.
|
||||
A right-angled triangle is a triangle in which one angle is right angle or
|
||||
90 degree.
|
||||
Example:
|
||||
right_angle_triangle(3, 4, 5) == True
|
||||
right_angle_triangle(1, 2, 3) == False
|
||||
'''
|
||||
sides = sorted([a, b, c])
|
||||
return sides[0]**2 + sides[1]**2 == sides[2]**2
|
||||
@@ -0,0 +1,11 @@
|
||||
def find_max(words):
|
||||
"""Write a function that accepts a list of strings.
|
||||
The list contains different words. Return the word with maximum number
|
||||
of unique characters. If multiple strings have maximum number of unique
|
||||
characters, return the one which comes first in lexicographical order.
|
||||
|
||||
find_max(["name", "of", "string"]) == "string"
|
||||
find_max(["name", "enam", "game"]) == "enam"
|
||||
find_max(["aaaaaaa", "bb" ,"cc"]) == ""aaaaaaa"
|
||||
"""
|
||||
return sorted(words, key=lambda x: (-len(set(x)), x))[0]
|
||||
@@ -0,0 +1,33 @@
|
||||
def eat(number, need, remaining):
|
||||
"""
|
||||
You're a hungry rabbit, and you already have eaten a certain number of carrots,
|
||||
but now you need to eat more carrots to complete the day's meals.
|
||||
you should return an array of [ total number of eaten carrots after your meals,
|
||||
the number of carrots left after your meals ]
|
||||
if there are not enough remaining carrots, you will eat all remaining carrots, but will still be hungry.
|
||||
|
||||
Example:
|
||||
* eat(5, 6, 10) -> [11, 4]
|
||||
* eat(4, 8, 9) -> [12, 1]
|
||||
* eat(1, 10, 10) -> [11, 0]
|
||||
* eat(2, 11, 5) -> [7, 0]
|
||||
|
||||
Variables:
|
||||
@number : integer
|
||||
the number of carrots that you have eaten.
|
||||
@need : integer
|
||||
the number of carrots that you need to eat.
|
||||
@remaining : integer
|
||||
the number of remaining carrots thet exist in stock
|
||||
|
||||
Constrain:
|
||||
* 0 <= number <= 1000
|
||||
* 0 <= need <= 1000
|
||||
* 0 <= remaining <= 1000
|
||||
|
||||
Have fun :)
|
||||
"""
|
||||
if need <= remaining:
|
||||
return [number + need, remaining - need]
|
||||
else:
|
||||
return [number + remaining, 0]
|
||||
@@ -0,0 +1,8 @@
|
||||
def count_distinct_characters(string: str) -> int:
|
||||
""" Given a string, find out how many distinct characters (regardless of case) does it consist of
|
||||
>>> count_distinct_characters('xyzXYZ')
|
||||
3
|
||||
>>> count_distinct_characters('Jerry')
|
||||
4
|
||||
"""
|
||||
return len(set(string.lower()))
|
||||
@@ -0,0 +1,29 @@
|
||||
def do_algebra(operator, operand):
|
||||
"""
|
||||
Given two lists operator, and operand. The first list has basic algebra operations, and
|
||||
the second list is a list of integers. Use the two given lists to build the algebric
|
||||
expression and return the evaluation of this expression.
|
||||
|
||||
The basic algebra operations:
|
||||
Addition ( + )
|
||||
Subtraction ( - )
|
||||
Multiplication ( * )
|
||||
Floor division ( // )
|
||||
Exponentiation ( ** )
|
||||
|
||||
Example:
|
||||
operator['+', '*', '-']
|
||||
array = [2, 3, 4, 5]
|
||||
result = 2 + 3 * 4 - 5
|
||||
=> result = 9
|
||||
|
||||
Note:
|
||||
The length of operator list is equal to the length of operand list minus one.
|
||||
Operand is a list of of non-negative integers.
|
||||
Operator list has at least one operator, and operand list has at least two operands.
|
||||
|
||||
"""
|
||||
expression = str(operand[0])
|
||||
for i, op in enumerate(operator):
|
||||
expression += ' ' + op + ' ' + str(operand[i + 1])
|
||||
return eval(expression)
|
||||
@@ -0,0 +1,24 @@
|
||||
def solve(s):
|
||||
"""You are given a string s.
|
||||
if s[i] is a letter, reverse its case from lower to upper or vise versa,
|
||||
otherwise keep it as it is.
|
||||
If the string contains no letters, reverse the string.
|
||||
The function should return the resulted string.
|
||||
Examples
|
||||
solve("1234") = "4321"
|
||||
solve("ab") = "AB"
|
||||
solve("#a@C") = "#A@c"
|
||||
"""
|
||||
has_letter = any(c.isalpha() for c in s)
|
||||
|
||||
if not has_letter:
|
||||
return s[::-1]
|
||||
|
||||
result = []
|
||||
for c in s:
|
||||
if c.isalpha():
|
||||
result.append(c.swapcase())
|
||||
else:
|
||||
result.append(c)
|
||||
|
||||
return ''.join(result)
|
||||
@@ -0,0 +1,11 @@
|
||||
def string_to_md5(text):
|
||||
"""
|
||||
Given a string 'text', return its md5 hash equivalent string.
|
||||
If 'text' is an empty string, return None.
|
||||
|
||||
>>> string_to_md5('Hello world') == '3e25960a79dbc69b674cd4ec67a72c62'
|
||||
"""
|
||||
if text == '':
|
||||
return None
|
||||
import hashlib
|
||||
return hashlib.md5(text.encode()).hexdigest()
|
||||
@@ -0,0 +1,14 @@
|
||||
def generate_integers(a, b):
|
||||
"""
|
||||
Given two positive integers a and b, return the even digits between a
|
||||
and b, in ascending order.
|
||||
|
||||
For example:
|
||||
generate_integers(2, 8) => [2, 4, 6, 8]
|
||||
generate_integers(8, 2) => [2, 4, 6, 8]
|
||||
generate_integers(10, 14) => []
|
||||
"""
|
||||
lower = min(a, b)
|
||||
upper = max(a, b)
|
||||
even_digits = [2, 4, 6, 8]
|
||||
return [d for d in even_digits if lower <= d <= upper]
|
||||
@@ -0,0 +1,27 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def parse_music(music_string: str) -> List[int]:
|
||||
""" Input to this function is a string representing musical notes in a special ASCII format.
|
||||
Your task is to parse this string and return list of integers corresponding to how many beats does each
|
||||
not last.
|
||||
|
||||
Here is a legend:
|
||||
'o' - whole note, lasts four beats
|
||||
'o|' - half note, lasts two beats
|
||||
'.|' - quater note, lasts one beat
|
||||
|
||||
>>> parse_music('o o| .| o| o| .| .| .| .| o o')
|
||||
[4, 2, 1, 2, 2, 1, 1, 1, 1, 4, 4]
|
||||
"""
|
||||
if not music_string:
|
||||
return []
|
||||
|
||||
note_map = {
|
||||
'o': 4,
|
||||
'o|': 2,
|
||||
'.|': 1
|
||||
}
|
||||
|
||||
notes = music_string.split()
|
||||
return [note_map[note] for note in notes]
|
||||
@@ -0,0 +1,23 @@
|
||||
def how_many_times(string: str, substring: str) -> int:
|
||||
""" Find how many times a given substring can be found in the original string. Count overlaping cases.
|
||||
>>> how_many_times('', 'a')
|
||||
0
|
||||
>>> how_many_times('aaa', 'a')
|
||||
3
|
||||
>>> how_many_times('aaaa', 'aa')
|
||||
3
|
||||
"""
|
||||
if not substring or not string:
|
||||
return 0
|
||||
|
||||
count = 0
|
||||
start = 0
|
||||
|
||||
while True:
|
||||
pos = string.find(substring, start)
|
||||
if pos == -1:
|
||||
break
|
||||
count += 1
|
||||
start = pos + 1
|
||||
|
||||
return count
|
||||
@@ -0,0 +1,21 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def sort_numbers(numbers: str) -> str:
|
||||
""" Input is a space-delimited string of numberals from 'zero' to 'nine'.
|
||||
Valid choices are 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight' and 'nine'.
|
||||
Return the string with numbers sorted from smallest to largest
|
||||
>>> sort_numbers('three one five')
|
||||
'one three five'
|
||||
"""
|
||||
word_to_num = {
|
||||
'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4,
|
||||
'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9
|
||||
}
|
||||
|
||||
if not numbers.strip():
|
||||
return ''
|
||||
|
||||
words = numbers.split()
|
||||
sorted_words = sorted(words, key=lambda x: word_to_num[x])
|
||||
return ' '.join(sorted_words)
|
||||
@@ -0,0 +1,10 @@
|
||||
def truncate_number(number: float) -> float:
|
||||
""" Given a positive floating point number, it can be decomposed into
|
||||
and integer part (largest integer smaller than given number) and decimals
|
||||
(leftover part always smaller than 1).
|
||||
|
||||
Return the decimal part of the number.
|
||||
>>> truncate_number(3.5)
|
||||
0.5
|
||||
"""
|
||||
return number - int(number)
|
||||
@@ -0,0 +1,22 @@
|
||||
from typing import List, Tuple
|
||||
|
||||
|
||||
def find_closest_elements(numbers: List[float]) -> Tuple[float, float]:
|
||||
""" From a supplied list of numbers (of length at least two) select and return two that are the closest to each
|
||||
other and return them in order (smaller number, larger number).
|
||||
>>> find_closest_elements([1.0, 2.0, 3.0, 4.0, 5.0, 2.2])
|
||||
(2.0, 2.2)
|
||||
>>> find_closest_elements([1.0, 2.0, 3.0, 4.0, 5.0, 2.0])
|
||||
(2.0, 2.0)
|
||||
"""
|
||||
sorted_numbers = sorted(numbers)
|
||||
min_diff = float('inf')
|
||||
closest_pair = (sorted_numbers[0], sorted_numbers[1])
|
||||
|
||||
for i in range(len(sorted_numbers) - 1):
|
||||
diff = sorted_numbers[i + 1] - sorted_numbers[i]
|
||||
if diff < min_diff:
|
||||
min_diff = diff
|
||||
closest_pair = (sorted_numbers[i], sorted_numbers[i + 1])
|
||||
|
||||
return closest_pair
|
||||
@@ -0,0 +1,13 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def rescale_to_unit(numbers: List[float]) -> List[float]:
|
||||
""" Given list of numbers (of at least two elements), apply a linear transform to that list,
|
||||
such that the smallest number will become 0 and the largest will become 1
|
||||
>>> rescale_to_unit([1.0, 2.0, 3.0, 4.0, 5.0])
|
||||
[0.0, 0.25, 0.5, 0.75, 1.0]
|
||||
"""
|
||||
min_val = min(numbers)
|
||||
max_val = max(numbers)
|
||||
range_val = max_val - min_val
|
||||
return [(x - min_val) / range_val for x in numbers]
|
||||
@@ -0,0 +1,11 @@
|
||||
from typing import List, Any
|
||||
|
||||
|
||||
def filter_integers(values: List[Any]) -> List[int]:
|
||||
""" Filter given list of any python values only for integers
|
||||
>>> filter_integers(['a', 3.14, 5])
|
||||
[5]
|
||||
>>> filter_integers([1, 2, 3, 'abc', {}, []])
|
||||
[1, 2, 3]
|
||||
"""
|
||||
return [x for x in values if isinstance(x, int) and not isinstance(x, bool)]
|
||||
@@ -0,0 +1,8 @@
|
||||
def strlen(string: str) -> int:
|
||||
""" Return length of given string
|
||||
>>> strlen('')
|
||||
0
|
||||
>>> strlen('abc')
|
||||
3
|
||||
"""
|
||||
return len(string)
|
||||
@@ -0,0 +1,9 @@
|
||||
def largest_divisor(n: int) -> int:
|
||||
""" For a given number n, find the largest number that divides n evenly, smaller than n
|
||||
>>> largest_divisor(15)
|
||||
5
|
||||
"""
|
||||
for i in range(n - 1, 0, -1):
|
||||
if n % i == 0:
|
||||
return i
|
||||
return 1
|
||||
@@ -0,0 +1,24 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def factorize(n: int) -> List[int]:
|
||||
""" Return list of prime factors of given integer in the order from smallest to largest.
|
||||
Each of the factors should be listed number of times corresponding to how many times it appeares in factorization.
|
||||
Input number should be equal to the product of all factors
|
||||
>>> factorize(8)
|
||||
[2, 2, 2]
|
||||
>>> factorize(25)
|
||||
[5, 5]
|
||||
>>> factorize(70)
|
||||
[2, 5, 7]
|
||||
"""
|
||||
factors = []
|
||||
divisor = 2
|
||||
while divisor * divisor <= n:
|
||||
while n % divisor == 0:
|
||||
factors.append(divisor)
|
||||
n //= divisor
|
||||
divisor += 1
|
||||
if n > 1:
|
||||
factors.append(n)
|
||||
return factors
|
||||
@@ -0,0 +1,12 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def remove_duplicates(numbers: List[int]) -> List[int]:
|
||||
""" From a list of integers, remove all elements that occur more than once.
|
||||
Keep order of elements left the same as in the input.
|
||||
>>> remove_duplicates([1, 2, 3, 2, 4])
|
||||
[1, 3, 4]
|
||||
"""
|
||||
from collections import Counter
|
||||
counts = Counter(numbers)
|
||||
return [num for num in numbers if counts[num] == 1]
|
||||
@@ -0,0 +1,6 @@
|
||||
def flip_case(string: str) -> str:
|
||||
""" For a given string, flip lowercase characters to uppercase and uppercase to lowercase.
|
||||
>>> flip_case('Hello')
|
||||
'hELLO'
|
||||
"""
|
||||
return string.swapcase()
|
||||
@@ -0,0 +1,11 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def concatenate(strings: List[str]) -> str:
|
||||
""" Concatenate list of strings into a single string
|
||||
>>> concatenate([])
|
||||
''
|
||||
>>> concatenate(['a', 'b', 'c'])
|
||||
'abc'
|
||||
"""
|
||||
return ''.join(strings)
|
||||
@@ -0,0 +1,11 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def filter_by_prefix(strings: List[str], prefix: str) -> List[str]:
|
||||
""" Filter an input list of strings only for ones that start with a given prefix.
|
||||
>>> filter_by_prefix([], 'a')
|
||||
[]
|
||||
>>> filter_by_prefix(['abc', 'bcd', 'cde', 'array'], 'a')
|
||||
['abc', 'array']
|
||||
"""
|
||||
return [s for s in strings if s.startswith(prefix)]
|
||||
@@ -0,0 +1,18 @@
|
||||
from typing import List
|
||||
|
||||
|
||||
def below_zero(operations: List[int]) -> bool:
|
||||
""" You're given a list of deposit and withdrawal operations on a bank account that starts with
|
||||
zero balance. Your task is to detect if at any point the balance of account fallls below zero, and
|
||||
at that point function should return True. Otherwise it should return False.
|
||||
>>> below_zero([1, 2, 3])
|
||||
False
|
||||
>>> below_zero([1, 2, -4, 5])
|
||||
True
|
||||
"""
|
||||
balance = 0
|
||||
for operation in operations:
|
||||
balance += operation
|
||||
if balance < 0:
|
||||
return True
|
||||
return False
|
||||
@@ -0,0 +1,8 @@
|
||||
def get_positive(l: list):
|
||||
"""Return only positive numbers in the list.
|
||||
>>> get_positive([-1, 2, -4, 5, 6])
|
||||
[2, 5, 6]
|
||||
>>> get_positive([5, 3, -5, 2, -3, 3, 9, 0, 123, 1, -10])
|
||||
[5, 3, 2, 3, 9, 123, 1]
|
||||
"""
|
||||
return [x for x in l if x > 0]
|
||||
@@ -0,0 +1,27 @@
|
||||
def is_prime(n):
|
||||
"""Return true if a given number is prime, and false otherwise.
|
||||
>>> is_prime(6)
|
||||
False
|
||||
>>> is_prime(101)
|
||||
True
|
||||
>>> is_prime(11)
|
||||
True
|
||||
>>> is_prime(13441)
|
||||
True
|
||||
>>> is_prime(61)
|
||||
True
|
||||
>>> is_prime(4)
|
||||
False
|
||||
>>> is_prime(1)
|
||||
False
|
||||
"""
|
||||
if n < 2:
|
||||
return False
|
||||
if n == 2:
|
||||
return True
|
||||
if n % 2 == 0:
|
||||
return False
|
||||
for i in range(3, int(n ** 0.5) + 1, 2):
|
||||
if n % i == 0:
|
||||
return False
|
||||
return True
|
||||
@@ -0,0 +1,50 @@
|
||||
import math
|
||||
|
||||
|
||||
def poly(xs: list, x: float):
|
||||
"""
|
||||
Evaluates polynomial with coefficients xs at point x.
|
||||
return xs[0] + xs[1] * x + xs[1] * x^2 + .... xs[n] * x^n
|
||||
"""
|
||||
return sum([coeff * math.pow(x, i) for i, coeff in enumerate(xs)])
|
||||
|
||||
|
||||
def find_zero(xs: list):
|
||||
""" xs are coefficients of a polynomial.
|
||||
find_zero find x such that poly(x) = 0.
|
||||
find_zero returns only only zero point, even if there are many.
|
||||
Moreover, find_zero only takes list xs having even number of coefficients
|
||||
and largest non zero coefficient as it guarantees
|
||||
a solution.
|
||||
>>> round(find_zero([1, 2]), 2) # f(x) = 1 + 2x
|
||||
-0.5
|
||||
>>> round(find_zero([-6, 11, -6, 1]), 2) # (x - 1) * (x - 2) * (x - 3) = -6 + 11x - 6x^2 + x^3
|
||||
1.0
|
||||
"""
|
||||
# Use Newton-Raphson method to find a zero
|
||||
# First, find a suitable starting point and bounds
|
||||
|
||||
# For a polynomial with odd degree (even number of coefficients),
|
||||
# there's guaranteed to be at least one real root
|
||||
|
||||
# Use bisection method to find bounds, then Newton-Raphson
|
||||
|
||||
# Find bounds where the polynomial changes sign
|
||||
lo, hi = -1.0, 1.0
|
||||
|
||||
# Expand bounds until we find a sign change
|
||||
while poly(xs, lo) * poly(xs, hi) > 0:
|
||||
lo *= 2
|
||||
hi *= 2
|
||||
|
||||
# Bisection method for reliability
|
||||
while hi - lo > 1e-10:
|
||||
mid = (lo + hi) / 2.0
|
||||
if poly(xs, mid) == 0:
|
||||
return mid
|
||||
if poly(xs, lo) * poly(xs, mid) < 0:
|
||||
hi = mid
|
||||
else:
|
||||
lo = mid
|
||||
|
||||
return (lo + hi) / 2.0
|
||||
@@ -0,0 +1,20 @@
|
||||
def sort_third(l: list):
|
||||
"""This function takes a list l and returns a list l' such that
|
||||
l' is identical to l in the indicies that are not divisible by three, while its values at the indicies that are divisible by three are equal
|
||||
to the values of the corresponding indicies of l, but sorted.
|
||||
>>> sort_third([1, 2, 3])
|
||||
[1, 2, 3]
|
||||
>>> sort_third([5, 6, 3, 4, 8, 9, 2])
|
||||
[2, 6, 3, 4, 8, 9, 5]
|
||||
"""
|
||||
# Extract values at indices divisible by 3
|
||||
third_values = [l[i] for i in range(0, len(l), 3)]
|
||||
# Sort them
|
||||
third_values.sort()
|
||||
|
||||
# Build result list
|
||||
result = l.copy()
|
||||
for i, val in enumerate(third_values):
|
||||
result[i * 3] = val
|
||||
|
||||
return result
|
||||
@@ -0,0 +1,6 @@
|
||||
def unique(l: list):
|
||||
"""Return sorted unique elements in a list
|
||||
>>> unique([5, 3, 5, 2, 3, 3, 9, 0, 123])
|
||||
[0, 2, 3, 5, 9, 123]
|
||||
"""
|
||||
return sorted(set(l))
|
||||
@@ -0,0 +1,8 @@
|
||||
def max_element(l: list):
|
||||
"""Return maximum element in the list.
|
||||
>>> max_element([1, 2, 3])
|
||||
3
|
||||
>>> max_element([5, 3, -5, 2, -3, 3, 9, 0, 123, 1, -10])
|
||||
123
|
||||
"""
|
||||
return max(l)
|
||||
@@ -0,0 +1,14 @@
|
||||
def fizz_buzz(n: int):
|
||||
"""Return the number of times the digit 7 appears in integers less than n which are divisible by 11 or 13.
|
||||
>>> fizz_buzz(50)
|
||||
0
|
||||
>>> fizz_buzz(78)
|
||||
2
|
||||
>>> fizz_buzz(79)
|
||||
3
|
||||
"""
|
||||
count = 0
|
||||
for i in range(n):
|
||||
if i % 11 == 0 or i % 13 == 0:
|
||||
count += str(i).count('7')
|
||||
return count
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user