Francuskie tablice rejestracyjne
Francuskie tablice rejestracyjne występują w kolejności sekwencyjnej, według określonego wzoru cyfr i liter:AB-012-CD
Wyzwanie
Napisz program lub funkcję, która dla danego numeru generuje odpowiedni francuski numer tablicy rejestracyjnej . Twój program nie powinien obsługiwać żadnego specjalnego przypadku określonego na połączonej stronie. Powinien być w stanie wygenerować pełne 26*26*1000*26*26 => 456 976 000
możliwe tablice lub, o ile Twój język może to obsługiwać.
System numeracji wygląda następująco:
- AA-000-AA do AA-999-AA (liczby ewoluują najpierw);
- AA-000-AB do AA-999-AZ (wtedy ostatnia litera po prawej stronie);
- AA-000-BA do AA-999-ZZ (wtedy pierwsza litera po prawej);
- AB-000-AA do AZ-999-ZZ (następnie ostatnia litera po lewej);
- BA-000-AA do ZZ-999-ZZ (następnie pierwsza litera po lewej).
Wejście
- Indeks numeru rejestracyjnego jako liczba całkowita
Wydajność
- Odpowiedni francuski numer rejestracyjny
Dodatkowe informacje
- Litery muszą być pisane wielkimi literami
- Możesz użyć indeksowania opartego na 0 i na 1 do wygenerowania płytek (co oznacza, że AA-000-AA może odpowiadać
0
lub1
, zakładając, że wszystkie pozostałe przypadki testowe korzystają z tego samego indeksowania.
To jest golf golfowy , wygrywa najkrótsza odpowiedź w każdym języku!
Przypadki testowe (indeksowanie 0)
0 -> AA-000-AA
1 -> AA-001-AA
999 -> AA-999-AA
1000 -> AA-000-AB
675 999 -> AA-999-ZZ
676 000 -> AB-000-AA
456 975 999 -> ZZ-999-ZZ
Odpowiedzi:
Pure Bash (bez zewnętrznych narzędzi), 64
Wypróbuj online! - przejście przez 7 przypadków testowych zajmuje około 10 sekund.
eval
to wymagane do zapewnienia, że zmienna ekspansja (x) nastąpi przed ekspansją nawiasu.źródło
Perl 5 (-ap), 47 bajtów
Wypróbuj online!
PHP , 74 bajty
Wypróbuj online!
źródło
Python 3 ,
79 7877 bajtówWypróbuj online!
Jakoś nigdy nie zdałem sobie sprawy, że
f"string"
skrót formatu istnieje, dopóki nie zobaczyłem odpowiedzi Czarnej Sowy Kai.źródło
tuple
przez(*...,)
f"string"
powoduje, że Twoja odpowiedź na Python 3.6+ jest wyjątkowa, tylko dlatego, że jesteś świadomy. Dobra robota!Rubin,
615955 bajtówRównież 55 bajtów:
Wypróbuj online!
To inicjuje licznik
AA-AA000-
, zwiększa jegon
czasy (mnożąc ciąg kodu, który robi to przez n ieval
ing), a następnie przesuwa ostatnie 4 znaki po 3.źródło
->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}
jest dłuższy, ale zastanawiam się, czy można go skrócić.->n{s=[*'AA-AA000-'..?Z*9][n];s[2]+=s.slice!5,4;s}
powinien działać i ma tylko 50 bajtów długości, ale najpierw generuje każdą możliwą płytkę. : - /PHP ,
968479 bajtów-5 bajtów dzięki świetnym komentarzom Ismael Miguel .
Wypróbuj online!
Korzystam z faktu, że możesz zwiększać litery w PHP! Tak
AAAA++
się stanieAAAB
iAAAZ++
stanie sięAABA
. Obliczam, ile razy litery muszą być zwiększane przez uzyskanie liczby całkowitejinput/1000
. Następnie zwiększ cztery razy długość czterech znaków, a pierwsze dwa i dwa ostatnie znaki automatycznie staną się lewą i prawą stroną płytki.Na przykład dla wprowadzenia
675999
liczby przyrostów liter jest(int)(675999 / 1000) = 675
, takAAAA
się stanieAAZZ
.Wreszcie, środkowa liczba jest obliczana przez
input%1000
i wszystko jest drukowane w określonym formacie za pomocą printf .%.2s
wypisuje pierwsze dwa znaki ciągu,%03u
uzupełnia cyfrę po lewej stronie 3 zerami.źródło
%0.2s
ciebie możesz pisać%.2s
. To oszczędza 1 bajt. (Mała wskazówka: jeśli chcesz wypisać liczbę dziesiętną z określoną liczbą miejsc dziesiętnych, możesz zrobić%.2f
(lub jakikolwiek inny modyfikator), jak to działa w ten sam sposób)0
. Edycja: patrząc na dokumentację, wydaje mi się, że nawet jej nie potrzebowałem: P$x++^$argn/1e3
zamiast$x++<(0^$argn/1e3)
i powinieneś zapisać 4 bajty. Ta pętla aż do($x++^$argn/1e3) === 0
, i to0
przy$x
i$argn/1e3
są tym samym całkowitą ilość (stosując^
rzuci numery na całkowitą). Możesz tego spróbować na sandbox.onlinephpfunctions.com/code/…C,
8886 bajtówCałkiem proste, wykorzystuje podział i moduł do wyodrębnienia pól, dodaje litery „A” dla liter, aby zamapować je na znaki ASCII i formatowanie printf dla liczb.
Wypróbuj online!
źródło
Haskell,
85817977 bajtówWypróbuj online!
źródło
05AB1E ,
252220 bajtów-2 bajty (i zwiększono wydajność, nie generując całej listy) dzięki @Grimy .
Indeksowanie na podstawie 0.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Ostatnia część (
s₄‰`UèX₄+¦'-.øý
) może byćI₄÷èI₄+3.£.ý'-ý
alternatywą dla równych bajtów:Wypróbuj online lub sprawdź wszystkie przypadki testowe .
źródło
Au2ããI₄‰`UèX₄+¦'-.øý
lubAu2ããI₄÷èI₄+3.£'-.øý
.J ,
564946 bajtówWypróbuj online!
-3 bajty dzięki FrownyFrog
Cała sprawa to tylko 7 zagnieżdżonych pociągów - jeśli to nie jest fajne, co to jest?
źródło
JavaScript (Node.js) , 82 bajty
Wypróbuj online!
źródło
Rubinowy , 51 bajtów
Wypróbuj online!
źródło
R , 101 bajtów
Wypróbuj online!
Wykonuje tylko potrzebne obliczenia arytmetyczne. Zapisałem 5 bajtów, włączając w wektorze
a
bezużyteczną wartość wa[4]
, pozwalając mi ponownie użyć wektora pomocnikab
.B
AB-012-CD
n
n %/% 676000 %% 26
%/%
%%
źródło
Galaretka ,
2622 bajtówMonadyczny link akceptujący liczbę całkowitą (1-indeksowaną), która daje listę znaków ... Szalenie powolne, ponieważ najpierw buduje wszystkie tablice!
Wypróbuj online! (przyzwyczajenie kompletna)
Lub spróbuj zmniejszoną wersję alfabetu (tylko „ABC” na listach).
Dla kodu, który kończy się na czas, oto 32-bajtowy pełny program (indeksowany 0), który zamiast tego tworzy pojedynczą płytkę przy użyciu modułowej arytmetycznej i numerycznej dekompresji bazy:
Spróbuj tego!
źródło
APL + WIN, 61 bajtów
Monity o liczbę całkowitą:
Wypróbuj online! Dzięki uprzejmości Dyalog Classic
źródło
Węgiel drzewny , 33 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wpisz liczbę.
Wydrukuj a
-
.Dodaj 1000 do liczby, a następnie rzutuj wynik na ciąg i wydrukuj trzy ostatnie cyfry.
Podziel liczbę przez 1000, a następnie dodaj 26⁵, więc konwersja do niestandardowej bazy za pomocą wielkich liter alfabetu daje ciąg o długości 6, który jest następnie dzielony na pary liter.
Wydrukuj a
-
.Wydrukuj ostatnią parę liter.
Przejdź na początek tablicy rejestracyjnej.
Wydrukuj pozostałe żądane litery.
źródło
Perl 6 , 42 bajtów
Wypróbuj online!
Rozwiązanie Port of Grimy's Perl 5. Wolny dla dużych wartości wejściowych.
źródło
Excel,
183167155147 bajtów-16 bajtów dzięki @Neil. (6 przy użyciu
E3
)-12 bajtów dzięki @Keeta. (
TRUNC
zamiastQUOTIENT
)-8 bajtów dzięki @Jonathan Larouche (
INT
zamiastTRUNC
)Łączy 5 części:
źródło
MOD(QUOTIENT(A1,1E3),26)
działa? Ponadto, dlaczego1E3
dla1000
ale nie26E3
etc?456 975 996
->[Z-996-ZZ
CHAR(65+)
po cichu obcina miejsca po przecinku do%.9999997614649
. Większy niż to jest zaokrąglany w górę. PorównajCHAR(65+24.9999997614649)
iCHAR(65+24.999999761465)
.Czysty , 107 bajtów
Wypróbuj online!
Definiuje
$ :: Int -> [Char]
podanie n-tej zerowej tablicy rejestracyjnej.źródło
Japt , 21 bajtów
Nieprzyzwoicie wolny! Poważnie, nawet nie próbuj go uruchamiać!
Porada dla Kevina, za uświadomienie mi, gdzie się mylę, walcząc o to, aby wczoraj wieczorem zadziałało.
Spróbuj - ogranicza zakres liczb do
000-005
.źródło
Dalej (gforth) , 94 bajty
Wypróbuj online!
0-indeksowane. Dane wejściowe są pobierane z góry stosu
Wyjaśnienie kodu
źródło
q , 78 bajtów
źródło
T-SQL, 135 bajtów
źródło
Python 2 , 88 bajtów
Wypróbuj online!
źródło
Czerwony ,
130127 bajtówWypróbuj online!
źródło
Python 3 , 89 bajtów
Wypróbuj online!
-1 bajt dzięki mypetlion
źródło
chr(x//26000%26+65)+chr(x//1000%26+65)
aby'%c%c'%(x//26000%26+65,x//1000%26+65)
zapisać 1 bajt.MATLAB , 113 bajtów
Objaśnienia:
Pierwszy wiersz definiuje funkcję, która wygeneruje char (od
A
doZ
), funkcję 2 wejść. Numer indeksux
do przeliczenia na numer rejestracyjny oraz liczba całkowita,p
która będzie używana jako wykładnik liczby 26 (tj26^p
.). To drugie wejście umożliwia dostosowanie obliczeń dla pierwszej cyfry alfanumerycznej (p=3
) do ostatniej (p=0
).Na przykład dla drugiej cyfry, cyklicznie co 1000 * 26 * 26 iteracji, operacja:
mod(idivide(x,1000*26^2),26)
zwraca indeks od 0 do 25, który jest następnie konwertowany na ASCIIchar
przez dodanie 65 (ponieważ indeks jest0
oparty)Drugi wiersz po prostu łączy znaki. Każdy znak alfanumeryczny jest obliczany za pomocą funkcji
c(x,p)
, znak numeryczny jest po prostu obliczany za pomocąmodulo
operacji i konwertowany na ciąg znaków.Każdy element ciągu składającego się na numer rejestracyjny jest następujący:
Ponieważ nie mogę pozwolić ci wypróbować MATLAB online ( edytuj: faktycznie możesz wypróbować go online ), dam użytkownikom MATLAB możliwość weryfikacji przypadków testowych:
wyjścia:
Wariant: Należy pamiętać, że możliwa jest opcja zamiany cyfr na znaki
sprintf
lubfprintf
zadbania o nie. Pozwala to uprościć funkcjęc
, ale ogólnie daje kilka dodatkowych bajtów w tej implementacji (119 bajtów):źródło
C (gcc) ,
136106105 bajtówWypróbuj online!
-7 bajtów z celingcat jest rozwiązanie , za pomocą dodatkowych -23 inspirowany przez to
-1 bajt z ceilingcat za rozwiązanie zmieniając
char[]
Dowchar_t[]
niejawnie rzutować naint[]
Wykorzystuje indeksowanie 0.
Wyjaśnienie / Niegolfowany:
źródło
a
ib
z makra iJulia 1.0 , 86 bajtów
Wypróbuj online!
źródło
Kotlin , 93 bajty
Wypróbuj online!
źródło
Python 3 , 161 bajtów
Wypróbuj online!
źródło