<?php $num = "011223333"; $res = preg_replace_callback( '/(\d)\1*/', fn($match) => strlen($match[0]) . $match[0][0], $num ); var_dump($res); //102243
Author: vdonchev
Look and Say Sequence in PHP
<?php echo implode("<br>", lookAndSay(0, 5)); function lookAndSay(string $num, int $count): array { $results = [$num]; for ($i = 0; $i < $count; $i++) { preg_match_all('/(\d)\1*/', $num, $matches); $num = implode('', array_map(function ($item) { return strlen($item) . $item[0]; }, $matches[0])); $results[] = $num; } return $results; }
Look and Say Sequence Generator – Javascript (ECMAscript 6)
function* lookAndSay(num) { num += ''; while (num = generateNextNode(num)) { yield num; } function generateNextNode(num) { let res = ''; for (let i = 0; i < num.length; i++) { let current = num[i]; let currentCount = 1; for (let innerIndex = i + 1; innerIndex < num.length; innerIndex++) { let next = num[innerIndex]; if (current === next) { currentCount++; } else { i = innerIndex - 1; break; } i = innerIndex; } res += `${currentCount}${current}`; } return res; } } // Example let lookSequence = lookAndSay(0); console.log(lookSequence.next().value); console.log(lookSequence.next().value); console.log(lookSequence.next().value); console.log(lookSequence.next().value); console.log(lookSequence.next().value);
Shortest Path In Graph – Dijkstra’s Algorithm – C# Implementation
using System; using System.Collections.Generic; using System.Linq; public static class DijkstraWithoutQueue { public static List<int> DijkstraAlgorithm(int[,] graph, int sourceNode, int destinationNode) { var n = graph.GetLength(0); var distance = new int[n]; for (int i = 0; i < n; i++) { distance[i] = int.MaxValue; } distance[sourceNode] = 0; var used = new bool[n]; var previous = new int?[n]; while (true) { var minDistance = int.MaxValue; var minNode = 0; for (int i = 0; i < n; i++) { if (!used[i] && minDistance > distance[i]) { minDistance = distance[i]; minNode = i; } } if (minDistance == int.MaxValue) { break; } used[minNode] = true; for (int i = 0; i < n; i++) { if (graph[minNode, i] > 0) { var shortestToMinNode = distance[minNode]; var distanceToNextNode = graph[minNode, i]; var totalDistance = shortestToMinNode + distanceToNextNode; if (totalDistance < distance[i]) { distance[i] = totalDistance; previous[i] = minNode; } } } } if (distance[destinationNode] == int.MaxValue) { return null; } var path = new LinkedList<int>(); int? currentNode = destinationNode; while (currentNode != null) { path.AddFirst(currentNode.Value); currentNode = previous[currentNode.Value]; } return path.ToList(); } public static void Main() { var graph = new[,] { // 0 1 2 3 4 5 6 7 8 9 10 11 { 0, 0, 0, 0, 0, 0, 10, 0, 12, 0, 0, 0 }, // 0 { 0, 0, 0, 0, 20, 0, 0, 26, 0, 5, 0, 6 }, // 1 { 0, 0, 0, 0, 0, 0, 0, 15, 14, 0, 0, 9 }, // 2 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0 }, // 3 { 0, 20, 0, 0, 0, 5, 17, 0, 0, 0, 0, 11 }, // 4 { 0, 0, 0, 0, 5, 0, 6, 0, 3, 0, 0, 33 }, // 5 {10, 0, 0, 0, 17, 6, 0, 0, 0, 0, 0, 0 }, // 6 { 0, 26, 15, 0, 0, 0, 0, 0, 0, 3, 0, 20 }, // 7 {12, 0, 14, 0, 0, 3, 0, 0, 0, 0, 0, 0 }, // 8 { 0, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0 }, // 9 { 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, // 10 { 0, 6, 9, 0, 11, 33, 0, 20, 0, 0, 0, 0 }, // 11 }; PrintPath(graph, 0, 9); PrintPath(graph, 0, 2); PrintPath(graph, 0, 10); PrintPath(graph, 0, 11); PrintPath(graph, 0, 1); } public static void PrintPath(int[,] graph, int sourceNode, int destinationNode) { Console.Write( "Shortest path [{0} -> {1}]: ", sourceNode, destinationNode); var path = DijkstraWithoutQueue.DijkstraAlgorithm(graph, sourceNode, destinationNode); if (path == null) { Console.WriteLine("no path"); } else { int pathLength = 0; for (int i = 0; i < path.Count - 1; i++) { pathLength += graph[path[i], path[i + 1]]; } var formattedPath = string.Join("->", path); Console.WriteLine("{0} (length {1})", formattedPath, pathLength); } } }
Minimum Spanning Tree – Kruskal Algorithm – C# Implementation
using System.Collections.Generic; using System.Linq; public static class KruskalAlgorithm { public static List<Edge> Kruskal(int numberOfVertices, List<Edge> edges) { // Inital sort edges.Sort(); // Set parents table var parent = Enumerable.Range(0, numberOfVertices).ToArray(); // Spanning tree list var spanningTree = new List<Edge>(); foreach (var edge in edges) { var startNodeRoot = FindRoot(edge.StartNode, parent); var endNodeRoot = FindRoot(edge.EndNode, parent); if (startNodeRoot != endNodeRoot) { // Add edge to the spanning tree spanningTree.Add(edge); // Mark one root as parent of the other parent[endNodeRoot] = startNodeRoot; } } // Return the spanning tree return spanningTree; } private static int FindRoot(int node, int[] parent) { var root = node; while (root != parent[root]) { root = parent[root]; } while (node != root) { var oldParent = parent[node]; parent[node] = root; node = oldParent; } return root; } }
How to generate Variations with repetition interatively in C#
// (red, red) // (red, green) // (red, blue) // (green, red) // (green, green) // (green, blue) // (blue, red) // (blue, green) // (blue, blue) using System; using System.Linq; public static class Program { private static readonly string[] Fruits = { "red", "green", "blue"}; public static void Main() { var k = 2; var n = 3; var arr = new int[k]; while (true) { Console.WriteLine($"({string.Join(", ", arr.Select(e => Fruits[e]))})"); var index = k - 1; while (index >= 0 && arr[index] == n - 1) { index--; } if (index < 0) { break; } arr[index]++; for (int i = index + 1; i < k; i++) { arr[i] = 0; } } } }
How to generate Combinations without repetition interatively in C#
// n = 5 // k = 3 // 1, 2, 3 // 1, 2, 4 // 1, 2, 5 // 1, 3, 4 // 1, 3, 5 // 1, 4, 5 // 2, 3, 4 // 2, 3, 5 // 2, 4, 5 // 3, 4, 5 using System; using System.Collections.Generic; public static class GenerateCombinationsIteratively { static void Main() { Console.Write("n = "); var n = int.Parse(Console.ReadLine()); Console.Write("k = "); var k = int.Parse(Console.ReadLine()); foreach (var combo in Combinations(k, n)) { Console.WriteLine(string.Join(", ", combo)); } } private static IEnumerable<int[]> Combinations(int k, int n) { var result = new int[k]; var stack = new Stack<int>(); stack.Push(1); while (stack.Count > 0) { var index = stack.Count - 1; var value = stack.Pop(); while (value <= n) { result[index++] = value++; stack.Push(value); if (index == k) { yield return result; break; } } } } }
How to generate Permutations without repetition iteratively in C#
// 1, 2, 3 // 2, 1, 3 // 3, 1, 2 // 1, 3, 2 // 2, 3, 1 // 3, 2, 1 // Total permutations: 6 using System; using System.Linq; public static class GeneratePermutationsIteratively { public static void Main() { var num = int.Parse(Console.ReadLine()); var numberOfPerm = 1; var elements = Enumerable.Range(1, num).ToArray(); var workArr = Enumerable.Range(0, elements.Length + 1).ToArray(); PrintPerm(elements); var index = 1; while (index < elements.Length) { workArr[index]--; var j = 0; if (index % 2 == 1) { j = workArr[index]; } SwapInts(ref elements[j], ref elements[index]); index = 1; while (workArr[index] == 0) { workArr[index] = index; index++; } numberOfPerm++; PrintPerm(elements); } Console.WriteLine($"Total permutations: {numberOfPerm}"); } private static void PrintPerm(int[] elements) { Console.WriteLine(string.Join(", ", elements)); } private static void SwapInts(ref int a, ref int b) { a ^= b; b ^= a; a ^= b; } }
How to generate Permutations with repetition recursively in C#
// 1: [6, 1, 1, 1, 1, 1, 1, 1, 1] // 2: [1, 6, 1, 1, 1, 1, 1, 1, 1] // 3: [1, 1, 6, 1, 1, 1, 1, 1, 1] // 4: [1, 1, 1, 6, 1, 1, 1, 1, 1] // 5: [1, 1, 1, 1, 6, 1, 1, 1, 1] // 6: [1, 1, 1, 1, 1, 6, 1, 1, 1] // 7: [1, 1, 1, 1, 1, 1, 6, 1, 1] // 8: [1, 1, 1, 1, 1, 1, 1, 6, 1] // 9: [1, 1, 1, 1, 1, 1, 1, 1, 6] using System; public static class PermutationsWithRep { private static int numberOfCombos; public static void Main() { var collection = new[] { 6, 1, 1, 1, 1, 1, 1, 1, 1 }; PermuteRep(collection); } private static void PermuteRep<T>(T[] workArray, int? end = null, int start = 0) where T : IComparable<T> { if (end == null) { end = workArray.Length - 1; } PrintPerm(workArray); for (int left = end.Value - 1; left >= start; left--) { for (int right = left + 1; right <= end; right++) if (workArray[left].CompareTo(workArray[right]) != 0) { Swap(ref workArray[left], ref workArray[right]); PermuteRep(workArray, end, left + 1); } var firstElement = workArray[left]; for (int i = left; i <= end.Value - 1; i++) { workArray[i] = workArray[i + 1]; } workArray[end.Value] = firstElement; } } private static void Swap<T>(ref T a, ref T b) { var temp = a; a = b; b = temp; } private static void PrintPerm<T>(T[] arr) { Console.WriteLine($"{++numberOfCombos}: [{string.Join(", ", arr)}]"); } }
How to swap 2 integers without temp variable using XOR
using System; public static class SwapTwoIntegers { private static void Main() { var a = 55; var b = 69; SwapInts(ref a, ref b); Console.WriteLine(a); // 69 Console.WriteLine(b); // 55 } private static void SwapInts(ref int a, ref int b) { a ^= b; b ^= a; a ^= b; } }