Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
jan.pichl
Člen
Avatar
jan.pichl:7.3.2016 14:44

Ahoj,
potřeboval bych poradit s algoritmem, který mě z řady čísel vytvoří jinou řadu čísel tak, aby v té nové řadě nešlo poznat že se jedná o řadu. A zároveň bylo možné vypočítat opět tu původní řadu.
Jde mě o to, očíslovat si objekty které posílám na tiskárnu. Každý další má pořadové číslo o jedna větší a na tiskárně se místo pořadového čísla vytiskne cosi jako PIN na základě kterého já budu schopen identifikovat původní objekt.

Řekněme že řada čísel bude od 1 do 999.

např:
řada <-> pin

001 <-> 526
002 <-> 812
003 <-> 054
004 <-> 170
005 <-> 005
..
050 <-> 125
526 <-> 080
999 <-> 015

Předem děkuji za rady.

Honza

 
Odpovědět
7.3.2016 14:44
Avatar
Odpovídá na jan.pichl
Neaktivní uživatel:7.3.2016 17:05

Pokud nepotřebuješ na výstupu taky tříciferné číslo, tak můžeš zkusit XOR.

const int XOR = 101;
static int ToX(int i) => i ^ XOR;
static int FromX(int x) => x ^ XOR;

Myslím, že by to mohlo fungovat. Místo 101 můžeš zkusit dát jiné číslo.

Ukázka:

895 -> 785 -> 895
896 -> 1006 -> 896
897 -> 1007 -> 897
898 -> 1004 -> 898
899 -> 1005 -> 899
900 -> 1002 -> 900
901 -> 1003 -> 901
902 -> 1000 -> 902
903 -> 1001 -> 903
904 -> 998 -> 904
905 -> 999 -> 905
906 -> 996 -> 906
907 -> 997 -> 907
908 -> 994 -> 908
909 -> 995 -> 909
910 -> 992 -> 910
911 -> 993 -> 911
912 -> 1022 -> 912
913 -> 1023 -> 913
914 -> 1020 -> 914
915 -> 1021 -> 915
916 -> 1018 -> 916
917 -> 1019 -> 917
918 -> 1016 -> 918
919 -> 1017 -> 919
920 -> 1014 -> 920
921 -> 1015 -> 921
922 -> 1012 -> 922
923 -> 1013 -> 923
924 -> 1010 -> 924
925 -> 1011 -> 925
926 -> 1008 -> 926
927 -> 1009 -> 927
928 -> 974 -> 928
929 -> 975 -> 929
Editováno 7.3.2016 17:08
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
7.3.2016 17:05
Neaktivní uživatelský účet
Avatar
jan.pichl
Člen
Avatar
Odpovídá na Neaktivní uživatel
jan.pichl:9.3.2016 4:27

Díky za řešení s XOR. Je zajímavé, ale potřeboval bych to mít více z přeházené. Pořád je to více méně řada :(

 
Nahoru Odpovědět
9.3.2016 4:27
Avatar
Odpovídá na jan.pichl
Michal Štěpánek:9.3.2016 7:42

Možná jsem na jiný sjezdovce, ale napadlo mě, co třeba zkusit k tomu původnímu číslu něco přičíst (popř. ještě i něco odečíst) a ve výsledku pak zobrazit číslice v obráceném pořadí?

Nahoru Odpovědět
9.3.2016 7:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na jan.pichl
Neaktivní uživatel:9.3.2016 12:55

Generování dat se může dost prodloužit, když zvětšíš max...

class Program
{
    const int seed = 42;
    const int min = 1;
    const int max = 999;
    static Dictionary<int, int> data;

    static int ToX(int i) => data.First(d => d.Value == i).Key;

    static int FromX(int x) => data[x];

    static void Main(string[] args)
    {
        var random = new Random(seed);
        data = new Dictionary<int, int>();
        for (int i = min; i < max + 1; i++)
        {
            while (true)
            {
                var x = random.Next(min, max + 1);
                if (!data.ContainsKey(x))
                {
                    data[x] = i;
                    break;
                }
            }
        }

        for (int i = min; i < max + 1; i++)
        {
            var x = ToX(i);
            var j = FromX(x);

            Console.WriteLine($"{i,4} -> {x,4} -> {j,4}");

        }
    }
}
Editováno 9.3.2016 12:58
Nahoru Odpovědět
9.3.2016 12:55
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:9.3.2016 16:30

Teď jsem si uvědomil, že je to docela neefektivní. Ale aspoň nějaká myšlenka se z toho dá vzít a můžeš to zkusit napsat líp..

Nahoru Odpovědět
9.3.2016 16:30
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.