Diskuze: Transformace řady čísel

C# .NET .NET (C# a Visual Basic) Transformace řady čísel American English version English version

Avatar
jan.pichl
Člen
Avatar
jan.pichl:

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. března 14:44
Avatar
Posix
Člen
Avatar
Odpovídá na jan.pichl
Posix:

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. března 17:08
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 7. března 17:05
Proč to dělat jednoduše, když to jde složitě.
Avatar
jan.pichl
Člen
Avatar
Odpovídá na Posix
jan.pichl:

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. března 4:27
Avatar
Odpovídá na jan.pichl
Michal Štěpánek:

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. března 7:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Posix
Člen
Avatar
Odpovídá na jan.pichl
Posix:

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. března 12:58
Nahoru Odpovědět 9. března 12:55
Proč to dělat jednoduše, když to jde složitě.
Avatar
Posix
Člen
Avatar
Posix:

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. března 16:30
Proč to dělat jednoduše, když to jde složitě.
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.