Advertisement
Pearlfromsu

combs

Jun 8th, 2023
907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.61 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. namespace CombConsole {
  5.     public class Comb {
  6.         public static IEnumerable<List<T>> SubSetsGeneration<T>(T[] input) {
  7.             var resList = new List<List<T>>();
  8.             int n = input.Length;
  9.             int[] a = new int[n + 1];
  10.             while (a[n] != 1) {
  11.                 var list = new List<T>();
  12.                 for (int i = 0; i < n; i++)
  13.                     if (a[i] == 1)
  14.                         list.Add(input[i]);
  15.                 resList.Add(list);
  16.                 int j = 0;
  17.                 while (a[j] == 1) {
  18.                     a[j] = 0;
  19.                     j++;
  20.                 }
  21.                 a[j] = 1;
  22.             }
  23.             return resList;
  24.         }
  25.         public static IEnumerable<List<T>> RepetitionPlacing<T>(T[] input, int k) {
  26.             var resList = new List<List<T>>();
  27.             int n = input.Length;
  28.             int[] b = new int[k];
  29.             while (b[k - 1] != n - 1) {
  30.                 var list = new List<T>();
  31.                 for (int i = 0; i < k; i++)
  32.                     list.Add(input[b[i]]);
  33.                 resList.Add(list);
  34.                 int j = 0;
  35.                 while (b[j] == n - 1) {
  36.                     b[j] = 0;
  37.                     j++;
  38.                 }
  39.                 b[j]++;
  40.             }
  41.             return resList;
  42.         }
  43.         public static IEnumerable<List<T>> Combinations<T>(T[] input, int k) {
  44.             var resList = new List<List<T>>();
  45.             int n = input.Length;
  46.             int[] b = new int[k];
  47.             for (int i = 0; i < k; i++)
  48.                 b[i] = i;
  49.             int ii = 0;
  50.             while (ii != -1) {
  51.                 var list = new List<T>();
  52.                 for (int i = 0; i < k; i++)
  53.                     list.Add(input[b[i]]);
  54.                 resList.Add(list);
  55.                 int mx = n - 1;
  56.                 ii = k - 1;
  57.                 for (; ii >= 0; ii--) {
  58.                     if (b[ii] < mx) {
  59.                         b[ii]++;
  60.                         for (int j = ii + 1; j < k; j++)
  61.                             b[j] = b[j - 1] + 1;
  62.                         break;
  63.                     }
  64.                     mx = b[ii] - 1;
  65.                 }
  66.             }
  67.             return resList;
  68.         }
  69.         public static IEnumerable<List<T>> Permutations<T>(T[] input) {
  70.             var reslist = new List<List<T>>();
  71.             int n = input.Length;
  72.             int[] a = new int[n];
  73.             var list = new List<T>();
  74.             for (int i = 0; i<n; i++) {
  75.                 a[i] = i;
  76.                 list.Add(input[a[i]]);
  77.             }
  78.             reslist.Add(list);
  79.             bool bFound = true;
  80.             while (bFound == true) {
  81.                 bFound = false;
  82.                 for (int i = n - 2; i >= 0; i--) {
  83.                     var curlist = new List<T>();
  84.                     if (a[i] < a[i + 1]) { //ищем a[i] такой, что он меньше a[i+1]
  85.                         bFound = true;
  86.                         int t = n + 1;  //большое число для поиска минимума
  87.                         int jnumb = -1; //номер для запоминания минимума
  88.                         for (int j = i + 1; j < n; j++) //в хвосте последовательности (начиная с i+1) ищем минимальный элемент больший a[i]
  89.                             if (a[j] > a[i])   //если нашли число большее a[i]
  90.                                 if (a[j] < t) { //проверяем что оно меньше чем уже найденное
  91.                                     t = a[j];
  92.                                     jnumb = j;
  93.                                 }
  94.                         if (jnumb != -1) {    //если нашли такое число, то меняем местами a[i] и a[jnumb]
  95.                             int temp = a[i];
  96.                             a[i] = a[jnumb];
  97.                             a[jnumb] = temp;
  98.                         }
  99.                         //сортируем хвост последовательности (начиная с i+1)
  100.                         Array.Sort(a, i+1, n - i - 1);
  101.                         for (int k = 0; k<n; k++)
  102.                             curlist.Add(input[a[k]]);
  103.                         reslist.Add(curlist);
  104.                         break;
  105.                     }
  106.                 }
  107.             }
  108.             return reslist;
  109.         }
  110.     }
  111.     class Program
  112.     {
  113.         static void Main(string[] args)
  114.         {
  115.             //Comb cb = new Comb();
  116.             /*for (double mx = 1.0; mx <= 100; mx++)
  117.             {
  118.                 double pro = 1;
  119.                 for (double i = 1.0; i <= mx; i += 1.0)
  120.                     pro *= (1.0 - (i / 365.0));
  121.                 Console.WriteLine($"{mx}: {1-pro}");
  122.  
  123.             }*/
  124.             /*int i = 0;
  125.             foreach(var item in Comb.SubSetsGeneration(new int[] { 1, 2, 3, 4, 5}))
  126.                 Console.WriteLine("{0}: {1}", ++i, String.Join(", ", item));
  127.             */
  128.             /*int j = 0;
  129.             foreach (var item in Comb.RepetitionPlacing(new int[] { 1, 2, 3, 4, 5 }, 2).OrderBy(el => el.Count()))
  130.                 Console.WriteLine("{0}: {1}", ++j, String.Join(", ", item));*/
  131.  
  132.             int k = 0;
  133.             foreach (var item in Comb.Permutations(new int[] { 1, 2, 3, 4, 5 }).OrderBy(el => el.Count()))
  134.                 Console.WriteLine("{0}: {1}", ++k, String.Join(", ", item));
  135.  
  136.  
  137.             //Console.WriteLine(cb.ToString());
  138.         }
  139.     }
  140. }
  141.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement