mirror of
https://gitlab.com/mfocko/CodeWars.git
synced 2024-09-08 01:26:57 +02:00
chore: initial commit
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
commit
fc899b0b02
217 changed files with 5356 additions and 0 deletions
127
3kyu/battleship_field_validator/solution.cs
Normal file
127
3kyu/battleship_field_validator/solution.cs
Normal file
|
@ -0,0 +1,127 @@
|
|||
namespace Solution {
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class BattleshipField {
|
||||
private enum Direction {
|
||||
HORIZONTAL,
|
||||
VERTICAL
|
||||
}
|
||||
|
||||
private class Ship {
|
||||
private int y, x;
|
||||
private Direction d;
|
||||
private int size;
|
||||
|
||||
public int Size {get => size;}
|
||||
|
||||
public Ship(int y, int x, Direction d, int size) {
|
||||
this.y = y;
|
||||
this.x = x;
|
||||
this.d = d;
|
||||
this.size = size;
|
||||
}
|
||||
public bool IsTouching(Ship b) {
|
||||
if (d == Direction.HORIZONTAL) {
|
||||
if ((b.y >= this.y - 1 && b.y <= this.y + 1) &&
|
||||
(b.x >= this.x - 1 && b.x <= this.x + this.size))
|
||||
return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
if (d == Direction.VERTICAL) {
|
||||
if ((b.x >= this.x - 1 && b.x <= this.x + 1) &&
|
||||
(b.y >= this.y - 1 && b.y <= this.y + this.size))
|
||||
return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
public override string ToString() {
|
||||
string direction = this.d == Direction.HORIZONTAL ? "horizontal" : "vertical";
|
||||
return $"x: {this.x}\ty: {this.y}\tdir: {direction}\tsize: {this.size}";
|
||||
}
|
||||
}
|
||||
|
||||
private List<Ship> ships;
|
||||
private int battleships = 1,
|
||||
cruisers = 2,
|
||||
destroyers = 3,
|
||||
submarines = 4;
|
||||
|
||||
public BattleshipField() {
|
||||
this.ships = new List<Ship>();
|
||||
}
|
||||
|
||||
private void registerShip(int y, int x, Direction d, int count) {
|
||||
this.ships.Add(new Ship(y, x, d, count));
|
||||
switch (count) {
|
||||
case 1:
|
||||
this.submarines--;
|
||||
break;
|
||||
case 2:
|
||||
this.destroyers--;
|
||||
break;
|
||||
case 3:
|
||||
this.cruisers--;
|
||||
break;
|
||||
case 4:
|
||||
this.battleships--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private bool areTouching() {
|
||||
for (var i = 0; i < this.ships.Count - 1; i++)
|
||||
for (var j = i + 1; j < this.ships.Count; j++)
|
||||
if (this.ships[i].IsTouching(this.ships[j])) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool IsValidField() {
|
||||
if (this.submarines != 0 || this.destroyers != 0 ||
|
||||
this.cruisers != 0 || this.battleships != 0)
|
||||
return false;
|
||||
else if (this.areTouching())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool ValidateBattlefield(int[,] field) {
|
||||
// Write your magic here
|
||||
var validator = new BattleshipField();
|
||||
int count = 0;
|
||||
|
||||
for (int y = 0, rows = field.GetLength(0); y < rows; y++) {
|
||||
for (int x = 0, cols = field.GetLength(0); x < cols; x++) {
|
||||
if (field[y, x] == 1) {
|
||||
// check for vertical ship
|
||||
if (count == 0) {
|
||||
if (y < rows - 1 && field[y + 1, x] == 1) {
|
||||
for (int dy = 0; y + dy < rows; dy++) {
|
||||
if (field[y + dy, x] == 1) {
|
||||
field[y + dy, x] = 0;
|
||||
count++;
|
||||
} else break;
|
||||
}
|
||||
|
||||
if (count > 1) {
|
||||
validator.registerShip(y, x, Direction.VERTICAL, count);
|
||||
count = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
field[y, x] = 0;
|
||||
count++;
|
||||
} else if (field[y, x] == 0 && count > 0) {
|
||||
validator.registerShip(y, x - count, Direction.HORIZONTAL, count);
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return validator.IsValidField();
|
||||
}
|
||||
}
|
||||
}
|
103
3kyu/binomial_expansion/solution.cs
Normal file
103
3kyu/binomial_expansion/solution.cs
Normal file
|
@ -0,0 +1,103 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class KataSolution {
|
||||
public static IEnumerable<long> Combinations(long n) {
|
||||
if (n < 0) {
|
||||
Console.WriteLine("Error happened");
|
||||
throw new ArgumentException("n cannot be negative");
|
||||
}
|
||||
|
||||
for (
|
||||
long k = 0, nCk = 1;
|
||||
k <= n;
|
||||
nCk = nCk * (n - k) / (k + 1), k++
|
||||
) {
|
||||
yield return nCk;
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<long> Range(long count) {
|
||||
for (var i = 0; i < count; i++) {
|
||||
yield return i;
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<long> Expand(int a, int b, int n) {
|
||||
long aExpd = (long) Math.Pow(a, n);
|
||||
long bExpd = 1;
|
||||
foreach (var nCk in Combinations(n)) {
|
||||
yield return nCk * aExpd * bExpd;
|
||||
|
||||
aExpd /= a;
|
||||
bExpd *= b;
|
||||
}
|
||||
}
|
||||
|
||||
public static (int, int, string) ParseInner(string expr) {
|
||||
var innerPart = expr.Split('^')[0];
|
||||
innerPart = innerPart.Substring(1, innerPart.Length - 2);
|
||||
|
||||
var coeffA = new String(
|
||||
innerPart.TakeWhile(c => !char.IsLetter(c)).ToArray()
|
||||
);
|
||||
var variable = new String(
|
||||
innerPart.SkipWhile(c => !char.IsLetter(c)).TakeWhile(char.IsLetter).ToArray()
|
||||
);
|
||||
var coeffB = new String(
|
||||
innerPart.SkipWhile(c => !char.IsLetter(c)).SkipWhile(char.IsLetter).ToArray()
|
||||
);
|
||||
|
||||
var parsedCoeffA = coeffA switch {
|
||||
"" => 1,
|
||||
"-" => -1,
|
||||
_ => int.Parse(coeffA)
|
||||
};
|
||||
|
||||
return (parsedCoeffA, int.Parse(coeffB), variable);
|
||||
}
|
||||
|
||||
public static int ParseExponent(string expr) {
|
||||
var splitExpr = expr.Split('^');
|
||||
return int.Parse(splitExpr[1]);
|
||||
}
|
||||
|
||||
public static string FormatTerm(long coefficient, string variable, long exponent) {
|
||||
var prefix = (coefficient > 0) ? "+" : "";
|
||||
|
||||
if (coefficient == 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if ((coefficient == 1 || coefficient == -1) && exponent == 0) {
|
||||
return $"{prefix}{coefficient}";
|
||||
}
|
||||
|
||||
var coeff = coefficient switch {
|
||||
0 => "",
|
||||
1 => prefix,
|
||||
-1 => "-",
|
||||
_ => $"{prefix}{coefficient}"
|
||||
};
|
||||
var varExp = exponent switch {
|
||||
0 => "",
|
||||
1 => variable,
|
||||
_ => $"{variable}^{exponent}"
|
||||
};
|
||||
return $"{coeff}{varExp}";
|
||||
}
|
||||
|
||||
public static string Expand(string expr) {
|
||||
var n = ParseExponent(expr);
|
||||
var (a, b, variable) = ParseInner(expr);
|
||||
|
||||
var result = "";
|
||||
|
||||
foreach (var (exponent, coefficient) in Range(n + 1).Reverse().Zip(Expand(a, b, n))) {
|
||||
result += FormatTerm(coefficient, variable, exponent);
|
||||
}
|
||||
|
||||
return result.TrimStart(new char[] {'+'});
|
||||
}
|
||||
}
|
88
3kyu/screen_locking_patterns/solution.cs
Normal file
88
3kyu/screen_locking_patterns/solution.cs
Normal file
|
@ -0,0 +1,88 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public static class Kata {
|
||||
private class Graph {
|
||||
private struct Edge {
|
||||
public char Through { get; set; }
|
||||
public char To { get; set; }
|
||||
};
|
||||
|
||||
public static readonly char NO_CONDITION = '\0';
|
||||
|
||||
private Dictionary<char, List<Edge>> edges = new Dictionary<char, List<Edge>>();
|
||||
private HashSet<char> visited = new HashSet<char>();
|
||||
|
||||
private Graph addEdge(char src, char through, char dst) {
|
||||
var newEdge = new Edge {
|
||||
Through = through,
|
||||
To = dst
|
||||
};
|
||||
|
||||
if (edges.TryGetValue(src, out var lst)) {
|
||||
lst.Add(newEdge);
|
||||
} else {
|
||||
edges.Add(src, new List<Edge>() { newEdge });
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Graph AddDirectEdge(char src, char dst)
|
||||
=> addEdge(src, NO_CONDITION, dst);
|
||||
public Graph AddIndirectEdge(char src, char through, char dst)
|
||||
=> addEdge(src, through, dst);
|
||||
public Graph AddBiDirectEdge(char src, char dst)
|
||||
=> AddBiIndirectEdge(src, NO_CONDITION, dst);
|
||||
public Graph AddBiIndirectEdge(char src, char through, char dst) =>
|
||||
addEdge(src, through, dst)
|
||||
.addEdge(dst, through, src);
|
||||
|
||||
public void ResetVisited() => visited.Clear();
|
||||
public bool BeenVisited(char vertex) => visited.Contains(vertex);
|
||||
public void Mark(char vertex) => visited.Add(vertex);
|
||||
public void Unmark(char vertex) => visited.Remove(vertex);
|
||||
|
||||
public bool HasEdge(char fromVertex, char toVertex)
|
||||
=> edges[fromVertex].Any(e => e.To == toVertex && (e.Through == NO_CONDITION || BeenVisited(e.Through)));
|
||||
|
||||
public Graph AddMultipleBiDirectEdges(char fromVertex, string toVertices) {
|
||||
foreach (var toVertex in toVertices) {
|
||||
AddBiDirectEdge(fromVertex, toVertex);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
private static Graph g = new Graph()
|
||||
.AddMultipleBiDirectEdges('A', "BDEFH").AddMultipleBiDirectEdges('B', "CDEFGI")
|
||||
.AddMultipleBiDirectEdges('C', "DEFH").AddMultipleBiDirectEdges('D', "EGHI")
|
||||
.AddMultipleBiDirectEdges('E', "FGHI").AddMultipleBiDirectEdges('F', "GHI")
|
||||
.AddMultipleBiDirectEdges('G', "H").AddMultipleBiDirectEdges('H', "I")
|
||||
.AddBiIndirectEdge('A', 'B', 'C').AddBiIndirectEdge('A', 'D', 'G').AddBiIndirectEdge('A', 'E', 'I')
|
||||
.AddBiIndirectEdge('B', 'E', 'H').AddBiIndirectEdge('C', 'E', 'G').AddBiIndirectEdge('C', 'F', 'I')
|
||||
.AddBiIndirectEdge('D', 'E', 'F').AddBiIndirectEdge('G', 'H', 'I');
|
||||
|
||||
public static int CountPatternsFrom(char firstDot, int length) {
|
||||
if (length <= 0 || length >= 10) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (length == 1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int total = 0;
|
||||
|
||||
g.Mark(firstDot);
|
||||
foreach (var vertex in "ABCDEFGHI") {
|
||||
if (!g.BeenVisited(vertex) && g.HasEdge(firstDot, vertex)) {
|
||||
total += CountPatternsFrom(vertex, length - 1);
|
||||
}
|
||||
}
|
||||
g.Unmark(firstDot);
|
||||
|
||||
return total;
|
||||
}
|
||||
}
|
181
4kyu/4_by_4_skyscrapers/solution.cs
Normal file
181
4kyu/4_by_4_skyscrapers/solution.cs
Normal file
|
@ -0,0 +1,181 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class Skyscrapers {
|
||||
private static IEnumerable<List<T>> Permutations<T>(List<T> initial)
|
||||
where T: IComparable<T> {
|
||||
yield return initial;
|
||||
|
||||
var hasNext = initial.Count > 1;
|
||||
while (hasNext) {
|
||||
var k = 0;
|
||||
var l = 0;
|
||||
hasNext = false;
|
||||
|
||||
for (var i = initial.Count - 1; i > 0; i--) {
|
||||
if (initial[i].CompareTo(initial[i - 1]) > 0) {
|
||||
k = i - 1;
|
||||
hasNext = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = initial.Count - 1; i > k; i--) {
|
||||
if (initial[i].CompareTo(initial[k]) > 0) {
|
||||
l = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
(initial[k], initial[l]) = (initial[l], initial[k]);
|
||||
initial.Reverse(k + 1, initial.Count - k - 1);
|
||||
|
||||
if (hasNext) {
|
||||
yield return initial;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsValid(List<int> heights, int clue) {
|
||||
var canSee = 1;
|
||||
var lastHeight = heights[0];
|
||||
|
||||
for (var i = 1; i < heights.Count; i++) {
|
||||
var currentHeight = heights[i];
|
||||
if (currentHeight > lastHeight) {
|
||||
lastHeight = currentHeight;
|
||||
canSee++;
|
||||
}
|
||||
}
|
||||
|
||||
return canSee == clue;
|
||||
}
|
||||
|
||||
private static IEnumerable<List<int>> PossibleHeights(int size, int clue) {
|
||||
var initial = new List<int>();
|
||||
for (var i = 0; i < size; i++) {
|
||||
initial.Add(i + 1);
|
||||
}
|
||||
|
||||
if (clue == 0) {
|
||||
return Permutations(initial);
|
||||
}
|
||||
|
||||
return Permutations(initial).Where(heights => IsValid(heights, clue));
|
||||
}
|
||||
|
||||
private static int Size {
|
||||
get => 4;
|
||||
}
|
||||
|
||||
private static (int, int) GetDiffs(int clueIndex) {
|
||||
if (clueIndex < Size) {
|
||||
return (0, 1);
|
||||
} else if (clueIndex < 2 * Size) {
|
||||
return (-1, 0);
|
||||
} else if (clueIndex < 3 * Size) {
|
||||
return (0, -1);
|
||||
}
|
||||
return (1, 0);
|
||||
}
|
||||
|
||||
private static (int, int) GetStarts(int clueIndex) {
|
||||
if (clueIndex < Size) {
|
||||
return (clueIndex, 0);
|
||||
} else if (clueIndex < 2 * Size) {
|
||||
return (Size - 1, clueIndex % Size);
|
||||
} else if (clueIndex < 3 * Size) {
|
||||
return (Size - 1 - clueIndex % Size, Size - 1);
|
||||
}
|
||||
return (0, Size - 1 - clueIndex % Size);
|
||||
}
|
||||
|
||||
private static List<int> BackupHeights(int[][] heights, int clueIndex) {
|
||||
var backup = new List<int>();
|
||||
|
||||
var (dx, dy) = GetDiffs(clueIndex);
|
||||
for (
|
||||
var (x, y) = GetStarts(clueIndex);
|
||||
x >= 0 && x < Size && y >= 0 && y < Size;
|
||||
x += dx, y += dy
|
||||
) {
|
||||
backup.Add(heights[y][x]);
|
||||
}
|
||||
|
||||
return backup;
|
||||
}
|
||||
|
||||
private static bool EmplaceHeights(
|
||||
int[][] heights, int clueIndex, List<int> newHeights, bool force
|
||||
) {
|
||||
int i = 0;
|
||||
|
||||
var (dx, dy) = GetDiffs(clueIndex);
|
||||
for (
|
||||
var (x, y) = GetStarts(clueIndex);
|
||||
x >= 0 && x < Size && y >= 0 && y < Size;
|
||||
x += dx, y += dy
|
||||
) {
|
||||
if (
|
||||
!force && heights[y][x] != 0 && heights[y][x] != newHeights[i]
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
heights[y][x] = newHeights[i++];
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool SolvePuzzle(
|
||||
int[][] heights, int[] clues, int clueIndex, bool ignoreZeroes
|
||||
) {
|
||||
while (clueIndex < 4 * Size && (
|
||||
(ignoreZeroes && clues[clueIndex] == 0) || (!ignoreZeroes && clues[clueIndex] != 0)
|
||||
)) {
|
||||
clueIndex++;
|
||||
}
|
||||
|
||||
if (clueIndex >= 4 * Size) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// create copy of heights to ensure correct resetting
|
||||
var currentHeights = BackupHeights(heights, clueIndex);
|
||||
|
||||
// iterate through the options
|
||||
foreach (var possibleHeights in PossibleHeights(Size, clues[clueIndex])) {
|
||||
// emplace heights and if conflict occurs, reset and try next one
|
||||
if (!EmplaceHeights(heights, clueIndex, possibleHeights, false)) {
|
||||
EmplaceHeights(heights, clueIndex, currentHeights, true);
|
||||
continue;
|
||||
}
|
||||
|
||||
// if no conflict present, try filling out other clues
|
||||
if (SolvePuzzle(heights, clues, clueIndex + 1, ignoreZeroes)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// otherwise reset heights and try again
|
||||
EmplaceHeights(heights, clueIndex, currentHeights, true);
|
||||
}
|
||||
|
||||
// if we got here, there is no feasible configuration of buildings
|
||||
return false;
|
||||
}
|
||||
|
||||
public static int[][] SolvePuzzle(int[] clues) {
|
||||
var result = new int[Size][];
|
||||
for (var i = 0; i < Size; i++) {
|
||||
result[i] = new int[Size];
|
||||
}
|
||||
SolvePuzzle(result, clues, 0, true);
|
||||
|
||||
// in case there are left zeroes
|
||||
SolvePuzzle(result, clues, 0, false);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
264
4kyu/4_by_4_skyscrapers/solution.java
Normal file
264
4kyu/4_by_4_skyscrapers/solution.java
Normal file
|
@ -0,0 +1,264 @@
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
public class SkyScrapers {
|
||||
private static class Permutations<T extends Comparable<T>> implements Iterable<List<T>> {
|
||||
public class PermutationsIterator implements Iterator<List<T>> {
|
||||
private List<T> elements;
|
||||
private boolean _hasNext;
|
||||
private boolean firstIteration = true;
|
||||
|
||||
public PermutationsIterator(List<T> elements) {
|
||||
this.elements = elements;
|
||||
_hasNext = elements.size() > 0;
|
||||
}
|
||||
|
||||
private void swap(int k, int l) {
|
||||
T tmp = elements.get(k);
|
||||
elements.set(k, elements.get(l));
|
||||
elements.set(l, tmp);
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
return _hasNext;
|
||||
}
|
||||
|
||||
public List<T> next() {
|
||||
if (!_hasNext) {
|
||||
throw new NoSuchElementException("No more permutations are left");
|
||||
}
|
||||
|
||||
var lastIteration = new ArrayList<T>(elements);
|
||||
|
||||
int k = 0, l = 0;
|
||||
_hasNext = false;
|
||||
for (int i = elements.size() - 1; i > 0; i--) {
|
||||
if (elements.get(i).compareTo(elements.get(i - 1)) > 0) {
|
||||
k = i - 1;
|
||||
_hasNext = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = elements.size() - 1; i > k; i--) {
|
||||
if (elements.get(i).compareTo(elements.get(k)) > 0) {
|
||||
l = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
swap(k, l);
|
||||
Collections.reverse(elements.subList(k + 1, elements.size()));
|
||||
|
||||
return lastIteration;
|
||||
}
|
||||
}
|
||||
|
||||
private List<T> elements;
|
||||
|
||||
public Permutations(List<T> elements) {
|
||||
this.elements = elements;
|
||||
Collections.sort(this.elements);
|
||||
}
|
||||
|
||||
public Iterator<List<T>> iterator() {
|
||||
return new PermutationsIterator(elements);
|
||||
}
|
||||
|
||||
public Stream<List<T>> stream() {
|
||||
return StreamSupport.stream(this.spliterator(), false);
|
||||
}
|
||||
}
|
||||
|
||||
private static class PossibleConfigurations implements Iterable<List<Integer>> {
|
||||
private List<Integer> initial;
|
||||
private int clue;
|
||||
|
||||
private void generateInitial(int size) {
|
||||
initial = new ArrayList<Integer>();
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
initial.add(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
public PossibleConfigurations(int size, int clue) {
|
||||
generateInitial(size);
|
||||
this.clue = clue;
|
||||
}
|
||||
|
||||
public Iterator<List<Integer>> iterator() {
|
||||
if (clue == 0) {
|
||||
return (new Permutations(initial)).iterator();
|
||||
}
|
||||
|
||||
return (new Permutations(initial))
|
||||
.stream()
|
||||
.filter(heights -> isValid((List<Integer>) heights, clue))
|
||||
.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isValid(List<Integer> heights, int clue) {
|
||||
int canSee = 1;
|
||||
int lastHeight = heights.get(0);
|
||||
|
||||
for (int i = 1; i < heights.size(); i++) {
|
||||
int currentHeight = heights.get(i);
|
||||
if (currentHeight > lastHeight) {
|
||||
lastHeight = currentHeight;
|
||||
canSee++;
|
||||
}
|
||||
}
|
||||
|
||||
return canSee == clue;
|
||||
}
|
||||
|
||||
private static int getDx(int clueIndex) {
|
||||
if (clueIndex >= 4 && clueIndex <= 7) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (clueIndex >= 12) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static int getDy(int clueIndex) {
|
||||
if (clueIndex <= 3) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (clueIndex >= 8 && clueIndex <= 11) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static int getStartX(int clueIndex) {
|
||||
if (clueIndex < 4) {
|
||||
return clueIndex;
|
||||
}
|
||||
|
||||
if (clueIndex <= 7) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (clueIndex <= 11) {
|
||||
return 3 - clueIndex % 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static int getStartY(int clueIndex) {
|
||||
if (clueIndex < 4) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (clueIndex <= 7) {
|
||||
return clueIndex % 4;
|
||||
}
|
||||
|
||||
if (clueIndex <= 11) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
return 3 - clueIndex % 4;
|
||||
}
|
||||
|
||||
private static List<Integer> backupHeights(int[][] heights, int clueIndex) {
|
||||
List<Integer> backup = new ArrayList<Integer>();
|
||||
|
||||
int dx = getDx(clueIndex);
|
||||
int dy = getDy(clueIndex);
|
||||
|
||||
for (
|
||||
int x = getStartX(clueIndex), y = getStartY(clueIndex);
|
||||
x >= 0 && x < 4 && y >= 0 && y < 4;
|
||||
x += dx, y += dy
|
||||
) {
|
||||
backup.add(heights[y][x]);
|
||||
}
|
||||
|
||||
return backup;
|
||||
}
|
||||
|
||||
private static boolean emplaceHeights(
|
||||
int[][] heights, int clueIndex, List<Integer> newHeights, boolean force
|
||||
) {
|
||||
int i = 0;
|
||||
int dx = getDx(clueIndex);
|
||||
int dy = getDy(clueIndex);
|
||||
|
||||
for (
|
||||
int x = getStartX(clueIndex), y = getStartY(clueIndex);
|
||||
x >= 0 && x < 4 && y >= 0 && y < 4;
|
||||
x += dx, y += dy
|
||||
) {
|
||||
if (
|
||||
!force && heights[y][x] != 0 && heights[y][x] != newHeights.get(i)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
heights[y][x] = newHeights.get(i++);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean solvePuzzle(
|
||||
int[][] heights, int[] clues, int clueIndex, boolean ignoreZeroes
|
||||
) {
|
||||
while (clueIndex < 16 && ((ignoreZeroes && clues[clueIndex] == 0) || (!ignoreZeroes && clues[clueIndex] != 0))) {
|
||||
clueIndex++;
|
||||
}
|
||||
|
||||
if (clueIndex >= 16) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// create copy of heights to ensure correct resetting
|
||||
List<Integer> currentHeights = backupHeights(heights, clueIndex);
|
||||
|
||||
// iterate through the options
|
||||
for (List<Integer> possibleHeights : new PossibleConfigurations(4, clues[clueIndex])) {
|
||||
|
||||
// emplace heights and if conflict occurs, reset and try next one
|
||||
if (!emplaceHeights(heights, clueIndex, possibleHeights, false)) {
|
||||
emplaceHeights(heights, clueIndex, currentHeights, true);
|
||||
continue;
|
||||
}
|
||||
|
||||
// if no conflict present, try filling out other clues
|
||||
if (solvePuzzle(heights, clues, clueIndex + 1, ignoreZeroes)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// otherwise reset heights and try again
|
||||
emplaceHeights(heights, clueIndex, currentHeights, true);
|
||||
}
|
||||
|
||||
// if we got here, there is no feasible configuration of buildings
|
||||
return false;
|
||||
}
|
||||
|
||||
static int[][] solvePuzzle(int[] clues) {
|
||||
var result = new int[4][4];
|
||||
solvePuzzle(result, clues, 0, true);
|
||||
|
||||
// in case there are left zeroes
|
||||
solvePuzzle(result, clues, 0, false);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
44
4kyu/adding_big_numbers/solution.cs
Normal file
44
4kyu/adding_big_numbers/solution.cs
Normal file
|
@ -0,0 +1,44 @@
|
|||
using System;
|
||||
|
||||
public class Kata {
|
||||
public static (uint remainder, uint digit) SumTwo(char a, char b, uint c = 0) {
|
||||
uint val_a = (uint) a - 48;
|
||||
uint val_b = (uint) b - 48;
|
||||
|
||||
var sum = val_a + val_b + c;
|
||||
return (sum / 10, sum % 10);
|
||||
}
|
||||
public static string Add(string a, string b) {
|
||||
var result = "";
|
||||
|
||||
if (a.Length > b.Length) {
|
||||
var temp = a;
|
||||
a = b;
|
||||
b = temp;
|
||||
}
|
||||
|
||||
int idx_a = a.Length - 1;
|
||||
int idx_b = b.Length - 1;
|
||||
uint remainder = 0;
|
||||
uint last_digit = 0;
|
||||
|
||||
while (idx_a >= 0) {
|
||||
(remainder, last_digit) = SumTwo(a[idx_a], b[idx_b], remainder);
|
||||
result = last_digit.ToString() + result;
|
||||
idx_a--;
|
||||
idx_b--;
|
||||
}
|
||||
|
||||
while (idx_b >= 0) {
|
||||
(remainder, last_digit) = SumTwo('0', b[idx_b], remainder);
|
||||
result = last_digit.ToString() + result;
|
||||
idx_b--;
|
||||
}
|
||||
|
||||
if (remainder > 0) {
|
||||
result = remainder.ToString() + result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
61
4kyu/breadcrumb_generator/solution.js
Normal file
61
4kyu/breadcrumb_generator/solution.js
Normal file
|
@ -0,0 +1,61 @@
|
|||
function checkExtension(name) {
|
||||
const extensions = ['.html', '.htm', '.php', '.asp'];
|
||||
return name.replace(/\.html/g, '').replace(/\.htm/g, '').replace(/\.php/g, '').replace(/\.asp/g, '');
|
||||
}
|
||||
|
||||
function shorten(name) {
|
||||
if (name.length <= 30) {
|
||||
name = name.replace(/-/g, ' ');
|
||||
} else {
|
||||
const ignore = ["the","of","in","from","by","with","and", "or", "for", "to", "at", "a"];
|
||||
|
||||
name = name.split('-').filter(e => !ignore.includes(e)).map(e => e[0]);
|
||||
name = name.join('');
|
||||
}
|
||||
|
||||
return name.toUpperCase();
|
||||
}
|
||||
|
||||
function buildSegment(url, name, last=false) {
|
||||
if (last) {
|
||||
return `<span class="active">${shorten(checkExtension(name))}</span>`;
|
||||
} else {
|
||||
return `<a href="${url}">${shorten(checkExtension(name))}</a>`;
|
||||
}
|
||||
}
|
||||
|
||||
function generateBC(url, separator) {
|
||||
console.log(url);
|
||||
if (url.includes('//')) {
|
||||
url = url.split('//')[1];
|
||||
}
|
||||
|
||||
url = url.split("/").filter(e => {
|
||||
return !e.startsWith('index');
|
||||
}).map(e => {
|
||||
if (e.includes("#"))
|
||||
return e.substring(0, e.indexOf("#"));
|
||||
else if (e.includes("?"))
|
||||
return e.substring(0, e.indexOf("?"));
|
||||
else
|
||||
return e;
|
||||
});
|
||||
|
||||
let result = [];
|
||||
let path = '/';
|
||||
if ((url.length == 2 && url[1] == '') || url.length == 1) {
|
||||
result.push(buildSegment('/', 'home', true));
|
||||
return result.join('');
|
||||
} else
|
||||
result.push(buildSegment('/', 'home'));
|
||||
|
||||
|
||||
for (let i = 1; i < url.length - 1; i++) {
|
||||
path += `${url[i]}/`;
|
||||
result.push(buildSegment(path, url[i]));
|
||||
}
|
||||
path += `/${url[url.length - 1]}`
|
||||
result.push(buildSegment(path, url[url.length - 1], true));
|
||||
|
||||
return result.join(separator);
|
||||
}
|
28
4kyu/counting_change_combinations/solution.cs
Normal file
28
4kyu/counting_change_combinations/solution.cs
Normal file
|
@ -0,0 +1,28 @@
|
|||
using System;
|
||||
|
||||
public static class Kata {
|
||||
public static int CountCombinations(int money, int[] coins, bool recursivelyCalled = false) {
|
||||
if (money == 0 && recursivelyCalled) return 1;
|
||||
else if (coins.GetLength(0) == 1) {
|
||||
if (money % coins[0] == 0) return 1;
|
||||
else return 0;
|
||||
} else if (!recursivelyCalled) {
|
||||
Array.Sort(coins);
|
||||
Array.Reverse(coins);
|
||||
}
|
||||
|
||||
var result = 0;
|
||||
|
||||
var times = money / coins[0];
|
||||
var newCoins = new int[coins.GetLength(0) - 1];
|
||||
|
||||
for (var i = 0; i < coins.GetLength(0) - 1; i++)
|
||||
newCoins[i] = coins[i + 1];
|
||||
|
||||
for (var i = 0; i <= times; i++) {
|
||||
result += CountCombinations(money - i * coins[0], newCoins, true);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
115
4kyu/es5_generators_i/solution.js
Normal file
115
4kyu/es5_generators_i/solution.js
Normal file
|
@ -0,0 +1,115 @@
|
|||
function generator(sequencer) {
|
||||
return sequencer.apply(
|
||||
null,
|
||||
[]
|
||||
.slice
|
||||
.call(arguments)
|
||||
.slice(1)
|
||||
);
|
||||
}
|
||||
|
||||
function dummySeq() {
|
||||
this.next = function() {
|
||||
return "dummy";
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function factorialSeq() {
|
||||
this.n = 1;
|
||||
this.i = 0;
|
||||
|
||||
this.next = function() {
|
||||
const value = this.n;
|
||||
|
||||
this.i++;
|
||||
this.n *= this.i;
|
||||
|
||||
return value;
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function fibonacciSeq() {
|
||||
this.prev = 0;
|
||||
this.current = 1;
|
||||
|
||||
this.next = function() {
|
||||
const value = this.current;
|
||||
|
||||
const newValue = this.prev + this.current;
|
||||
this.prev = this.current;
|
||||
this.current= newValue;
|
||||
|
||||
return value;
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function rangeSeq(start, step) {
|
||||
this.value = start;
|
||||
this.step = step;
|
||||
|
||||
this.next = function() {
|
||||
const oldValue = this.value;
|
||||
this.value += this.step;
|
||||
|
||||
return oldValue;
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function primeSeq() {
|
||||
const isPrime = function(n) {
|
||||
const top = Math.floor(Math.sqrt(n));
|
||||
for (let i = 2; i <= top; i++) {
|
||||
if (n % i == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
const nextPrime = function(n) {
|
||||
n++;
|
||||
while (!isPrime(n)) {
|
||||
n++;
|
||||
}
|
||||
|
||||
return n;
|
||||
};
|
||||
|
||||
this.p = 1;
|
||||
|
||||
this.next = function() {
|
||||
this.p = nextPrime(this.p);
|
||||
|
||||
return this.p;
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function partialSumSeq() {
|
||||
this.values = arguments;
|
||||
this.length = arguments.length;
|
||||
this.runningSum = 0;
|
||||
this.i = 0;
|
||||
|
||||
this.next = function() {
|
||||
if (this.i >= this.length) {
|
||||
throw new RangeError("All input was processed!");
|
||||
}
|
||||
|
||||
this.runningSum += this.values[this.i++];
|
||||
|
||||
return this.runningSum;
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
39
4kyu/human_readable_duration_format/solution.cs
Normal file
39
4kyu/human_readable_duration_format/solution.cs
Normal file
|
@ -0,0 +1,39 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class HumanTimeFormat{
|
||||
private static Dictionary<string, int> conversions = new Dictionary<string, int>() {
|
||||
{"year", 31536000},
|
||||
{"day", 86400},
|
||||
{"hour", 3600},
|
||||
{"minute", 60},
|
||||
{"second", 1}
|
||||
};
|
||||
|
||||
public static string formatDuration(int seconds){
|
||||
if (seconds == 0) return "now";
|
||||
|
||||
var results = new List<string>();
|
||||
foreach (var pair in conversions) {
|
||||
var units = seconds / pair.Value;
|
||||
seconds %= pair.Value;
|
||||
if (units > 0) {
|
||||
var part = $"{units} {pair.Key}";
|
||||
if (units > 1) {
|
||||
part += "s";
|
||||
}
|
||||
results.Add(part);
|
||||
}
|
||||
}
|
||||
|
||||
if (results.Count == 1) return results[0];
|
||||
else {
|
||||
var last = results.Last();
|
||||
results.Remove(last);
|
||||
|
||||
var result = String.Join(", ", results);
|
||||
return result + " and " + last;
|
||||
}
|
||||
}
|
||||
}
|
15
4kyu/magnet_particules_in_boxes/solution.cs
Normal file
15
4kyu/magnet_particules_in_boxes/solution.cs
Normal file
|
@ -0,0 +1,15 @@
|
|||
using System;
|
||||
|
||||
public class Magnets
|
||||
{
|
||||
public static double Doubles(int maxk, int maxn)
|
||||
{
|
||||
double val = 0;
|
||||
|
||||
for (int k = 1; k <= maxk; k++)
|
||||
for (int n = 1; n <= maxn; n++)
|
||||
val += 1 / (k * Math.Pow(n + 1, 2 * k));
|
||||
|
||||
return val;
|
||||
}
|
||||
}
|
44
4kyu/matrix_determinant/solution.cpp
Normal file
44
4kyu/matrix_determinant/solution.cpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
vector<vector<long long>> transform(vector<vector<long long>> m, int row,
|
||||
int col) {
|
||||
vector<vector<long long>> result;
|
||||
|
||||
for (int i = 0; i < m.size(); i++) {
|
||||
if (i == row)
|
||||
continue;
|
||||
vector<long long> actual_row;
|
||||
for (int j = 0; j < m[i].size(); j++) {
|
||||
if (j == col)
|
||||
continue;
|
||||
actual_row.push_back(m[i][j]);
|
||||
}
|
||||
result.push_back(actual_row);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
long long determinant(vector<vector<long long>> m) {
|
||||
switch (m.size()) {
|
||||
case 1:
|
||||
return m[0][0];
|
||||
break;
|
||||
case 2:
|
||||
return m[0][0] * m[1][1] - m[0][1] * m[1][0];
|
||||
break;
|
||||
}
|
||||
|
||||
long long result = 0;
|
||||
|
||||
for (int i = 0; i < m.size(); i++) {
|
||||
auto l_m = transform(m, i, 0);
|
||||
result += pow(-1, i + 2) * m[i][0] * determinant(l_m);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
65
4kyu/next_bigger_with_same_digits/solution.cs
Normal file
65
4kyu/next_bigger_with_same_digits/solution.cs
Normal file
|
@ -0,0 +1,65 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class Kata {
|
||||
public static List<long> ExtractDigits(long n) {
|
||||
var result = new List<long>();
|
||||
|
||||
while (n > 0) {
|
||||
result.Add(n % 10);
|
||||
n /= 10;
|
||||
}
|
||||
|
||||
result.Reverse();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static bool NextPermutation(List<long> digits) {
|
||||
// foreach (var digit in digits) Console.Write($"{digit} ");
|
||||
// Console.WriteLine();
|
||||
|
||||
var k = -1;
|
||||
|
||||
for (var i = 0; i < digits.Count - 1; i++) {
|
||||
if (digits[i] < digits[i + 1])
|
||||
k = i;
|
||||
}
|
||||
if (k == -1) return false;
|
||||
|
||||
var l = k;
|
||||
for (var i = 0; i < digits.Count; i++)
|
||||
if (digits[k] < digits[i]) l = i;
|
||||
if (l == k) return false;
|
||||
|
||||
var tmp = digits[k];
|
||||
digits[k] = digits[l];
|
||||
digits[l] = tmp;
|
||||
|
||||
// foreach (var digit in digits) Console.Write($"{digit} ");
|
||||
// Console.WriteLine();
|
||||
|
||||
digits.Reverse(k + 1, digits.Count - k - 1);
|
||||
|
||||
// foreach (var digit in digits) Console.Write($"{digit} ");
|
||||
// Console.WriteLine();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static long NextBiggerNumber(long n) {
|
||||
if (n < 10) return -1;
|
||||
|
||||
var digits = ExtractDigits(n);
|
||||
if (!NextPermutation(digits)) {
|
||||
return -1;
|
||||
} else {
|
||||
var result = 0l;
|
||||
foreach (var digit in digits) {
|
||||
result *= 10;
|
||||
result += digit;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
47
4kyu/permutations/solution.cpp
Normal file
47
4kyu/permutations/solution.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
template <typename T> bool nextPermutation(std::vector<T> &vec) {
|
||||
// Find non-increasing suffix
|
||||
if (vec.empty())
|
||||
return false;
|
||||
typename std::vector<T>::iterator i = vec.end() - 1;
|
||||
while (i > vec.begin() && *(i - 1) >= *i)
|
||||
--i;
|
||||
if (i == vec.begin())
|
||||
return false;
|
||||
|
||||
// Find successor to pivot
|
||||
typename std::vector<T>::iterator j = vec.end() - 1;
|
||||
while (*j <= *(i - 1))
|
||||
--j;
|
||||
std::iter_swap(i - 1, j);
|
||||
|
||||
// Reverse suffix
|
||||
std::reverse(i, vec.end());
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<std::string> permutations(std::string s) {
|
||||
std::set<std::string> strings;
|
||||
std::vector<std::string> result;
|
||||
std::vector<char> s_vec;
|
||||
|
||||
// copy string into vector
|
||||
|
||||
for (auto ch = s.begin(); ch != s.end(); ch++) {
|
||||
s_vec.push_back(*ch);
|
||||
}
|
||||
|
||||
// do the magic
|
||||
std::sort(s_vec.begin(), s_vec.end());
|
||||
do {
|
||||
strings.insert(std::string(s_vec.begin(), s_vec.end()));
|
||||
} while (nextPermutation(s_vec));
|
||||
|
||||
std::copy(strings.begin(), strings.end(), std::back_inserter(result));
|
||||
return result;
|
||||
}
|
24
4kyu/priori_incantatem/solution.js
Normal file
24
4kyu/priori_incantatem/solution.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
class Wand {
|
||||
constructor(spells) {
|
||||
this.history = [];
|
||||
Object.assign(this, spells);
|
||||
|
||||
return new Proxy(this, {
|
||||
get: (target, property) => {
|
||||
const val = target[property];
|
||||
if (typeof val === 'function') {
|
||||
target.history.unshift(property);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
prioriIncantatem() {
|
||||
return this.history.slice(1, MAX_PRIOR_SPELLS + 1);
|
||||
}
|
||||
|
||||
deletrius() {
|
||||
this.history = ['deletrius'];
|
||||
}
|
||||
}
|
19
4kyu/pyramid_slide_down/solution.cs
Normal file
19
4kyu/pyramid_slide_down/solution.cs
Normal file
|
@ -0,0 +1,19 @@
|
|||
using System;
|
||||
|
||||
public class PyramidSlideDown
|
||||
{
|
||||
public static int LongestSlideDown(int[][] pyramid)
|
||||
{
|
||||
for (var i = pyramid.GetLength(0) - 2; i >= 0; i--) {
|
||||
for (var j = 0; j <= i; j++) {
|
||||
if (pyramid[i + 1][j] > pyramid[i + 1][j + 1]) {
|
||||
pyramid[i][j] += pyramid[i + 1][j];
|
||||
} else {
|
||||
pyramid[i][j] += pyramid[i + 1][j + 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pyramid[0][0];
|
||||
}
|
||||
}
|
28
4kyu/remove_zeros/solution.js
Normal file
28
4kyu/remove_zeros/solution.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
function swap(array, i, j) {
|
||||
let temporary = array[i];
|
||||
array[i] = array[j];
|
||||
array[j] = temporary;
|
||||
}
|
||||
|
||||
function removeZeros(array) {
|
||||
// Sort "array" so that all elements with the value of zero are moved to the
|
||||
// end of the array, while the other elements maintain order.
|
||||
// [0, 1, 2, 0, 3] --> [1, 2, 3, 0, 0]
|
||||
// Zero elements also maintain order in which they occurred.
|
||||
// [0, "0", 1, 2, 3] --> [1, 2, 3, 0, "0"]
|
||||
|
||||
// Do not use any temporary arrays or objects. Additionally, you're not able
|
||||
// to use any Array or Object prototype methods such as .shift(), .push(), etc
|
||||
|
||||
// the correctly sorted array should be returned.
|
||||
|
||||
for (let i = array.length - 2; i > -1; i--) {
|
||||
if (array[i] === 0 || array[i] === '0') {
|
||||
for (let j = i; j < array.length - 1 && array[j + 1] !== 0 && array[j + 1] !== '0'; j++) {
|
||||
swap(array, j, j + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
69
4kyu/route_calculator/solution.ts
Normal file
69
4kyu/route_calculator/solution.ts
Normal file
|
@ -0,0 +1,69 @@
|
|||
class Expression {
|
||||
private static readonly INVALID_REQUEST: string = "400: Bad request";
|
||||
|
||||
value: string;
|
||||
|
||||
l: Expression | null = null;
|
||||
r: Expression | null = null;
|
||||
|
||||
private splitBy(operation: string): boolean {
|
||||
let splitOperands = this.value.split(operation);
|
||||
if (splitOperands.length < 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.value = operation;
|
||||
this.r = new Expression(splitOperands.pop());
|
||||
this.l = new Expression(splitOperands.join(operation));
|
||||
return true;
|
||||
}
|
||||
|
||||
constructor(expr: string) {
|
||||
this.value = expr;
|
||||
|
||||
for (let operation of "+-*$") {
|
||||
if (this.splitBy(operation)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public evaluate(): (number | string) {
|
||||
if (this.l === null && this.r === null) {
|
||||
// process constants
|
||||
if (![...this.value].every(c => "0123456789.".includes(c))) {
|
||||
return Expression.INVALID_REQUEST;
|
||||
}
|
||||
|
||||
const val = Number.parseFloat(this.value);
|
||||
return val;
|
||||
}
|
||||
|
||||
if (this.l === null || this.r === null || !("+-$*".includes(this.value))) {
|
||||
return Expression.INVALID_REQUEST;
|
||||
}
|
||||
|
||||
const left = this.l.evaluate();
|
||||
const right = this.r.evaluate();
|
||||
|
||||
if (typeof left !== "number" || typeof right !== "number") {
|
||||
return Expression.INVALID_REQUEST;
|
||||
}
|
||||
|
||||
let operation = null;
|
||||
switch (this.value) {
|
||||
case "+":
|
||||
return left + right;
|
||||
case "-":
|
||||
return left - right;
|
||||
case "$":
|
||||
return left / right;
|
||||
case "*":
|
||||
return left * right;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const calculate = (sum: string): (number | string) => {
|
||||
return new Expression(sum).evaluate();
|
||||
}
|
57
4kyu/simplistic_tcp_fsm/solution.cs
Normal file
57
4kyu/simplistic_tcp_fsm/solution.cs
Normal file
|
@ -0,0 +1,57 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class TCP {
|
||||
private static bool IsInitialized = false;
|
||||
private static Dictionary<string, Dictionary<string, string>> Transitions = new Dictionary<string, Dictionary<string, string>>();
|
||||
|
||||
private static void InitializeIfNeeded() {
|
||||
if (IsInitialized) {
|
||||
return;
|
||||
}
|
||||
IsInitialized = true;
|
||||
|
||||
var transitions = new List<(string, string, string)>() {
|
||||
("CLOSED", "APP_PASSIVE_OPEN" , "LISTEN"),
|
||||
("CLOSED", "APP_ACTIVE_OPEN" , "SYN_SENT"),
|
||||
("LISTEN", "RCV_SYN" , "SYN_RCVD"),
|
||||
("LISTEN", "APP_SEND" , "SYN_SENT"),
|
||||
("LISTEN", "APP_CLOSE" , "CLOSED"),
|
||||
("SYN_RCVD", "APP_CLOSE" , "FIN_WAIT_1"),
|
||||
("SYN_RCVD", "RCV_ACK" , "ESTABLISHED"),
|
||||
("SYN_SENT", "RCV_SYN" , "SYN_RCVD"),
|
||||
("SYN_SENT", "RCV_SYN_ACK" , "ESTABLISHED"),
|
||||
("SYN_SENT", "APP_CLOSE" , "CLOSED"),
|
||||
("ESTABLISHED", "APP_CLOSE" , "FIN_WAIT_1"),
|
||||
("ESTABLISHED", "RCV_FIN" , "CLOSE_WAIT"),
|
||||
("FIN_WAIT_1", "RCV_FIN" , "CLOSING"),
|
||||
("FIN_WAIT_1", "RCV_FIN_ACK" , "TIME_WAIT"),
|
||||
("FIN_WAIT_1", "RCV_ACK" , "FIN_WAIT_2"),
|
||||
("CLOSING", "RCV_ACK" , "TIME_WAIT"),
|
||||
("FIN_WAIT_2", "RCV_FIN" , "TIME_WAIT"),
|
||||
("TIME_WAIT", "APP_TIMEOUT" , "CLOSED"),
|
||||
("CLOSE_WAIT", "APP_CLOSE" , "LAST_ACK"),
|
||||
("LAST_ACK", "RCV_ACK" , "CLOSED"),
|
||||
};
|
||||
|
||||
foreach (var (fromState, byEvent, toState) in transitions) {
|
||||
var fromStateDictionary = Transitions.GetValueOrDefault(fromState, new Dictionary<string, string>());
|
||||
fromStateDictionary.Add(byEvent, toState);
|
||||
Transitions[fromState] = fromStateDictionary;
|
||||
}
|
||||
}
|
||||
|
||||
public static string TraverseStates(string[] events) {
|
||||
InitializeIfNeeded();
|
||||
|
||||
var state = "CLOSED"; // initial state, always
|
||||
|
||||
foreach (var ev in events) {
|
||||
state = Transitions
|
||||
.GetValueOrDefault(state, new Dictionary<string, string>())
|
||||
.GetValueOrDefault(ev, "ERROR");
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
}
|
46
4kyu/snail/solution.cs
Normal file
46
4kyu/snail/solution.cs
Normal file
|
@ -0,0 +1,46 @@
|
|||
using System;
|
||||
|
||||
public class SnailSolution {
|
||||
private static void Update(ref int dx, ref int dy) {
|
||||
int newDx = -dy, newDy = dx;
|
||||
dy = newDy;
|
||||
dx = newDx;
|
||||
}
|
||||
|
||||
public static int[] Snail(int[][] array) {
|
||||
if (array.Length == 1 && array[0].Length == 0) {
|
||||
return new int[] {};
|
||||
}
|
||||
|
||||
int[] result = new int[array.Length * array.Length];
|
||||
|
||||
int y = 0, x = 0;
|
||||
int dy = 0, dx = 1;
|
||||
|
||||
int left = -1, right = array.Length;
|
||||
int top = 0, bottom = array.Length;
|
||||
|
||||
for (var i = 0; i < result.Length; i++) {
|
||||
result[i] = array[y][x];
|
||||
|
||||
if (dx != 0 && x + dx <= left) {
|
||||
left++;
|
||||
Update(ref dx, ref dy);
|
||||
} else if (dx != 0 && x + dx >= right) {
|
||||
right--;
|
||||
Update(ref dx, ref dy);
|
||||
} else if (dy != 0 && y + dy <= top) {
|
||||
top++;
|
||||
Update(ref dx, ref dy);
|
||||
} else if (dy != 0 && y + dy >= bottom) {
|
||||
bottom--;
|
||||
Update(ref dx, ref dy);
|
||||
}
|
||||
|
||||
x += dx;
|
||||
y += dy;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
53
4kyu/sudoku_solution_validator/solution.cs
Normal file
53
4kyu/sudoku_solution_validator/solution.cs
Normal file
|
@ -0,0 +1,53 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
public class Sudoku {
|
||||
private static readonly int FULL = (~(((~0) >> 9) << 9)) << 1;
|
||||
|
||||
private static IEnumerable<(int, int)> Row(int row) {
|
||||
for (var col = 0; col < 9; col++) {
|
||||
yield return (row, col);
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<(int, int)> Column(int column) {
|
||||
for (var row = 0; row < 9; row++) {
|
||||
yield return (row, column);
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<(int, int)> Box(int k) {
|
||||
var row = 3 * (k / 3);
|
||||
var col = 3 * (k % 3);
|
||||
|
||||
for (var i = 0; i < 3; i++) {
|
||||
for (var j = 0; j < 3; j++) {
|
||||
yield return (row + i, col + j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool Valid(int[][] board, IEnumerable<(int, int)> coordinates) {
|
||||
var encountered = 0;
|
||||
foreach (var (row, col) in coordinates) {
|
||||
if (board[row][col] == 0) {
|
||||
return false;
|
||||
} else if ((encountered & (1 << board[row][col])) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
encountered |= 1 << board[row][col];
|
||||
}
|
||||
|
||||
return encountered == FULL;
|
||||
}
|
||||
|
||||
public static bool ValidateSolution(int[][] board) {
|
||||
for (var i = 0; i < 9; i++) {
|
||||
if (!Valid(board, Row(i)) || !Valid(board, Column(i)) || !Valid(board, Box(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
29
4kyu/sum_by_factors/solution.rs
Normal file
29
4kyu/sum_by_factors/solution.rs
Normal file
|
@ -0,0 +1,29 @@
|
|||
use std::vec::Vec;
|
||||
|
||||
fn is_prime(n: i64) -> bool {
|
||||
match n {
|
||||
x if x % 2 == 0 => x == 2,
|
||||
_ => {
|
||||
let max_value = (n as f64).sqrt().ceil() as i64;
|
||||
(3..max_value + 1).step_by(2).all(|i| n % i != 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn sum_of_divided(l: Vec<i64>) -> Vec<(i64, i64)> {
|
||||
let max_value = l.iter().max_by_key(|x| x.abs());
|
||||
|
||||
match max_value {
|
||||
Some(max_val) => (2..max_val.abs() + 1)
|
||||
.filter(|&i| is_prime(i) && l.iter().any(|x| x % i == 0))
|
||||
.map(|i| {
|
||||
(
|
||||
i,
|
||||
l.iter()
|
||||
.fold(0, |acc, &x| acc + if x % i == 0 { x } else { 0 }),
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
None => vec![],
|
||||
}
|
||||
}
|
63
4kyu/sum_strings_as_numbers/solution.cs
Normal file
63
4kyu/sum_strings_as_numbers/solution.cs
Normal file
|
@ -0,0 +1,63 @@
|
|||
using System;
|
||||
|
||||
public static class Kata {
|
||||
public static string sumStrings(string a, string b) {
|
||||
var result = "";
|
||||
var i = a.Length - 1;
|
||||
var j = b.Length - 1;
|
||||
var remainder = 0;
|
||||
|
||||
while (i >= 0 && j >= 0) {
|
||||
var a_digit = a[i] - '0';
|
||||
var b_digit = b[j] - '0';
|
||||
var sum = a_digit + b_digit + remainder;
|
||||
|
||||
result = (sum % 10) + result;
|
||||
|
||||
if (sum >= 10) {
|
||||
remainder = sum / 10;
|
||||
} else {
|
||||
remainder = 0;
|
||||
}
|
||||
|
||||
i--;
|
||||
j--;
|
||||
}
|
||||
|
||||
while (i >= 0) {
|
||||
var a_digit = a[i] - '0';
|
||||
var sum = a_digit + remainder;
|
||||
|
||||
result = (sum % 10) + result;
|
||||
|
||||
if (sum >= 10) {
|
||||
remainder = sum / 10;
|
||||
} else {
|
||||
remainder = 0;
|
||||
}
|
||||
|
||||
i--;
|
||||
}
|
||||
|
||||
while (j >= 0) {
|
||||
var b_digit = b[j] - '0';
|
||||
var sum = b_digit + remainder;
|
||||
|
||||
result = (sum % 10) + result;
|
||||
|
||||
if (sum >= 10) {
|
||||
remainder = sum / 10;
|
||||
} else {
|
||||
remainder = 0;
|
||||
}
|
||||
|
||||
j--;
|
||||
}
|
||||
|
||||
if (remainder > 0) {
|
||||
result = remainder + result;
|
||||
}
|
||||
|
||||
return result.TrimStart('0');
|
||||
}
|
||||
}
|
29
4kyu/the_observed_pin/solution.cs
Normal file
29
4kyu/the_observed_pin/solution.cs
Normal file
|
@ -0,0 +1,29 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class Kata {
|
||||
private static Dictionary<char, string> Possible = new Dictionary<char, string>() {
|
||||
{ '1', "124"}, { '2', "1235" }, { '3', "236" },
|
||||
{ '4', "1457"}, { '5', "24568" }, { '6', "3569" },
|
||||
{ '7', "478"}, { '8', "57890" }, { '9', "689" },
|
||||
{ '0', "80" }
|
||||
};
|
||||
|
||||
public static List<string> GetPINs(string observed) {
|
||||
var result = new HashSet<string>() {
|
||||
""
|
||||
};
|
||||
|
||||
foreach (char observedDigit in observed) {
|
||||
var possibleDigits = Possible[observedDigit];
|
||||
|
||||
result = new HashSet<string>(
|
||||
result
|
||||
.Select(pin => possibleDigits.Select(d => pin + d))
|
||||
.Aggregate((acc, e) => acc.Union(e))
|
||||
);
|
||||
}
|
||||
|
||||
return result.ToList();
|
||||
}
|
||||
}
|
31
4kyu/twice_linear/solution.js
Normal file
31
4kyu/twice_linear/solution.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
function dblLinear(n) {
|
||||
let values = [1];
|
||||
let seen = new Set(values);
|
||||
let index = 0;
|
||||
let length = 0;
|
||||
|
||||
while (length < n) {
|
||||
const x = values.shift();
|
||||
seen.delete(x);
|
||||
|
||||
const a = 2 * x + 1;
|
||||
const b = 3 * x + 1;
|
||||
|
||||
if (!seen.has(a)) {
|
||||
let i = index;
|
||||
|
||||
for (;i < values.length; i++)
|
||||
if (values[i] > a)
|
||||
break;
|
||||
values.splice(i, 0, a);
|
||||
seen.add(a);
|
||||
index = i;
|
||||
}
|
||||
|
||||
seen.add(b);
|
||||
values.push(b);
|
||||
length++;
|
||||
}
|
||||
console.log(values);
|
||||
return values[0];
|
||||
}
|
15
5kyu/buddy_pairs/solution.kt
Normal file
15
5kyu/buddy_pairs/solution.kt
Normal file
|
@ -0,0 +1,15 @@
|
|||
fun getSumOfDivisors(n: Long): Long =
|
||||
(1 until Math.sqrt(n.toDouble()).toLong() + 1).reduce {
|
||||
acc, e -> acc + if (n.rem(e) == 0.toLong()) e + n.div(e) else 0.toLong()
|
||||
}
|
||||
|
||||
fun buddy(start: Long, limit: Long): String {
|
||||
for (n in start..limit) {
|
||||
val m = getSumOfDivisors(n) - 1
|
||||
if (m > n && getSumOfDivisors(m) - 1 == n) {
|
||||
return "($n $m)"
|
||||
}
|
||||
}
|
||||
|
||||
return "Nothing"
|
||||
}
|
15
5kyu/calculating_with_functions/solution.js
Normal file
15
5kyu/calculating_with_functions/solution.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
function zero(operand=null) { return (operand) ? operand(0) : 0; }
|
||||
function one(operand=null) { return (operand) ? operand(1) : 1; }
|
||||
function two(operand=null) { return (operand) ? operand(2) : 2; }
|
||||
function three(operand=null) { return (operand) ? operand(3) : 3; }
|
||||
function four(operand=null) { return (operand) ? operand(4) : 4; }
|
||||
function five(operand=null) { return (operand) ? operand(5) : 5; }
|
||||
function six(operand=null) { return (operand) ? operand(6) : 6; }
|
||||
function seven(operand=null) { return (operand) ? operand(7) : 7; }
|
||||
function eight(operand=null) { return (operand) ? operand(8) : 8; }
|
||||
function nine(operand=null) { return (operand) ? operand(9) : 9; }
|
||||
|
||||
function plus(right) { return (x) => x + right; }
|
||||
function minus(right) { return (x) => x - right; }
|
||||
function times(right) { return (x) => x * right; }
|
||||
function dividedBy(right) { return (x) => Math.floor(x / right); }
|
32
5kyu/common_denominators/solution.cs
Normal file
32
5kyu/common_denominators/solution.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using System;
|
||||
|
||||
public class Fracts {
|
||||
public static string convertFrac(long[,] lst)
|
||||
{
|
||||
if (lst.GetLength(0) < 1) return "";
|
||||
long denominator = lst[0, 1];
|
||||
|
||||
string result = "";
|
||||
|
||||
for (int i = 0; i < lst.GetLength(0); i++) denominator = LeastCommonMultiple(denominator, lst[i, 1]);
|
||||
|
||||
for (int i = 0; i < lst.GetLength(0); i++)
|
||||
{
|
||||
long factor = denominator / lst[i, 1];
|
||||
result += String.Format("({0},{1})", lst[i, 0] * factor, lst[i, 1] * factor);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static long GreatestCommonDivisor(long a, long b)
|
||||
{
|
||||
if (b == 0) return a;
|
||||
else return GreatestCommonDivisor(b, a % b);
|
||||
}
|
||||
|
||||
public static long LeastCommonMultiple(long a, long b)
|
||||
{
|
||||
return a * b / GreatestCommonDivisor(a, b);
|
||||
}
|
||||
}
|
13
5kyu/convert_a_hex_string_to_rgb/solution.c
Normal file
13
5kyu/convert_a_hex_string_to_rgb/solution.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include <stdio.h>
|
||||
|
||||
typedef struct {
|
||||
int r, g, b;
|
||||
} rgb;
|
||||
|
||||
rgb hex_str_to_rgb(const char *hex_str) {
|
||||
rgb result;
|
||||
|
||||
sscanf(hex_str, "#%2x%2x%2x", &result.r, &result.g, &result.b);
|
||||
|
||||
return result;
|
||||
}
|
10
5kyu/count_ip_addresses/solution.rs
Normal file
10
5kyu/count_ip_addresses/solution.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
fn parse_ip(ip_str: &str) -> u32 {
|
||||
ip_str
|
||||
.split(".")
|
||||
.map(|octet| octet.parse::<u32>().unwrap())
|
||||
.fold(0, |ip, octet| (ip << 8) | octet)
|
||||
}
|
||||
|
||||
pub fn ips_between(start: &str, end: &str) -> u32 {
|
||||
parse_ip(end) - parse_ip(start)
|
||||
}
|
57
5kyu/did_i_finish_my_sudokou/solution.js
Normal file
57
5kyu/did_i_finish_my_sudokou/solution.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
function checkSet(set) {
|
||||
if (set.size != 9) {
|
||||
return false;
|
||||
} else {
|
||||
for (let num = 1; num <= 9; num++) {
|
||||
if (!set.has(num)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function doneOrNot(board) {
|
||||
const positive = "Finished!";
|
||||
const negative = "Try again!";
|
||||
|
||||
// Check rows
|
||||
for (let row of board) {
|
||||
row = new Set(row);
|
||||
if (!checkSet(row)) {
|
||||
return negative;
|
||||
}
|
||||
}
|
||||
|
||||
// Check columns
|
||||
for (let col = 0; col < 9; col++) {
|
||||
// Construct set for a column
|
||||
let column = new Set();
|
||||
for (let i = 0; i < 9; i++) {
|
||||
column.add(board[i][col]);
|
||||
}
|
||||
|
||||
if (!checkSet(column)) {
|
||||
return negative;
|
||||
}
|
||||
}
|
||||
|
||||
// Check boxes
|
||||
for (let i = 0; i < 9; i += 3) {
|
||||
for (let j = 0; j < 9; j += 3) {
|
||||
// Construct set of a box
|
||||
let box = new Set();
|
||||
for (let k = 0; k < 3; k++) {
|
||||
box.add(board[i + k][j]).add(board[i][j + k]).add(board[i + k][j + k]);
|
||||
}
|
||||
box.add(board[i + 2][j + 1]).add(board[i + 1][j + 2]);
|
||||
|
||||
if (!checkSet(box)) {
|
||||
return negative;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return positive;
|
||||
}
|
20
5kyu/directions_reduction/solution.hs
Normal file
20
5kyu/directions_reduction/solution.hs
Normal file
|
@ -0,0 +1,20 @@
|
|||
module Codewars.Kata.Reduction where
|
||||
import Codewars.Kata.Reduction.Direction
|
||||
|
||||
-- data Direction = North | East | West | South deriving (Eq)
|
||||
|
||||
areOpposite :: Direction -> Direction -> Bool
|
||||
areOpposite North South = True
|
||||
areOpposite South North = True
|
||||
areOpposite East West = True
|
||||
areOpposite West East = True
|
||||
areOpposite _ _ = False
|
||||
|
||||
folding :: Direction -> [Direction] -> [Direction]
|
||||
folding x [] = [x]
|
||||
folding x (y:rest) | areOpposite x y = rest
|
||||
| otherwise = x:y:rest
|
||||
|
||||
dirReduce :: [Direction] -> [Direction]
|
||||
dirReduce [] = []
|
||||
dirReduce directions = foldr folding [] directions
|
61
5kyu/esolang_interpreters_ii/solution.swift
Normal file
61
5kyu/esolang_interpreters_ii/solution.swift
Normal file
|
@ -0,0 +1,61 @@
|
|||
func interpreter(_ code: String, _ tape: String) -> String {
|
||||
func fromTape(stringTape: String) -> [Int] {
|
||||
return stringTape.map({ c in (c == "0") ? 0 : 1 })
|
||||
}
|
||||
|
||||
func toTape(intTape: [Int]) -> String {
|
||||
return intTape.reduce("", { x, b in x + (b == 0 ? "0" : "1") })
|
||||
}
|
||||
|
||||
func findComplement(direction: Int, startIndex: Int, l: Character, r: Character) -> Int {
|
||||
var depth = 0
|
||||
var i = startIndex
|
||||
|
||||
repeat {
|
||||
let c = code[code.index(code.startIndex, offsetBy: i)]
|
||||
|
||||
if c == l {
|
||||
depth += 1
|
||||
} else if c == r {
|
||||
depth -= 1
|
||||
}
|
||||
|
||||
i += direction
|
||||
} while depth != 0
|
||||
|
||||
return i
|
||||
}
|
||||
|
||||
var bits = fromTape(stringTape: tape)
|
||||
var i = 0
|
||||
|
||||
var codeIndex = 0
|
||||
while codeIndex >= 0 && codeIndex < code.count {
|
||||
switch code[code.index(code.startIndex, offsetBy: codeIndex)] {
|
||||
case ">":
|
||||
i += 1
|
||||
case "<":
|
||||
i -= 1
|
||||
case "*":
|
||||
bits[i] = (bits[i] + 1) % 2
|
||||
case "[":
|
||||
if bits[i] == 0 {
|
||||
codeIndex = findComplement(direction: 1, startIndex: codeIndex, l: "[", r: "]") - 1
|
||||
}
|
||||
case "]":
|
||||
if bits[i] != 0 {
|
||||
codeIndex = findComplement(direction: -1, startIndex: codeIndex, l: "]", r: "[")
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
codeIndex += 1
|
||||
|
||||
if i < 0 || i >= bits.count {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return toTape(intTape: bits)
|
||||
}
|
48
5kyu/greed_is_good/solution.cpp
Normal file
48
5kyu/greed_is_good/solution.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <map>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
std::map<int, int> process_dice(const std::vector<int>& dice) {
|
||||
std::map<int, int> freqs;
|
||||
|
||||
for (auto val : dice) {
|
||||
freqs[val]++;
|
||||
}
|
||||
|
||||
return freqs;
|
||||
}
|
||||
|
||||
int score(const std::vector<int>& dice) {
|
||||
const std::map<std::tuple<int, int>, int> options{
|
||||
{{3, 1}, 1000},
|
||||
{{3, 6}, 600},
|
||||
{{3, 5}, 500},
|
||||
{{3, 4}, 400},
|
||||
{{3, 3}, 300},
|
||||
{{3, 2}, 200}
|
||||
};
|
||||
|
||||
auto counts = process_dice(dice);
|
||||
auto total = 0;
|
||||
|
||||
for (auto has_changed = true; has_changed;) {
|
||||
has_changed = false;
|
||||
|
||||
for (const auto& [option, points] : options) {
|
||||
const auto& [count, die] = option;
|
||||
|
||||
if (counts[die] >= count) {
|
||||
counts[die] -= count;
|
||||
total += points;
|
||||
|
||||
has_changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
total += counts[1] * 100;
|
||||
total += counts[5] * 50;
|
||||
|
||||
return total;
|
||||
}
|
24
5kyu/halloween_sweets/solution.js
Normal file
24
5kyu/halloween_sweets/solution.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
function pick(bags, scale) {
|
||||
if (bags.length == 1) {
|
||||
return bags[0];
|
||||
}
|
||||
|
||||
let sets = [];
|
||||
let sizeOfSet = bags.length / 3;
|
||||
|
||||
for (let i = 0; i < bags.length; i += sizeOfSet) {
|
||||
sets.push(bags.slice(i, i + sizeOfSet));
|
||||
}
|
||||
|
||||
switch (scale.weigh(sets[0], sets[1])) {
|
||||
case -1:
|
||||
return pick(sets[0], scale);
|
||||
break;
|
||||
case 0:
|
||||
return pick(sets[2], scale);
|
||||
break;
|
||||
case 1:
|
||||
return pick(sets[1], scale);
|
||||
break;
|
||||
}
|
||||
}
|
14
5kyu/human_readable_time/solution.cs
Normal file
14
5kyu/human_readable_time/solution.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
|
||||
public static class TimeFormat
|
||||
{
|
||||
public static string GetReadableTime(int seconds)
|
||||
{
|
||||
var hours = seconds / 3600;
|
||||
seconds %= 3600;
|
||||
var minutes = seconds / 60;
|
||||
seconds %= 60;
|
||||
|
||||
return String.Format("{0:00}:{1:00}:{2:00}", hours, minutes, seconds);
|
||||
}
|
||||
}
|
6
5kyu/i32_to_ipv4/solution.c
Normal file
6
5kyu/i32_to_ipv4/solution.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void uint32_to_ip(uint32_t ip, char *output) {
|
||||
sprintf(output, "%d.%d.%d.%d", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF);
|
||||
}
|
46
5kyu/is_my_friend_cheating/solution.cpp
Normal file
46
5kyu/is_my_friend_cheating/solution.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include <vector>
|
||||
#include <cmath>
|
||||
|
||||
class RemovedNumbers
|
||||
{
|
||||
static long long get_lower_bound(long long n);
|
||||
static long long get_complement(long long ax, long long n);
|
||||
|
||||
public:
|
||||
static std::vector<std::vector<long long>> removNb(long long n);
|
||||
};
|
||||
|
||||
long long RemovedNumbers::get_lower_bound(long long n)
|
||||
{
|
||||
return (long long)ceil((2 * n - n * n - n) / (-2 * n - 2.0));
|
||||
}
|
||||
|
||||
long long RemovedNumbers::get_complement(long long ax, long long n)
|
||||
{
|
||||
auto result = (0.5 * (n * n + n) - ax) / (ax + 1);
|
||||
|
||||
if (floor(result) == result)
|
||||
{
|
||||
return (long long)result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::vector<long long>> RemovedNumbers::removNb(long long n)
|
||||
{
|
||||
std::vector<std::vector<long long>> result;
|
||||
|
||||
for (long long ax = get_lower_bound(n); ax <= n; ax++)
|
||||
{
|
||||
auto complement = get_complement(ax, n);
|
||||
if (complement != 0)
|
||||
{
|
||||
result.push_back({ax, complement});
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
4
5kyu/maximum_subarray_sum/solution.kt
Normal file
4
5kyu/maximum_subarray_sum/solution.kt
Normal file
|
@ -0,0 +1,4 @@
|
|||
fun maxSequence(arr: List<Int>): Int =
|
||||
arr.scan(0) { k, it ->
|
||||
maxOf(k, 0) + it
|
||||
}.maxOrNull() ?: 0
|
12
5kyu/memoized_fibonacci/solution.py
Normal file
12
5kyu/memoized_fibonacci/solution.py
Normal file
|
@ -0,0 +1,12 @@
|
|||
fibonacci_memory = {}
|
||||
|
||||
def fibonacci(n):
|
||||
if n in [0, 1]:
|
||||
return n
|
||||
|
||||
if n not in fibonacci_memory:
|
||||
value = fibonacci(n - 1) + fibonacci(n - 2)
|
||||
fibonacci_memory[n] = value
|
||||
return value
|
||||
else:
|
||||
return fibonacci_memory[n]
|
13
5kyu/moving_zeros_to_the_end/solution.cs
Normal file
13
5kyu/moving_zeros_to_the_end/solution.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class Kata {
|
||||
public static int[] MoveZeroes(int[] arr) {
|
||||
var length = arr.GetLength(0);
|
||||
|
||||
var new_arr = arr.Where(x => x != 0).ToList();
|
||||
for (var i = length - new_arr.Count(); i > 0; i--) new_arr.Add(0);
|
||||
|
||||
return new_arr.ToArray();
|
||||
}
|
||||
}
|
86
5kyu/my_smallest_code_interpreter_bf/solution.rs
Normal file
86
5kyu/my_smallest_code_interpreter_bf/solution.rs
Normal file
|
@ -0,0 +1,86 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
fn find_left(instructions: &[u8], index: usize) -> usize {
|
||||
let mut result = index - 1;
|
||||
let mut count = 1;
|
||||
|
||||
while count != 0 {
|
||||
if instructions[result] == ']' as u8 {
|
||||
count += 1;
|
||||
} else if instructions[result] == '[' as u8 {
|
||||
count -= 1;
|
||||
}
|
||||
|
||||
result -= 1;
|
||||
}
|
||||
|
||||
result + 1
|
||||
}
|
||||
|
||||
fn find_right(instructions: &[u8], index: usize) -> usize {
|
||||
let mut result = index + 1;
|
||||
let mut count = 1;
|
||||
|
||||
while count != 0 {
|
||||
if instructions[result] == '[' as u8 {
|
||||
count += 1;
|
||||
} else if instructions[result] == ']' as u8 {
|
||||
count -= 1;
|
||||
}
|
||||
|
||||
result += 1;
|
||||
}
|
||||
|
||||
result - 1
|
||||
}
|
||||
|
||||
fn brain_luck(code: &str, input: Vec<u8>) -> Vec<u8> {
|
||||
let instructions = code.as_bytes();
|
||||
|
||||
let mut result = Vec::<u8>::new();
|
||||
let mut tape = HashMap::<i64, i16>::new();
|
||||
let mut i = 0;
|
||||
let mut tape_i = 0;
|
||||
let mut input_i = 0;
|
||||
|
||||
while i < instructions.len() {
|
||||
match instructions[i] as char {
|
||||
'>' => tape_i += 1,
|
||||
'<' => tape_i -= 1,
|
||||
'+' => {
|
||||
tape.insert(tape_i, (tape.get(&tape_i).unwrap_or(&0) + 1) % 256);
|
||||
()
|
||||
}
|
||||
'-' => {
|
||||
let new_value = tape.get(&tape_i).unwrap_or(&0) - 1;
|
||||
tape.insert(tape_i, if new_value < 0 { 255 } else { new_value });
|
||||
()
|
||||
}
|
||||
'.' => {
|
||||
result.push(*tape.get(&tape_i).unwrap_or(&0) as u8);
|
||||
()
|
||||
}
|
||||
',' => {
|
||||
tape.insert(tape_i, input[input_i] as i16);
|
||||
input_i += 1;
|
||||
()
|
||||
}
|
||||
'[' => {
|
||||
if *tape.get(&tape_i).unwrap_or(&0) == 0 {
|
||||
i = find_right(instructions, i);
|
||||
}
|
||||
()
|
||||
}
|
||||
']' => {
|
||||
if *tape.get(&tape_i).unwrap_or(&0) != 0 {
|
||||
i = find_left(instructions, i);
|
||||
}
|
||||
()
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
i += 1;
|
||||
}
|
||||
result
|
||||
}
|
16
5kyu/number_of_trailing_zeros_of_nf/solution.cs
Normal file
16
5kyu/number_of_trailing_zeros_of_nf/solution.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
|
||||
public static class Kata
|
||||
{
|
||||
public static int TrailingZeros(int n)
|
||||
{
|
||||
var sum = 0.0;
|
||||
var max = Math.Floor(Math.Log(n)/Math.Log(5));
|
||||
|
||||
for (var i = 1; i <= max; i++) {
|
||||
sum += Math.Floor(n / Math.Pow(5, i));
|
||||
}
|
||||
|
||||
return (int) sum;
|
||||
}
|
||||
}
|
21
5kyu/perimeter_of_squares_in_a_rectangle/solution.rs
Normal file
21
5kyu/perimeter_of_squares_in_a_rectangle/solution.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
use std::vec::Vec;
|
||||
|
||||
fn fibonacci(n: u64) -> Vec<u64> {
|
||||
match n {
|
||||
0 => vec![1],
|
||||
1 => vec![1, 1],
|
||||
_ => {
|
||||
let mut result = vec![1, 1];
|
||||
|
||||
for i in 2..(n as usize + 1) {
|
||||
result.push(result[i - 1] + result[i - 2]);
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn perimeter(n: u64) -> u64 {
|
||||
fibonacci(n).iter().fold(0, |acc, x| acc + 4 * x)
|
||||
}
|
16
5kyu/rgb_to_hex_conversion/solution.cs
Normal file
16
5kyu/rgb_to_hex_conversion/solution.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
public class Kata
|
||||
{
|
||||
public static int Constrain(int val, int min, int max) {
|
||||
if (val < min) return min;
|
||||
else if (val > max) return max;
|
||||
else return val;
|
||||
}
|
||||
|
||||
public static string Rgb(int r, int g, int b)
|
||||
{
|
||||
r = Constrain(r, 0, 255);
|
||||
g = Constrain(g, 0, 255);
|
||||
b = Constrain(b, 0, 255);
|
||||
return $"{r,2:X2}{g,2:X2}{b,2:X2}";
|
||||
}
|
||||
}
|
17
5kyu/rot13/solution.js
Normal file
17
5kyu/rot13/solution.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
function rot13(message) {
|
||||
let result = "";
|
||||
|
||||
for (let character of message) {
|
||||
let val = character.charCodeAt();
|
||||
|
||||
if (val >= 97 && val <= 122) {
|
||||
result += String.fromCharCode(97 + (val - 97 + 13) % 26);
|
||||
} else if (val >= 65 && val <= 90) {
|
||||
result += String.fromCharCode(65 + (val - 65 + 13) % 26);
|
||||
} else {
|
||||
result += character;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
19
5kyu/scramblies/solution.cs
Normal file
19
5kyu/scramblies/solution.cs
Normal file
|
@ -0,0 +1,19 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class Scramblies {
|
||||
public static bool Scramble(string str1, string str2) {
|
||||
var list = new List<char>(str1.ToCharArray());
|
||||
list.Sort();
|
||||
|
||||
foreach (char letter in str2) {
|
||||
if (list.Contains(letter)) {
|
||||
list.Remove(letter);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
38
5kyu/simple_assembler_interpreter/solution.kt
Normal file
38
5kyu/simple_assembler_interpreter/solution.kt
Normal file
|
@ -0,0 +1,38 @@
|
|||
private fun constantOrRegister(token: String, regs: Map<String, Int>): Int =
|
||||
token.toIntOrNull() ?: regs.getOrDefault(token, 0)
|
||||
|
||||
fun interpret(program: Array<String>): Map<String, Int> {
|
||||
var result = mutableMapOf<String, Int>()
|
||||
var instruction = 0
|
||||
|
||||
while (instruction in program.indices) {
|
||||
val ops = program.elementAt(instruction).split(' ')
|
||||
|
||||
when (ops[0]) {
|
||||
"mov" -> {
|
||||
val value = constantOrRegister(ops[2], result)
|
||||
result.put(ops[1], value)
|
||||
}
|
||||
"inc" -> {
|
||||
val value = result.getOrDefault(ops[1], 0)
|
||||
result.put(ops[1], value + 1)
|
||||
}
|
||||
"dec" -> {
|
||||
val value = result.getOrDefault(ops[1], 0)
|
||||
result.put(ops[1], value - 1)
|
||||
}
|
||||
"jnz" -> {
|
||||
val diff = constantOrRegister(ops[2], result)
|
||||
val cond = constantOrRegister(ops[1], result)
|
||||
|
||||
if (cond != 0) {
|
||||
instruction = instruction + diff - 1
|
||||
}
|
||||
}
|
||||
else -> error("invalid instruction")
|
||||
}
|
||||
instruction++
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
9
5kyu/simple_pig_latin/solution.py
Normal file
9
5kyu/simple_pig_latin/solution.py
Normal file
|
@ -0,0 +1,9 @@
|
|||
def pig_it(text):
|
||||
result = ''
|
||||
|
||||
for word in text.split():
|
||||
if word in '.?!\',':
|
||||
result += word + ' '
|
||||
else:
|
||||
result += word[1:] + word[0] + 'ay '
|
||||
return result.strip()
|
62
5kyu/snakes_and_ladders/solution.cpp
Normal file
62
5kyu/snakes_and_ladders/solution.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include <map>
|
||||
|
||||
class SnakesLadders
|
||||
{
|
||||
private:
|
||||
static std::map<int, int> sls;
|
||||
int positions[2];
|
||||
int player = 0;
|
||||
public:
|
||||
SnakesLadders(){
|
||||
positions[0] = positions[1] = 0;
|
||||
};
|
||||
std::string play(int die1, int die2)
|
||||
{
|
||||
if (positions[0] == 100 || positions[1] == 100) {
|
||||
return "Game over!";
|
||||
} else {
|
||||
positions[player] += die1 + die2;
|
||||
|
||||
if (positions[player] > 100) {
|
||||
positions[player] = 100 - positions[player] % 100;
|
||||
} else if (positions[player] == 100) {
|
||||
return "Player " + std::to_string(player + 1) + " Wins!";
|
||||
}
|
||||
|
||||
if (sls.find(positions[player]) != sls.end()) {
|
||||
positions[player] = sls[positions[player]];
|
||||
}
|
||||
|
||||
int p = player + 1;
|
||||
if (die1 != die2) {
|
||||
player = (player + 1) % 2;
|
||||
}
|
||||
|
||||
return "Player " + std::to_string(p) + " is on square " + std::to_string(positions[p - 1]);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
std::map<int, int> SnakesLadders::sls = {
|
||||
{ 2, 38},
|
||||
{ 7, 14},
|
||||
{ 8, 31},
|
||||
{15, 26},
|
||||
{16, 6},
|
||||
{21, 42},
|
||||
{28, 84},
|
||||
{36, 44},
|
||||
{46, 25},
|
||||
{49, 11},
|
||||
{51, 67},
|
||||
{62, 19},
|
||||
{64, 60},
|
||||
{71, 91},
|
||||
{74, 53},
|
||||
{78, 98},
|
||||
{87, 94},
|
||||
{89, 68},
|
||||
{92, 88},
|
||||
{95, 75},
|
||||
{99, 80},
|
||||
};
|
11
5kyu/sum_of_pairs/solution.py
Normal file
11
5kyu/sum_of_pairs/solution.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
def sum_pairs(ints, s):
|
||||
passed = {}
|
||||
|
||||
for num in ints:
|
||||
other = s - num
|
||||
if other in passed:
|
||||
return [other, num]
|
||||
else:
|
||||
passed[num] = True
|
||||
|
||||
return None
|
32
5kyu/the_clockwise_spiral/solution.cpp
Normal file
32
5kyu/the_clockwise_spiral/solution.cpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
#include <vector>
|
||||
|
||||
static void next_diff(int &dy, int &dx) {
|
||||
int new_dx = -dy, new_dy = dx;
|
||||
dy = new_dy;
|
||||
dx = new_dx;
|
||||
}
|
||||
|
||||
std::vector<std::vector<int>> create_spiral(int n) {
|
||||
if (n < 1) {
|
||||
return {};
|
||||
}
|
||||
|
||||
auto result = std::vector<std::vector<int>>(
|
||||
static_cast<size_t>(n), std::vector<int>( static_cast<size_t>(n), 0 )
|
||||
);
|
||||
|
||||
int y = 0, x = 0;
|
||||
int dy = 0, dx = 1;
|
||||
for (int i = 1, max = n * n; i <= max; i++) {
|
||||
result[y][x] = i;
|
||||
|
||||
if (y + dy == n || y + dy < 0 || x + dx == n || x + dx < 0 || result[y + dy][x + dx] != 0) {
|
||||
next_diff(dy, dx);
|
||||
}
|
||||
|
||||
y += dy;
|
||||
x += dx;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
7
5kyu/the_hashtag_generator/solution.js
Normal file
7
5kyu/the_hashtag_generator/solution.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
function generateHashtag (str) {
|
||||
const result = str.split(/\s+/igm).reduce((accum, word) =>
|
||||
accum + word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase()
|
||||
, "#");
|
||||
|
||||
return (result.length > 140 || result == "#") ? false : result;
|
||||
}
|
71
5kyu/tic_tac_toe_checker/solution.js
Normal file
71
5kyu/tic_tac_toe_checker/solution.js
Normal file
|
@ -0,0 +1,71 @@
|
|||
function checkEmpty(board) {
|
||||
for (let i = 0; i < 3; i++) {
|
||||
for (let j = 0; j < 3; j++) {
|
||||
if (board[i][j] === 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkColumn(board, column) {
|
||||
for (let i = 1; i < 3; i++) {
|
||||
if (board[i - 1][column] !== board[i][column]) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return board[0][column];
|
||||
}
|
||||
|
||||
function checkRow(board, row) {
|
||||
for (let i = 1; i < 3; i++) {
|
||||
if (board[row][i - 1] !== board[row][i]) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return board[row][0];
|
||||
}
|
||||
|
||||
function checkDiagonal(board) {
|
||||
let leftToRight = true;
|
||||
let rightToLeft = true;
|
||||
for (let i = 1; i < 3; i++) {
|
||||
if (board[i - 1][i - 1] !== board[i][i]) {
|
||||
leftToRight = false;
|
||||
}
|
||||
if (board[i - 1][3 - i] !== board[i][2 - i]) {
|
||||
rightToLeft = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (leftToRight) {
|
||||
return board[0][0];
|
||||
} else if (rightToLeft) {
|
||||
return board[0][2];
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function isSolved(board) {
|
||||
for (let i = 0; i < 3; i++) {
|
||||
const col = checkColumn(board, i);
|
||||
const row = checkRow(board, i);
|
||||
if (col != 0) {
|
||||
return col;
|
||||
} else if (row != 0) {
|
||||
return row;
|
||||
}
|
||||
}
|
||||
|
||||
const diagonal = checkDiagonal(board);
|
||||
if (diagonal != 0) {
|
||||
return diagonal;
|
||||
}
|
||||
|
||||
if (checkEmpty(board)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
11
5kyu/valid_parentheses/solution.py
Normal file
11
5kyu/valid_parentheses/solution.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
def valid_parentheses(string):
|
||||
opened = 0
|
||||
|
||||
for letter in string:
|
||||
if letter == '(':
|
||||
opened += 1
|
||||
elif letter == ')':
|
||||
opened -= 1
|
||||
if opened < 0:
|
||||
return False
|
||||
return opened == 0
|
54
5kyu/vector_class/solution.js
Normal file
54
5kyu/vector_class/solution.js
Normal file
|
@ -0,0 +1,54 @@
|
|||
class Vector {
|
||||
constructor(array) {
|
||||
this.values = array.slice(0);
|
||||
}
|
||||
|
||||
mathOperation(vector, f) {
|
||||
if (!vector || !(vector instanceof Vector) || this.values.length !== vector.values.length) {
|
||||
throw "invalid operation";
|
||||
}
|
||||
|
||||
let result = [];
|
||||
for (let i = 0; i < this.values.length; i++) {
|
||||
result.push(f(this.values[i], vector.values[i]));
|
||||
}
|
||||
|
||||
return new Vector(result);
|
||||
}
|
||||
|
||||
add(vector) {
|
||||
return this.mathOperation(vector, (t, o) => t + o);
|
||||
}
|
||||
|
||||
subtract(vector) {
|
||||
return this.mathOperation(vector, (t, o) => t - o);
|
||||
}
|
||||
|
||||
dot(vector) {
|
||||
return this.mathOperation(vector, (t, o) => t * o)
|
||||
.values.reduce((t, e) => t + e, 0);
|
||||
}
|
||||
|
||||
norm() {
|
||||
return Math.sqrt(this.dot(this));
|
||||
}
|
||||
|
||||
toString() {
|
||||
return `(${this.values.join(',')})`;
|
||||
}
|
||||
|
||||
equals(other) {
|
||||
if (!other || !(other instanceof Vector) || this.values.length !== other.values.length) {
|
||||
return false;
|
||||
} else if (other === this) {
|
||||
return true;
|
||||
} else {
|
||||
for (let i = 0; i < this.values.length; i++) {
|
||||
if (this.values[i] !== other.values[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
22
5kyu/weight_for_weight/solution.py
Normal file
22
5kyu/weight_for_weight/solution.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
def digit_sum(n):
|
||||
total = 0
|
||||
while n > 0:
|
||||
total += n % 10
|
||||
n //= 10
|
||||
return total
|
||||
|
||||
class Weight:
|
||||
def __init__(self, weight):
|
||||
self.weight = weight
|
||||
self.digit_sum = digit_sum(weight)
|
||||
|
||||
def __lt__(self, other):
|
||||
if self.digit_sum == other.digit_sum:
|
||||
return str(self.weight) < str(other.weight)
|
||||
return self.digit_sum < other.digit_sum
|
||||
|
||||
def __str__(self):
|
||||
return str(self.weight)
|
||||
|
||||
def order_weight(strng):
|
||||
return ' '.join(map(lambda e: str(e), sorted(map(lambda e: Weight(int(e)), strng.split()))))
|
15
5kyu/where_my_anagrams_at/solution.js
Normal file
15
5kyu/where_my_anagrams_at/solution.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
function anagrams(word, words) {
|
||||
word = word.split('');
|
||||
word.sort();
|
||||
word = word.join('');
|
||||
|
||||
let result = [];
|
||||
for (let testedWord of words) {
|
||||
twSorted = testedWord.split('');
|
||||
twSorted.sort();
|
||||
if (word == twSorted.join(''))
|
||||
result.push(testedWord);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
24
5kyu/which_x_for_that_sum/solution.rs
Normal file
24
5kyu/which_x_for_that_sum/solution.rs
Normal file
|
@ -0,0 +1,24 @@
|
|||
fn solve_quadratic(a: f64, b: f64, c: f64) -> Option<(f64, f64)> {
|
||||
let d = b * b - 4.0 * a * c;
|
||||
|
||||
if d < 0.0 {
|
||||
None
|
||||
} else {
|
||||
Some(((-b + d.sqrt()) / (2.0 * a), (-b - d.sqrt()) / (2.0 * a)))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn solve(m: f64) -> f64 {
|
||||
match solve_quadratic(m, -2.0 * m - 1.0, m) {
|
||||
Some((left, right)) => {
|
||||
if left > 0.0 && left < 1.0 {
|
||||
left
|
||||
} else if right > 0.0 && right < 1.0 {
|
||||
right
|
||||
} else {
|
||||
0.0
|
||||
}
|
||||
}
|
||||
None => 0.0,
|
||||
}
|
||||
}
|
16
6kyu/are_they_the_same/solution.js
Normal file
16
6kyu/are_they_the_same/solution.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
function comp(array1, array2){
|
||||
let squares = [];
|
||||
for (let num of array1) {
|
||||
squares.push(num * num);
|
||||
}
|
||||
|
||||
if (!array2)
|
||||
return false;
|
||||
|
||||
for (let square of array2) {
|
||||
let index = squares.indexOf(square);
|
||||
if (index != -1) squares.splice(index, 1);
|
||||
}
|
||||
if (squares.length > 0) return false;
|
||||
else return true;
|
||||
}
|
12
6kyu/ball_upwards/solution.kt
Normal file
12
6kyu/ball_upwards/solution.kt
Normal file
|
@ -0,0 +1,12 @@
|
|||
package ball
|
||||
|
||||
val G = 9.81
|
||||
|
||||
fun maxBall(v0: Int): Int {
|
||||
val v = v0 * 5 / 18.0
|
||||
val maxT = v * 10 / G
|
||||
|
||||
return (0..maxT.toInt() + 1).maxBy {
|
||||
v * it / 10.0 - 0.5 * G * it * it / 100.0
|
||||
} ?: 0
|
||||
}
|
7
6kyu/bit_counting/solution.py
Normal file
7
6kyu/bit_counting/solution.py
Normal file
|
@ -0,0 +1,7 @@
|
|||
def countBits(n):
|
||||
count = 0
|
||||
while n > 0:
|
||||
if n % 2 == 1:
|
||||
count += 1
|
||||
n //= 2
|
||||
return count
|
9
6kyu/bouncing_balls/solution.py
Normal file
9
6kyu/bouncing_balls/solution.py
Normal file
|
@ -0,0 +1,9 @@
|
|||
def bouncingBall(h, bounce, window):
|
||||
if h <= 0 or (bounce <= 0 or bounce >= 1) or window >= h:
|
||||
return -1
|
||||
|
||||
result = -1
|
||||
while h > window:
|
||||
h *= bounce
|
||||
result += 2
|
||||
return result
|
25
6kyu/build_tower/solution.js
Normal file
25
6kyu/build_tower/solution.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
String.prototype.centerJustify = function(length, char) {
|
||||
let i = 0;
|
||||
let str = this;
|
||||
let toggle = true;
|
||||
while (i + this.length < length) {
|
||||
i++;
|
||||
if (toggle)
|
||||
str = str + char;
|
||||
else
|
||||
str = char + str;
|
||||
toggle = !toggle;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function towerBuilder(nFloors) {
|
||||
let floor = '*';
|
||||
const width = nFloors * 2 - 1;
|
||||
let result = [];
|
||||
for (let i = 0, count = 1; i < nFloors; i++, count += 2) {
|
||||
result.push(floor.centerJustify(width, ' '));
|
||||
floor += '**';
|
||||
}
|
||||
return result;
|
||||
}
|
30
6kyu/build_tower_advanced/solution.js
Normal file
30
6kyu/build_tower_advanced/solution.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
String.prototype.centerJustify = function(length, char) {
|
||||
let i = 0;
|
||||
let str = this;
|
||||
let toggle = true;
|
||||
while (i + this.length < length) {
|
||||
i++;
|
||||
if (toggle)
|
||||
str = str + char;
|
||||
else
|
||||
str = char + str;
|
||||
toggle = !toggle;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function towerBuilder(nFloors, nBlockSz) {
|
||||
let floor = '';
|
||||
for (let i = 0; i < nBlockSz[0]; i++)
|
||||
floor += '*';
|
||||
const width = nFloors * 2 * nBlockSz[0] - nBlockSz[0];
|
||||
let result = [];
|
||||
for (let i = 0, count = 1; i < nFloors; i++, count += 2) {
|
||||
for (let j = 0; j < nBlockSz[1]; j++) {
|
||||
result.push(floor.centerJustify(width, ' '));
|
||||
}
|
||||
for (let j = 0; j < nBlockSz[0]; j++)
|
||||
floor += '**';
|
||||
}
|
||||
return result;
|
||||
}
|
19
6kyu/camelcase_method/solution.rs
Normal file
19
6kyu/camelcase_method/solution.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
fn camel_case(str: &str) -> String {
|
||||
let mut result = String::from("");
|
||||
|
||||
let mut was_space: bool = true;
|
||||
for character in str.chars() {
|
||||
if character.is_whitespace() {
|
||||
was_space = true;
|
||||
} else if character.is_alphabetic() {
|
||||
if was_space {
|
||||
result += &character.to_uppercase().to_string();
|
||||
was_space = false;
|
||||
} else {
|
||||
result += &character.to_lowercase().to_string();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result.to_string()
|
||||
}
|
12
6kyu/cheat_or_you_shall_not_pass_easy/solution.c
Normal file
12
6kyu/cheat_or_you_shall_not_pass_easy/solution.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
int solution()
|
||||
{
|
||||
// return the right answer here
|
||||
srand(0);
|
||||
int a = 0;
|
||||
int b = 1000;
|
||||
int result = rand() % (b - a) + a;
|
||||
srand(0);
|
||||
return result;
|
||||
}
|
42
6kyu/consecutive_strings/solution.java
Normal file
42
6kyu/consecutive_strings/solution.java
Normal file
|
@ -0,0 +1,42 @@
|
|||
class LongestConsec {
|
||||
public static String longestConsec(String[] strarr, int k) {
|
||||
int n = strarr.length;
|
||||
|
||||
// handle limits
|
||||
if (n == 0 || k <= 0 || k > n) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// determine lengths
|
||||
int[] lengths = new int[n];
|
||||
for (int i = 0; i < n; i++) {
|
||||
lengths[i] = strarr[i].length();
|
||||
}
|
||||
|
||||
// calculate first index
|
||||
int maxIndex = 0, maxLength = 0;
|
||||
for (int i = 0; i < k; i++) {
|
||||
maxLength += lengths[i];
|
||||
}
|
||||
|
||||
// Check rest of the array
|
||||
int tmpLength = maxLength;
|
||||
for (int i = 1; i < n - k + 1; i++) {
|
||||
tmpLength += lengths[i + k - 1];
|
||||
tmpLength -= lengths[i - 1];
|
||||
|
||||
if (tmpLength > maxLength) {
|
||||
maxIndex = i;
|
||||
maxLength = tmpLength;
|
||||
}
|
||||
}
|
||||
|
||||
// Join the strings
|
||||
String result = "";
|
||||
for (int i = maxIndex; i < maxIndex + k; i++) {
|
||||
result += strarr[i];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
13
6kyu/convert_string_to_camel_case/solution.js
Normal file
13
6kyu/convert_string_to_camel_case/solution.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
function toCamelCase(str){
|
||||
if (str.indexOf('-') != -1) {
|
||||
str = str.split('-');
|
||||
} else {
|
||||
str = str.split('_');
|
||||
}
|
||||
|
||||
for (let i = 1; i < str.length; i++) {
|
||||
str[i] = str[i].charAt(0).toUpperCase() + str[i].substring(1);
|
||||
}
|
||||
|
||||
return str.join('');
|
||||
}
|
17
6kyu/count_the_smiley_faces/solution.cs
Normal file
17
6kyu/count_the_smiley_faces/solution.cs
Normal file
|
@ -0,0 +1,17 @@
|
|||
using System.Text.RegularExpressions;
|
||||
|
||||
public static class Kata
|
||||
{
|
||||
public static int CountSmileys(string[] smileys)
|
||||
{
|
||||
var count = 0;
|
||||
|
||||
var regex = new Regex(@"[:;][-~]?[D\)]");
|
||||
|
||||
foreach (string smiley in smileys) {
|
||||
if (regex.Match(smiley).Success) count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
}
|
24
6kyu/counting_duplicates/solution.rs
Normal file
24
6kyu/counting_duplicates/solution.rs
Normal file
|
@ -0,0 +1,24 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
fn count_duplicates(text: &str) -> u32 {
|
||||
let mut counts: HashMap<char, i32> = HashMap::new();
|
||||
|
||||
for character in text.to_lowercase().chars() {
|
||||
match counts.get_mut(&character) {
|
||||
None => {
|
||||
counts.insert(character, 1);
|
||||
{}
|
||||
},
|
||||
Some(x) => *x += 1
|
||||
}
|
||||
}
|
||||
|
||||
counts
|
||||
.iter()
|
||||
.fold(0, |total, (_, &count)|
|
||||
match count > 1 {
|
||||
true => total + 1,
|
||||
_ => total
|
||||
}
|
||||
)
|
||||
}
|
12
6kyu/create_phone_number/solution.js
Normal file
12
6kyu/create_phone_number/solution.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
function createPhoneNumber(numbers) {
|
||||
let result = '(';
|
||||
for (let i = 0; i < 10; i++) {
|
||||
result += numbers[i];
|
||||
if (i == 2) {
|
||||
result += ') ';
|
||||
} else if (i == 5) {
|
||||
result += '-';
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
18
6kyu/decode_the_morse_code/solution.rs
Normal file
18
6kyu/decode_the_morse_code/solution.rs
Normal file
|
@ -0,0 +1,18 @@
|
|||
mod preloaded;
|
||||
use preloaded::MORSE_CODE;
|
||||
// MORSE_CODE is `HashMap<String, String>`. e.g. ".-" -> "A".
|
||||
|
||||
fn decode_morse(encoded: &str) -> String {
|
||||
let mut result = String::new();
|
||||
|
||||
encoded.split(" ").map(|x| x.trim()).for_each(|x| {
|
||||
x.split_whitespace().for_each(|c| {
|
||||
result += MORSE_CODE.get(c).unwrap();
|
||||
});
|
||||
|
||||
result += " ";
|
||||
});
|
||||
|
||||
|
||||
String::from(result.trim())
|
||||
}
|
17
6kyu/delete_occurrences_if_occurs/solution.js
Normal file
17
6kyu/delete_occurrences_if_occurs/solution.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
function deleteNth(arr, n) {
|
||||
const freqs = {};
|
||||
const result = [];
|
||||
|
||||
for (const element of arr) {
|
||||
if (!freqs[element]) {
|
||||
freqs[element] = 1;
|
||||
} else if (freqs[element] < n) {
|
||||
freqs[element]++;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
result.push(element);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
36
6kyu/design_a_simple_automaton/solution.cpp
Normal file
36
6kyu/design_a_simple_automaton/solution.cpp
Normal file
|
@ -0,0 +1,36 @@
|
|||
#include <map>
|
||||
#include <set>
|
||||
|
||||
class Automaton
|
||||
{
|
||||
std::set<int> F{2};
|
||||
const int initial_state = 1;
|
||||
|
||||
std::map<int, std::map<char, int>> transitions{
|
||||
{1, std::map<char, int>{
|
||||
{'0', 1}, {'1', 2}
|
||||
}
|
||||
},
|
||||
{2, std::map<char, int>{
|
||||
{'0', 3}, {'1', 2}
|
||||
}
|
||||
},
|
||||
{3, std::map<char, int>{
|
||||
{'0', 2}, {'1', 2}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public:
|
||||
Automaton() {}
|
||||
|
||||
bool read_commands(const std::vector<char>& commands) {
|
||||
int state = initial_state;
|
||||
|
||||
for (const char c : commands) {
|
||||
state = transitions[state][c];
|
||||
}
|
||||
|
||||
return F.find(state) != F.end();
|
||||
}
|
||||
};
|
19
6kyu/does_my_number_look_big_in_this/solution.cs
Normal file
19
6kyu/does_my_number_look_big_in_this/solution.cs
Normal file
|
@ -0,0 +1,19 @@
|
|||
using System;
|
||||
|
||||
public class Kata {
|
||||
public static bool Narcissistic(int value) {
|
||||
var narcissistic = 0;
|
||||
var length = (int) Math.Log10(value + 0.5) + 1;
|
||||
var copyOfValue = value;
|
||||
|
||||
while (copyOfValue > 0) {
|
||||
narcissistic += (int) Math.Pow(copyOfValue % 10, length);
|
||||
copyOfValue /= 10;
|
||||
if (narcissistic > value) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return narcissistic == value;
|
||||
}
|
||||
}
|
15
6kyu/duplicate_encoder/solution.java
Normal file
15
6kyu/duplicate_encoder/solution.java
Normal file
|
@ -0,0 +1,15 @@
|
|||
public class DuplicateEncoder {
|
||||
static String encode(String word) {
|
||||
word = word.toLowerCase();
|
||||
String result = "";
|
||||
for (int i = 0; i < word.length(); i++) {
|
||||
char character = word.charAt(i);
|
||||
if (word.indexOf(character) != word.lastIndexOf(character)) {
|
||||
result += ")";
|
||||
} else {
|
||||
result += "(";
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
23
6kyu/equal_sides_of_an_array/solution.cs
Normal file
23
6kyu/equal_sides_of_an_array/solution.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
public class Kata
|
||||
{
|
||||
public static int SumOfTheArray(int[] arr)
|
||||
{
|
||||
int sum = 0;
|
||||
for (int i = 0, max = arr.Length; i < max; sum += arr[i++]);
|
||||
return sum;
|
||||
}
|
||||
public static int FindEvenIndex(int[] arr)
|
||||
{
|
||||
int left, right;
|
||||
left = 0;
|
||||
right = SumOfTheArray(arr) - arr[0];
|
||||
for (int i = 1, max = arr.Length; i < max; i++)
|
||||
{
|
||||
left += arr[i - 1];
|
||||
right -= arr[i];
|
||||
if (left == right) return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
17
6kyu/esolang_interpreters_i/solution.swift
Normal file
17
6kyu/esolang_interpreters_i/solution.swift
Normal file
|
@ -0,0 +1,17 @@
|
|||
func interpreter(_ prog: String) -> String {
|
||||
var cell = 0
|
||||
var result = ""
|
||||
|
||||
for i in prog {
|
||||
switch i {
|
||||
case "+":
|
||||
cell = (cell + 1) % 256
|
||||
case ".":
|
||||
result += String(Character(Unicode.Scalar(cell)!))
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
12
6kyu/evil_autocorrect_prank/solution.js
Normal file
12
6kyu/evil_autocorrect_prank/solution.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
const REGEX = new RegExp("(^|[^a-z]+)(u|you+)($|[^a-z]+)", "gi")
|
||||
|
||||
function autocorrect(input){
|
||||
var result = input;
|
||||
|
||||
do {
|
||||
input = result;
|
||||
result = result.replace(REGEX, "$1your sister$3");
|
||||
} while (result != input);
|
||||
|
||||
return result;
|
||||
}
|
19
6kyu/fat_fingers/solution.py
Normal file
19
6kyu/fat_fingers/solution.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
def fat_fingers(string):
|
||||
if string == "":
|
||||
return ""
|
||||
|
||||
result = ""
|
||||
caps = False
|
||||
|
||||
for letter in string[0:]:
|
||||
if letter == 'A' or letter == 'a':
|
||||
caps = not caps
|
||||
elif caps:
|
||||
if letter.isupper():
|
||||
result += letter.lower()
|
||||
else:
|
||||
result += letter.upper()
|
||||
else:
|
||||
result += letter
|
||||
|
||||
return result
|
12
6kyu/find_the_missing_letter/solution.java
Normal file
12
6kyu/find_the_missing_letter/solution.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
public class Kata {
|
||||
public static char findMissingLetter(char[] array) {
|
||||
int last = (int)array[0];
|
||||
for (int i = 1; i < array.length; i++)
|
||||
if ((int)array[i] != last + 1) {
|
||||
return (char) (last + 1);
|
||||
} else {
|
||||
last++;
|
||||
}
|
||||
return (char) -1;
|
||||
}
|
||||
}
|
17
6kyu/find_the_missing_term_in_arith_prog/solution.py
Normal file
17
6kyu/find_the_missing_term_in_arith_prog/solution.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
def find_missing(sequence):
|
||||
# Relation => a_n - a_(n-1) = d
|
||||
|
||||
diffs = []
|
||||
|
||||
for i in range(len(sequence) - 1):
|
||||
diffs.append(sequence[i + 1] - sequence[i])
|
||||
|
||||
max_diff = diffs[0]
|
||||
|
||||
for index, diff in enumerate(diffs[1:], 1):
|
||||
if abs(diff) > abs(max_diff):
|
||||
return sequence[index] + max_diff
|
||||
elif abs(max_diff) > abs(diff):
|
||||
return sequence[0] + diff
|
||||
|
||||
raise ValueError()
|
28
6kyu/find_the_odd_int/solution.cs
Normal file
28
6kyu/find_the_odd_int/solution.cs
Normal file
|
@ -0,0 +1,28 @@
|
|||
using System;
|
||||
|
||||
namespace Solution
|
||||
{
|
||||
class Kata
|
||||
{
|
||||
public static int find_it(int[] seq)
|
||||
{
|
||||
Array.Sort(seq);
|
||||
|
||||
int count = 1;
|
||||
|
||||
for (int i = 1; i < seq.Length; i++)
|
||||
{
|
||||
if (seq[i] == seq[i - 1]) count++;
|
||||
else
|
||||
{
|
||||
if (count % 2 == 1) return seq[i - 1];
|
||||
else count = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (count % 2 == 1) return seq[seq.Length - 1];
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
16
6kyu/find_the_unique_number/solution.py
Normal file
16
6kyu/find_the_unique_number/solution.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
def find_uniq(arr):
|
||||
a = arr[0]
|
||||
count_a = 1
|
||||
b = None
|
||||
count_b = 0
|
||||
|
||||
for e in arr[1:]:
|
||||
if e != a:
|
||||
count_b += 1
|
||||
b = e
|
||||
else:
|
||||
count_a += 1
|
||||
if count_a < count_b:
|
||||
return a
|
||||
else:
|
||||
return b
|
23
6kyu/give_me_a_diamond/solution.swift
Normal file
23
6kyu/give_me_a_diamond/solution.swift
Normal file
|
@ -0,0 +1,23 @@
|
|||
func diamond(_ size: Int) -> String? {
|
||||
if size < 0 || size % 2 == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
var result = ""
|
||||
var (count, diff) = (1, 2)
|
||||
|
||||
while count > 0 {
|
||||
print(count, diff)
|
||||
result += String(repeating: " ", count: (size - count) / 2)
|
||||
result += String(repeating: "*", count: count)
|
||||
result += "\n"
|
||||
|
||||
if count == size {
|
||||
diff = -2
|
||||
}
|
||||
|
||||
count += diff
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
27
6kyu/halloween_trick_or_treat/solution.js
Normal file
27
6kyu/halloween_trick_or_treat/solution.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
function trickOrTreat(children,candies){
|
||||
if (candies.length != children) {
|
||||
return "Trick or treat!";
|
||||
}
|
||||
|
||||
let lastCount = -1;
|
||||
for (let packet of candies) {
|
||||
let count = 0;
|
||||
for (let e of packet) {
|
||||
if (e == "bomb") {
|
||||
return "Trick or treat!";
|
||||
} else if (e == "candy") {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (lastCount == -1) {
|
||||
lastCount = count;
|
||||
}
|
||||
|
||||
if (count < 2 || lastCount != count) {
|
||||
return "Trick or treat!";
|
||||
}
|
||||
}
|
||||
|
||||
return "Thank you, strange uncle!";
|
||||
}
|
35
6kyu/help_the_bookseller/solution.rs
Normal file
35
6kyu/help_the_bookseller/solution.rs
Normal file
|
@ -0,0 +1,35 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
fn stock_list(list_art: Vec<&str>, list_cat: Vec<&str>) -> String {
|
||||
if list_art.is_empty() || list_cat.is_empty() {
|
||||
return "".to_string();
|
||||
}
|
||||
|
||||
let mut map: HashMap<&str, i32> = HashMap::new();
|
||||
|
||||
// Initialize with zero values
|
||||
for cat in &list_cat {
|
||||
map.insert(cat, 0);
|
||||
}
|
||||
|
||||
// Iterate through art
|
||||
for art in &list_art {
|
||||
for cat in &list_cat {
|
||||
if art.starts_with(cat) {
|
||||
let v: Vec<&str> = art.split_terminator(' ').collect();
|
||||
let count: i32 = v[1].parse().unwrap();
|
||||
map.insert(cat, map[cat] + count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get result string
|
||||
list_cat
|
||||
.iter()
|
||||
.map(
|
||||
|category| format!("({} : {})", category, map[category])
|
||||
)
|
||||
.collect::<Vec<String>>()
|
||||
.as_slice()
|
||||
.join(" - ")
|
||||
}
|
13
6kyu/highest_scoring_word/solution.py
Normal file
13
6kyu/highest_scoring_word/solution.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from functools import reduce
|
||||
|
||||
def high(x):
|
||||
x = x.split()
|
||||
h = reduce(lambda total, char: total + ord(char) - 96, x[0], 0)
|
||||
hw = x[0]
|
||||
|
||||
for word in x[1:]:
|
||||
total = reduce(lambda total, char: total + ord(char) - 96, word, 0)
|
||||
if total > h:
|
||||
h = total
|
||||
hw = word
|
||||
return hw
|
21
6kyu/ip_validation/solution.c
Normal file
21
6kyu/ip_validation/solution.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int is_valid_ip(const char * addr) {
|
||||
int seg[4];
|
||||
|
||||
if (sscanf(addr, "%d.%d.%d.%d", &seg[0], &seg[1], &seg[2], &seg[3]) != 4) return 0;
|
||||
|
||||
for (size_t i = 0; i < 4; i++) if (seg[i] <= 0 || seg[i] > 255) return 0;
|
||||
|
||||
int count = 0;
|
||||
|
||||
for (size_t i = 0; addr[i] != '\0'; i++)
|
||||
{
|
||||
if (addr[i] == '.') count++;
|
||||
if ((addr[i] == '.' && addr[i + 1] == '0') || addr[i] == ' ') return 0;
|
||||
}
|
||||
|
||||
if (count != 3) return 0;
|
||||
|
||||
return 1;
|
||||
}
|
28
6kyu/irreducible_sum_of_rationals/solution.rs
Normal file
28
6kyu/irreducible_sum_of_rationals/solution.rs
Normal file
|
@ -0,0 +1,28 @@
|
|||
fn gcd(mut a: i64, mut b: i64) -> i64 {
|
||||
while b != 0 {
|
||||
let t = b;
|
||||
b = a % b;
|
||||
a = t;
|
||||
}
|
||||
|
||||
a
|
||||
}
|
||||
|
||||
fn lcm(a: i64, b: i64) -> i64 {
|
||||
(a*b).abs() / gcd(a, b)
|
||||
}
|
||||
|
||||
fn sum_fracts(l: Vec<(i64, i64)>) -> Option<(i64, i64)> {
|
||||
if l.is_empty() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let denom = l.iter().fold(1, |a, b| lcm(a, b.1));
|
||||
|
||||
let (num, den) = l.iter().fold((0, denom), |runner, frac|
|
||||
(runner.0 + (frac.0 * denom / frac.1), denom)
|
||||
);
|
||||
|
||||
let divisor = gcd(num, den);
|
||||
Some((num / divisor, den / divisor))
|
||||
}
|
16
6kyu/is_a_number_prime/solution.py
Normal file
16
6kyu/is_a_number_prime/solution.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
import math
|
||||
|
||||
def is_prime(num):
|
||||
if num <= 1:
|
||||
return False
|
||||
elif num == 2:
|
||||
return True
|
||||
elif num % 2 == 0:
|
||||
return False
|
||||
|
||||
bound = int(math.ceil(math.sqrt(num)))
|
||||
|
||||
for div in range(3, bound + 1, 2):
|
||||
if num % div == 0:
|
||||
return False
|
||||
return True
|
21
6kyu/length_of_missing_array/solution.cs
Normal file
21
6kyu/length_of_missing_array/solution.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class Kata {
|
||||
public static int GetLengthOfMissingArray(object[][] arrayOfArrays) {
|
||||
if (arrayOfArrays == null || arrayOfArrays.GetLength(0) < 2) return 0;
|
||||
var lengths = new HashSet<int>();
|
||||
|
||||
foreach (var array in arrayOfArrays) {
|
||||
if (array == null) return 0;
|
||||
var size = array.GetLength(0);
|
||||
if (size == 0) return 0;
|
||||
else lengths.Add(size);
|
||||
}
|
||||
|
||||
var max = lengths.Max();
|
||||
var min = lengths.Min();
|
||||
|
||||
return (int) (0.5 * (arrayOfArrays.GetLength(0) + 1) * (max + min) - lengths.Sum());
|
||||
}
|
||||
}
|
28
6kyu/linked_lists_length_count/solution.cpp
Normal file
28
6kyu/linked_lists_length_count/solution.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* Node Definition
|
||||
struct Node {
|
||||
Node * next;
|
||||
int data;
|
||||
}
|
||||
*/
|
||||
|
||||
int Length(Node *head)
|
||||
{
|
||||
int count = 0;
|
||||
while (head != NULL) {
|
||||
count++;
|
||||
head = head->next;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int Count(Node *head, int data)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
while (head != NULL) {
|
||||
if (head->data == data) count++;
|
||||
head = head->next;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
55
6kyu/lotto_6_aus_49/solution.cs
Normal file
55
6kyu/lotto_6_aus_49/solution.cs
Normal file
|
@ -0,0 +1,55 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
|
||||
public class LOTTO {
|
||||
private static Random r = new Random();
|
||||
|
||||
public static int[] NumberGenerator() {
|
||||
var result = new int[7];
|
||||
result[6] = 50;
|
||||
|
||||
for (var i = 0; i < 6; i++) {
|
||||
var number = 0;
|
||||
do {
|
||||
number = r.Next(1, 50);
|
||||
} while (result.Contains(number));
|
||||
result[i] = number;
|
||||
}
|
||||
Array.Sort(result);
|
||||
result[6] = r.Next(0, 10);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static int CheckForWinningCategory(int[] checkCombination, int[] winningCombination) {
|
||||
var count = 0;
|
||||
var superzahl = checkCombination.Last() == winningCombination.Last();
|
||||
|
||||
for (var i = 0; i < 6; i++) {
|
||||
var index = Array.IndexOf(checkCombination, winningCombination[i]);
|
||||
if (index != -1 && index != 6) count++;
|
||||
}
|
||||
|
||||
var result = -1;
|
||||
|
||||
switch (count) {
|
||||
case 6:
|
||||
result = 2;
|
||||
break;
|
||||
case 5:
|
||||
result = 4;
|
||||
break;
|
||||
case 4:
|
||||
result = 6;
|
||||
break;
|
||||
case 3:
|
||||
result = 8;
|
||||
break;
|
||||
}
|
||||
|
||||
if (count == 2 && superzahl) result = 9;
|
||||
else if (superzahl && result != -1) result--;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
10
6kyu/make_the_deadfish_swim/solution.hs
Normal file
10
6kyu/make_the_deadfish_swim/solution.hs
Normal file
|
@ -0,0 +1,10 @@
|
|||
module Kata.Deadfish (parse) where
|
||||
|
||||
parse :: String -> [Int]
|
||||
parse = snd . foldl exec (0, [])
|
||||
where exec (value, output) cmd = case cmd of
|
||||
'i' -> (value + 1, output)
|
||||
'd' -> (value - 1, output)
|
||||
's' -> (value * value, output)
|
||||
'o' -> (value, output ++ [value])
|
||||
_ -> (value, output)
|
7
6kyu/multiples_of_3_or_5/solution.hs
Normal file
7
6kyu/multiples_of_3_or_5/solution.hs
Normal file
|
@ -0,0 +1,7 @@
|
|||
module MultiplesOf3And5 where
|
||||
|
||||
sumOfMultiples :: Integer -> Integer -> Integer
|
||||
sumOfMultiples n upTo = div ((div (upTo - 1) n) * (n + (upTo - 1 - mod (upTo - 1) n))) 2
|
||||
|
||||
solution :: Integer -> Integer
|
||||
solution number = sumOfMultiples 3 number + sumOfMultiples 5 number - sumOfMultiples 15 number
|
16
6kyu/multiplication_table/solution.go
Normal file
16
6kyu/multiplication_table/solution.go
Normal file
|
@ -0,0 +1,16 @@
|
|||
package multiplicationtable
|
||||
|
||||
func MultiplicationTable(size int) [][]int {
|
||||
result := make([][]int, size);
|
||||
for i := 0; i < size; i++ {
|
||||
result[i] = make([]int, size);
|
||||
}
|
||||
|
||||
for i := 0; i < size; i++ {
|
||||
for j := 0; j < size; j++ {
|
||||
result[i][j] = (i + 1) * (j + 1);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
20
6kyu/parabolic_arc_length/solution.rs
Normal file
20
6kyu/parabolic_arc_length/solution.rs
Normal file
|
@ -0,0 +1,20 @@
|
|||
fn len_curve_of<F>(f: F, from: f64, to: f64, n: i32) -> f64
|
||||
where
|
||||
F: Fn(f64) -> f64,
|
||||
{
|
||||
let dx = (to - from) / n as f64;
|
||||
let dx2 = dx * dx;
|
||||
|
||||
(0..n)
|
||||
.map(|i| {
|
||||
let left = f(from + i as f64 * dx);
|
||||
let right = f(from + (i + 1) as f64 * dx);
|
||||
|
||||
(dx2 + (left - right).abs().powf(2.0)).sqrt()
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
|
||||
pub fn len_curve(n: i32) -> f64 {
|
||||
len_curve_of(|x| x * x, 0.0, 1.0, n)
|
||||
}
|
7
6kyu/pascals_triangle/solution.hs
Normal file
7
6kyu/pascals_triangle/solution.hs
Normal file
|
@ -0,0 +1,7 @@
|
|||
module Codewars.Kata.PascalsTriangle where
|
||||
|
||||
pascalsRow :: Int -> [Int]
|
||||
pascalsRow n = scanl (\nCk k -> (nCk * (n - k)) `div` (k + 1)) 1 [0..n - 1]
|
||||
|
||||
pascalsTriangle :: Int -> [Int]
|
||||
pascalsTriangle n = concatMap pascalsRow [0..n - 1]
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue