Konwerter numerów budynków podstawowych profesora

12

Oszalały profesor matematyki chce zakodować wszystkie swoje badania za pomocą systemu, który z pewnością okaże nawet najbardziej szalonych konkurentów!

W tym celu profesor postanowił zmienić bazę nie tylko liczby, którą piszą, ale każdej cyfry w tym numerze, zgodnie z miejscem, w którym cyfra się znajduje (licząc od prawej, zaczynając od 1). Na przykład:

Liczba 0 ma jedną cyfrę, więc jest reprezentowana w bazie 1: 0

Liczba 1 miałaby jedną cyfrę w bazie dziesięciu, ale w systemie naszego profesora nie jest to poprawne. Pierwsze miejsce jest zarezerwowane tylko dla cyfr podstawowych 1! Oznacza to, że należy go uderzyć w drugie miejsce, w którym dozwolona jest baza 2: 10

Liczba 2 wymaga zapisu co najmniej bazy 3: 100

Ale teraz cyfrę 3 można zapisać, zmieniając cyfrę na drugim miejscu: 110

i 4 jako tak: 200

Oto kilka przykładów, które pomogą Ci uzyskać pomysł:

5: 210

6: 1000

7: 1010

8: 1100

9: 1110

10: 1200

11: 1210

12: 2000

13: 2010

14: 2100

15: 2110

16: 2200

17: 2210

18: 3000

Korzystając z tego systemu, notatki profesora nie będą miały sensu dla nikogo oprócz nich i mogą w końcu przejąć świat !!!! śpij dobrze w nocy.

Oczywiście metoda kodowania musi być tak niejasna, jak to możliwe.


Twoim zadaniem jest napisanie 10 fragmentów kodu, z których każdy reprezentuje jedną z 10 cyfr podstawowych

0 1 2 3 4 5 6 7 8 9

który po połączeniu w kolejności konwertowanej liczby da liczbę zapisaną w diabelskim systemie numeracji profesora (metoda wyjściowa może być wybrana przez ciebie, ale musi być liczbą czytelną dla człowieka, używając tylko cyfr 0-9)

Na przykład, jeśli moje fragmenty to:

0 = MONKEY 1 = PRZYKŁAD, 2 = KOD, 3 = ZŁOTA, a 9 = TEST

następnie

19 = PRZYKŁADOWY -> 3010

20 = CODEMONKEY -> 3100

21 = PRZYKŁAD KODU -> 3110

22 = KODEKS -> 3200

23 = CODEGOLF -> 3210

Nie należy brać pod uwagę liczb wejściowych zawierających więcej niż 10 cyfr lub liczb ujemnych, ale jeśli chcesz napisać kod dla dodatkowych cyfr, otrzymasz dodatkowe wyróżnienia. To jest golf golfowy, więc najkrótsza odpowiedź (przy użyciu sumy bajtów wszystkich fragmentów) wygrywa, a standardowe luki nie są dozwolone.

DODATEK: Zanim ktokolwiek zacznie od tego, czy 0 jest prawidłową reprezentacją 0 w bazie 1, chciałbym przypomnieć, że ten profesor jest szalony. Żyj z tym.

Joe Bloggs
źródło
1
Uwaga: System profesora jest również znany jako system liczb silni .
ETHproductions
Jest to również OEIS A124252
user41805
@ETHproductions Nigdy nie powiedziałem, że kodowanie Profesora jest dobre .
Joe Bloggs,
@KritixiLithos Dziękujemy za to! Szukałem tego jako potwierdzenia.
Joe Bloggs,
4
Przy okazji, witamy w PPCG :-)
ETHproductions

Odpowiedzi:

1

Mathematica (środowisko REPL), 858 bajtów ogółem

Oto 86-bajtowy fragment kodu dla cyfry 9:

1;ValueQ@a||(a=0;b=3);a=10a+9;b++;FromDigits[a~IntegerDigits~MixedRadix@Range[b,1,-1]]

Fragmenty kodu dla cyfr od 1 do 8 są identyczne, z wyjątkiem tego, że 9 jest zastąpione odpowiednią cyfrą. Fragment kodu dla cyfry 0 jest identyczny, z tą różnicą, że +9jest po prostu usuwany.

a~IntegerDigits~MixedRadix@Range[b,1,-1]oblicza listę cyfr systemowych na czynnik a, pod warunkiem, że bjest co najmniej tak duża jak liczba cyfr; FromDigitskonwertuje tę listę cyfr na zwykłą liczbę całkowitą base-10 na potrzeby danych wyjściowych. (Jeśli którykolwiek z elementów listy przekracza 9, dzieje się coś śmiesznego).

W środowisku REPL Mathematica obliczenia mogą być zakończone średnikami, aby stłumić dane wyjściowe; więc wyświetlane będą tylko ostatnie dane wyjściowe w łańcuchu oddzielonym średnikami. Rekurencyjnie definiujemy liczbę całkowitą awyznaczoną przez fragmenty, a także ograniczamy bliczbę potrzebnych cyfr układu czynnikowego. Polecenie ValueQ@a||(a=0;b=3)inicjuje te zmienne, jeśli są niezainicjowane (tj. W pierwszym fragmencie) i pozostawia je same; następnie a=10a+9;b++przeprowadza rekurencję. Wreszcie, początkowa 1;polega na sklejeniu fragmentów: pomnaża obliczenia pośrednie przez 1 (czego i tak nigdy nie widzimy).

Greg Martin
źródło
Lubię nadużywanie średników.
Joe Bloggs,
0

Goruby, 790 810 980

Oto druga próba, polegająca na tym, że w zasadzie w dowolnej powłoce wydrukowanie powrotu karetki („\ r”) bez nowej linii („\ n”) zastąpi poprzednio wydrukowaną linię, ostatecznie zapewniając, że wydrukowany zostanie tylko ostatni bit (czyli wynik końcowy) jest pokazany.

Musi to być uruchomione w powłoce, np ruby name_of_file.rb.

Działa dla dodatnich liczb o nieograniczonej długości.

Kod to dziesięć kopii fragmentu poniżej, z X(u góry) zastąpionymi cyframi od 0 do 9, po jednym na fragment.

->*t{n,d,o="X#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

Oznacza to, że fragment reprezentujący (na przykład) 8 wyglądałby następująco:

->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

Wyzwanie mówi, że fragmenty muszą zostać „połączone”, aby utworzyć reprezentację liczby wielocyfrowej, więc aby dołączyć cyfrę do liczby, po prostu umieść ją w nawiasach kwadratowych na końcu numeru. Zatem liczba 103 (dziesiętnie) byłaby:

->*t{n,d,o="1#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="0#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[]]]
Tutleman
źródło
Masz na myśli liczbę 108.
user75200