Lokalizator numeru pokoju
W mojej pracy natrafiłem na interesującą technikę rozwiązywania problemów, gdy otrzymałem niewłaściwy numer pokoju od kolegi na spotkanie. Od czasu do czasu, w drodze na spotkanie, członek mojego zespołu wysyła mi niewłaściwy numer pokoju, zwykle dlatego, że śpieszy się za biurkiem i grubym palcem niewłaściwy klucz.
Co ciekawe, po przybyciu do niewłaściwego pokoju zazwyczaj mogę odgadnąć, który pokój naprawdę mieli na myśli, wyobrażając sobie klawiaturę numeryczną :
i zgadując sąsiedni numer, zamierzali nacisnąć.
Wyzwanie
Wyzwanie polega na napisaniu funkcji, która pobierze numer biura budynku (000-999) i wyświetli możliwe rozwiązania literówek, zakładając , że kolega pomyli się tylko jedną cyfrę.
Poniższa tabela pokazuje, które numery sąsiadują ze sobą na klawiaturze numerycznej:
0 -> 1,2
1 -> 0,2,4
2 -> 0,1,3,5
3 -> 2,6
4 -> 1,5,7
5 -> 2,4,6,8
6 -> 3,5,9
7 -> 4,8
8 -> 5,7,9
9 -> 6,8
Wkład
Szereg 3 cyfra: 000-999
. Załóżmy, że wprowadzono dokładnie 3 cyfry. Jeśli liczba jest mniejsza niż 100 lub mniejsza niż 10, otrzymasz wiodące zera. (tj. 004 i 028).
Wydajność
Lista możliwych pokoi. Może to być dowolna forma, pod warunkiem, że pomiędzy numerami pokojów znajduje się ogranicznik. (tj. spacja, przecinek, nowa linia itp.) Jeśli liczba jest mniejsza niż 100 lub mniejsza niż 10, możesz mieć początkowe zera jako wyjściowe lub nie, to zależy od ciebie. (tzn. 004 może być 004 04 4
, a 028 może być 028 28
)
Przypadki testowe (zera wiodące są opcjonalne):
008 -> 108, 208, 018, 028, 005, 007, 009
123 -> 023, 223, 423, 103, 113, 133, 153, 122, 126
585 -> 285, 485, 685, 885, 555, 575, 595, 582, 584, 586, 588
777 -> 477, 877, 747, 787, 774, 778
963 -> 663, 863, 933, 953, 993, 962, 966
555 -> 255, 455, 655, 855, 525, 545, 565, 585, 552, 554, 556, 558
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach dla każdego języka.
933
więc naprawiłem to.Odpowiedzi:
Wolfram Language (Mathematica) ,
112106 bajtówUznając, że klawiatura numeryczna jest w zasadzie 3x3
GridGraph
z krawędziami dodanymi dla 0, otrzymujemy sąsiednie cyfry dla każdej cyfry wejściowej zAdjacencyList
.Można to zobaczyć poniżej:
EdgeAdd[GridGraph[{3,3},VertexLabels->"Name",GraphLayout->"SpringEmbedding"],{0<->1,0<->2}]
daje:Następnie używam
Tuples
do wykrycia wszystkich możliwych błędów i wybrania tych z dokładnie jednym błędem za pomocąSelect
iEditDistance
. Nawiasem mówiąc, będzie to działać dla dłuższych numerów pokojów, a także można zwiększyćEditDistance
parametr, aby pozwolić na więcej niż jeden błąd. Być może uda mi się trochę pograć w golfa, ale chciałem pokazać moje podejście.Nieco bardziej golfowa wersja zakodowana na stałe do 3 numerów pokojowych (106 bajtów). Spowoduje to wyświetlenie listy jako rangi 3 odpowiadającej każdej cyfrze:
Wypróbuj online!
źródło
DamerauLevenshteinDistance
zamiast tegoEditDistance
obejmowałyby również błędy transpozycji.Python 2 , 89 bajtów
Wypróbuj online!
W 1 st i 5 th znaki mogą nie być wyświetlane tutaj (przeglądarka zależna), ale pełen łańcuch jest równoważny
[21, 204, 1035, 62, 157, 2468, 359, 48, 579, 68]
źródło
05AB1E , 29 bajtów
Wypróbuj online!
źródło
R 190 bajtów
Wypróbuj online!
Moja druga próba CodeGolf! Dość długi, 190 bajtów, ale najlepiej jak mogłem poradzić sobie z R. Ciekawe, czy inni mają opinie lub mogą zrobić lepiej!
źródło
:
over*/+-
może ogolić kilka bajtów w pierwszym wierszu, pozbycie siędo.call
, potraktowaniea
jakomatrix
i przeniesienie oszczędza około 39 bajtów: Wypróbuj online!JavaScript (Firefox 30-57),
115109 bajtówEdycja: Zapisano 6 bajtów dzięki @ edc65 (choć sugerowane
0
s pojawiają się teraz po innych sugestiach). Wersja ES6,118112 bajtów:źródło
[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
[for(...)]
była jedną z kilku propozycji składniowych, które nigdy nie trafiły do ECMAscript. Pozwoliło to na zapętlenie iteratora i zwięzłe filtrowanie i / lub mapowanie wyników. (Uważam, że jest to szczególnie przydatne podczas podwójnej iteracji).Jawa,
205177 bajtówWiem, że to długo w porównaniu do innych odpowiedzi. Moja wymówka: jest w Javie.
Oracle powinien zmienić nazwę
toCharArray
na coś podobnegogetCrs
.Kredyty
-28 znaków Kevina Cruijssena
źródło
(String b)->
może być po prostub->
i możesz usunąć końcowe;
. Jeśli chodzi o rzeczy do gry w golfa: możesz użyć tylkoa
raz, więc możesz je usunąćString[]a=...;
i użyć"12,024,0135,26,157,2468,359,48,579,68".split(",")[...]
bezpośrednio. Ponadto,Byte.parseByte
może byćnew Byte
. Łącznie: 177 bajtów .Ruby 97 bajtów
Wypróbuj online!
Alternatywnie, 94 znaki, ale 100 bajtów
Wypróbuj online!
źródło
C (gcc) , 136 lub 114 bajtów
Wersja ASCII 136 bajtów
Wypróbuj online!
Unicode
114108 bajtów (TiO wydaje się dziwnie liczyć do tego)Dzięki @ceilingcat dla tej wersji.
Wypróbuj online!
źródło
Perl 5 ,
12085 + 2 (-F
) = 87 bajtówWypróbuj online!
Zaoszczędź 35 bajtów, pożyczając pomysł z rubinowej odpowiedzi @ AsoneTuhid.
źródło
Python 2 , 103 bajty
dzięki @Lynn za -4 bajty.
Wypróbuj online!
źródło
in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10]
(Próbowałemint('…',36)
też, ale jest to o jeden bajt dłużej).Julia 0.6 , 93 bajty
Wypróbuj online!
0x502A044228550A21102B05406
jest wartością,UInt128
w której1+10j
ustawiony jest th, iffi
znajduje się obokj
na klawiaturze numerycznej.big(1)
jestBigInt
. Służy do zapobiegania przepełnieniu i używa mniej znaków niżInt128(1)
lubUInt128(1)
.źródło
SQL (SQLite), 533 bajtów
Bez golfa
Wyjaśnienie
Dane wejściowe to pojedynczy wiersz tekstu w tabeli
t
z kolumnąs
. Rozumiem, że według tej meta-odpowiedzi jest to akceptowalna forma wkładu. Dane wejściowe można utworzyć jak poniżej.Rozwiązanie z adnotacjami
źródło
Kotlin , 117 bajtów
Upiększony
Test
TIO
TryItOnline
źródło
Galaretka , 35 bajtów
Wypróbuj online!
-1 dzięki Jonathan Allan .
Objaśnienie jest aktualizowane ...
źródło
Wẋ3
->ḷþ
T-SQL , 322 bajty
Dane wejściowe są pobierane z kolumny
s
tabeli o jednym wierszu o nazwiet
:Nie golfowany:
SQLFiddle
źródło