Oświadczenie: Kodowanie Levenshtein jest całkowicie niezwiązane z metryką odległości edycyjnej Levenshtein .
<Wstaw tutaj długą historię o tym, dlaczego należy obliczać kody Levenshteina.>
Kod
Kodowanie Levenshteina to system przypisywania kodów binarnych nieujemnym liczbom całkowitym, który zachowuje pewną dziwną właściwość, która prawdopodobnie nie jest istotna dla tego wyzwania. Będziemy oznaczać ten kod jako L ( n ). Wikipedia opisuje to jako pięciostopniowy proces:
- Zainicjuj zmienną liczby kroków C na 1.
- Napisz binarną reprezentację liczby bez prowadzenia
1
na początek kodu. - Niech M będzie liczbą bitów zapisanych w kroku 2.
- Jeśli M nie jest równe 0, zwiększ C , powtórz od kroku 2, wpisując M jako nowy numer.
- Napisz bity C
1
i a0
na początku kodu.
Kod można jednak również opisać rekurencyjnie:
- Jeśli liczba wynosi 0, to jej kod to
0
. - Napisz binarną reprezentację liczby bez prowadzenia
1
na początek kodu. - Niech M będzie liczbą bitów zapisanych w kroku 2.
- Napisz L ( M ) na początku kodu.
- Napisz
1
trochę na początku kodu.
Dla tych, którzy wolą przykłady, oto proces rekurencyjny dla L (87654321) z oznaczeniem konkatenacji:
Wyzwanie
Napisz program lub funkcję, która, biorąc pod uwagę liczbę n , wyprowadza ciąg bitów L ( n ) w dowolnym rozsądnym formacie (obejmuje to zwracanie liczby ze wspomnianymi bitami). Standardowe luki są, jak zawsze, niedozwolone.
Przykłady
Wejście: 5
Wynik: 1110001
Wejście: 30
Wynik: 111100001110
Wejście: 87654321
Wynik: 111110000101001001110010111111110110001
Wejście: 0
Wynik: 0
±
zamiast funkcjif
.JavaScript (ES6),
5452 bajtówEdycja: Zapisano 2 bajty dzięki @Arnauld.
źródło
replace(1,...
zamiastreplace(/1/,...
=> 52 bajtówPyth, 12 bajtów
Demonstracja
(Na
y
końcu jest uruchomienie wynikowej funkcji na wejściu)Wyjaśnienie:
źródło
SQF, 110
Funkcja rekurencyjna:
Zadzwoń jako:
[NUMBER] call f
Zauważ, że tak naprawdę nie działa to dla 87654321 lub innych dużych liczb z powodu błędu w silniku ArmA. Chociaż prawdopodobnie zostanie to wkrótce naprawione i powinno działać zgodnie ze specyfikacją.
( Ten bilet tutaj )
źródło
PHP,
116114 bajtówPodaj liczbę jako pierwszy argument.
Aktualizacja:
strlen($b)-1
go~~log10($b)
(w końcu zrozumiał, dlaczego wszyscy inni używają logarytmu) i inny, łącząc inaczej.źródło
Rubinowy, 38 bajtów
Bardzo podobny do odpowiedzi JavaScript Neila .
Zobacz na repl.it: https://repl.it/CnhQ
źródło
Java 8 (pełny program),
257249 bajtówWersja do odczytu z wyjaśnieniem (w większości jest to po prostu rekursja):
EDYCJA 1 : Zapisane 8 bajtów : Pierwszy znak ciągu binarnego to zawsze 1; dlatego zamiast używać
s.charAt(0)
lepszej opcji jest po prostu"1"
.źródło