Dwa splecione łańcuchy

9

W tym pytaniu zdefiniowałem funkcję „łańcucha” jako funkcję, która:

  • jest permutacją, co oznacza, że ​​każda wartość jest odwzorowywana na i jest odwzorowywana przez dokładnie jedną wartość.

  • i pozwala na uzyskanie dowolnej wartości z dowolnej innej wartości przez wielokrotne zastosowanie funkcji lub jej odwrotności.

Jest wiele funkcji, które to robią, a niektóre z nich są dość proste (zobacz odpowiedzi na to pytanie). Teraz zdefiniujemy osobną klasę funkcji, które zamierzam nazwać funkcjami „przeplatanymi”. Przeplatanego funkcja jest funkcją na zbiorze A , który zawiera dwie przegrody nieskończone 0 i 1 tak, że funkcja jest funkcją zarówno łańcuch a 0 a a 1 .

Oznacza to, że ma wartość w 0 można odwzorować na wartości o 1 za pomocą funkcji lub vice versa.

Zadanie

Twoim zadaniem jest napisanie kodu, który wykonuje lub definiuje funkcję przeplataną na dodatnich liczbach całkowitych. Twoja funkcja może być dowolna, o ile spełnia kryteria przeplatania się. Powinieneś dołączyć wyjaśnienie, dlaczego twoja funkcja jest wpleciona w odpowiedź.

To jest pytanie, więc odpowiedzi będą oceniane w bajtach, przy czym mniej bajtów jest lepszych.

Ad Hoc Garf Hunter
źródło
@flawr Thanks! Szukałem tego słowa, ale nie mogłem o tym myśleć.
Ad Hoc Garf Hunter
Myślę, że można to uznać za duplikat ostatniego wyzwania, które połączyłeś, ponieważ musisz tylko dokonać dodatkowej transfromacji, tj. Osobno wyliczyć wszystkie liczby parzyste i nieparzyste. Nie sądzę, że żadna z odpowiedzi, które tu otrzymasz, dostarczy czegoś zasadniczo nowego.
flawr
@flawr Możesz to zrobić, ale nie byłby to najlepszy sposób. Zrobiłem z tym małe eksperymenty i istnieje kilka nowatorskich sposobów wykonywania tego typu funkcji.
Ad Hoc Garf Hunter

Odpowiedzi:

2

Python, 46 42 37 bajtów

5 bajtów zapisanych dzięki @notjagan

lambda x:1<x<4and x*2%5or x-(x&2)*4+4

Wypróbuj online!

Iteruje liczby parzyste i nieparzyste ze skokiem 4 i łączy na 2 i 3:

=> 22 => 18 => 14 => 10 => 6 => 2 => 4 => 8 => 12 => 16 => 20 => 24 =>
=> 23 => 19 => 15 => 11 => 7 => 3 => 1 => 5 => 9 => 13 => 17 => 21 =>
Uriel
źródło
1

JavaScript, 30 24 bajtów

a=>(a+=a&2?-4:4)<0?a*a:a

Sekwencje:

  1. ... 19 15 11 7 3 1 5 9 13 17 21 ...
  2. ... 18 14 10 6 2 4 8 12 16 20 24 ...

Fragment kodu

f=a=>(a+=a&2?-4:4)<0?a*a:a
console.log('23 19 15 11 7 3 1 5 9 13 17'.split` `.map(a=>f(a|0)).join` `);
console.log('22 18 14 10 6 2 4 8 12 16 20'.split` `.map(a=>f(a|0)).join` `);


źródło