Lokalizator numeru pokoju

24

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 , więc wygrywa najkrótszy kod w bajtach dla każdego języka.

DevelopingDeveloper
źródło
1
Czy możemy przyjmować dane wejściowe jako listę trzech cyfr (0–9)?
HyperNeutrino
9
... i dlatego sale konferencyjne powinny mieć nazwy.
Jonathan Allan
2
@JonathanAllan Nowym osobom dużo trudniej jest znaleźć „Pokój delfinów” niż „Pokój 218” (przy założeniu, że numery pokoi są przypisywane w kolejności). Kompromisem byłoby uporządkowanie nazw alfabetycznie, ale wtedy masz tylko 26.
Andrew mówi Reinstate Monica
1
@ KellyLowder powinien być, 933więc naprawiłem to.
Jonathan Allan
4
Powiązane, kiedyś pracowałem w IT, gdzie był profesor, który miał problemy z technologią pokojową kilka tygodni z rzędu. Był w Bradley 210 (co wiedziałem, Bradley to nazwa budynku. Budynek obok - Matheson - był połączony mostem na niebie na 3. piętrze. Bradley miał 5 pięter, Matheson 4). Nigdy nie mógł mi powiedzieć, w którym pokoju był właściwie. Pewnego razu powiedział mi, że był w „Matheson 605”, który najwyraźniej nie istniał, i nie poprawił żadnej cyfry.
Draco18s

Odpowiedzi:

13

Wolfram Language (Mathematica) , 112 106 bajtów

Uznając, że klawiatura numeryczna jest w zasadzie 3x3 GridGraphz krawędziami dodanymi dla 0, otrzymujemy sąsiednie cyfry dla każdej cyfry wejściowej z AdjacencyList.

Można to zobaczyć poniżej:

EdgeAdd[GridGraph[{3,3},VertexLabels->"Name",GraphLayout->"SpringEmbedding"],{0<->1,0<->2}] daje:

wprowadź opis zdjęcia tutaj

Następnie używam Tuplesdo wykrycia wszystkich możliwych błędów i wybrania tych z dokładnie jednym błędem za pomocą Selecti EditDistance. Nawiasem mówiąc, będzie to działać dla dłuższych numerów pokojów, a także można zwiększyć EditDistanceparametr, 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.

h@u_:=Select[Tuples[AdjacencyList[EdgeAdd[GridGraph[{3,3}],{0<->1,0<->2}],#]~Join~{#}&/@u],#~EditDistance~u==1&]

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:

Thread/@ReplacePart[#~Table~3,{i_,i_}:>(AdjacencyList[GridGraph@{3,3}~EdgeAdd~{0<->1,0<->2},#]&/@#)[[i]]]&

Wypróbuj online!

Kelly Lowder
źródło
Można również użyć innych funkcji odległości, takich jak, które DamerauLevenshteinDistancezamiast tego EditDistanceobejmowałyby również błędy transpozycji.
Kelly Lowder,
9

Python 2 , 89 bajtów

lambda r:[r[:i]+[c]+r[i+1:]for i,n in enumerate(r)for c in`ord(u'ÌЋ>তŧ0ɃD'[n])`]

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]

Pręt
źródło
3

R 190 bajtów

function(x){l=list(c(1,2),c(0,2,4),c(0,1,3,5),c(2,6),c(1,5,7),c(2,4,6,8),c(3,5,9),c(4,8),c(5,7,9),c(6,8))
a=do.call(expand.grid, mapply(c,l[x+1],x))
a[apply(a,1,function(y){sum(x==y)==2}),]}

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!

Florian
źródło
1
cała masa drobiazgów: masz dodatkową przestrzeń w drugiej linii; nadużywanie pierwszeństwa funkcji :over */+-może ogolić kilka bajtów w pierwszym wierszu, pozbycie się do.call, potraktowanie ajako matrixi przeniesienie oszczędza około 39 bajtów: Wypróbuj online!
Giuseppe,
Jesteś w tym dobry! Dzięki za opinie.
Florian
2

JavaScript (Firefox 30-57), 115 109 bajtów

f=([c,...a],p=``)=>c?[...(for(n of``+[12,240,1350,26,157,2468,359,48,579,68][c])p+n+a.join``),...f(a,p+c)]:[]

Edycja: Zapisano 6 bajtów dzięki @ edc65 (choć sugerowane 0 s pojawiają się teraz po innych sugestiach). Wersja ES6, 118 112 bajtów:

f=([c,...a],p=``)=>c?[...[...``+[12,240,1350,26,157,2468,359,48,579,68][c]].map(n=>p+n+a.join``),...f(a,p+c)]:[]
<input oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Neil
źródło
Widzę to [dla (...)] w wielu golfach kodowych, ale nie do końca to rozumiem i nie mogę znaleźć tego w żadnej dokumentacji. Czy możesz to wyjaśnić lub zamieścić link do wyjaśnienia?
Anton Ballmaier
zapisz 6 bajtów[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
edc65
1
@AntonBallmaier [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).
Neil
2

Jawa, 205 177 bajtów

b->{for(int c=0;c<3;c++){char[]d=b.toCharArray();for(char e:"12,024,0135,26,157,2468,359,48,579,68".split(",")[new Byte(""+d[c])].toCharArray()){d[c]=e;System.out.println(d);}}}

Wiem, że to długo w porównaniu do innych odpowiedzi. Moja wymówka: jest w Javie.
Oracle powinien zmienić nazwę toCharArrayna coś podobnego getCrs.

Kredyty

-28 znaków Kevina Cruijssena

Reinis Mazeiks
źródło
1
Kilka małych rzeczy do gry w golfa. (String b)->może być po prostu b->i możesz usunąć końcowe ;. Jeśli chodzi o rzeczy do gry w golfa: możesz użyć tylko araz, 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.parseBytemoże być new Byte. Łącznie: 177 bajtów .
Kevin Cruijssen
1
@KevinCruijssen dzięki, oto kilka sztuczek, których będę musiał się nauczyć :)
Reinis Mazeiks
1
Porady dotyczące gry w golfa w Javie i Porady dotyczące gry w golfa w <wszystkich językach> mogą być interesujące, jeśli jeszcze tego nie zrobiłeś. :)
Kevin Cruijssen
2

Ruby 97 bajtów

->i{c=0;i.map{|j|[12,204,1035,26,157,2468,359,48,579,68][j].digits.map{|k|f=*i;f[c]=k;p f};c+=1}}

Wypróbuj online!

Alternatywnie, 94 znaki, ale 100 bajtów

->i{c=0;i.map{|j|"\fÌЋ\u001A\u009Dতŧ0ɃD".unpack("U*")[j].digits.map{|k|f=*i;f[c]=k;p f};c+=1}}

Wypróbuj online!

Asone Tuhid
źródło
2

C (gcc) , 136 lub 114 bajtów

Wersja ASCII 136 bajtów

m[]={12,240,1350,26,157,2468,359,48,579,68},p,i,X=10;f(n){for(i=100;i;i/=X)for(p=m[n/i%X];p;p/=X)printf("%d ",n/(i*X)*(i*X)+p%X*i+n%i);}

Wypróbuj online!

Unicode 114 108 bajtów (TiO wydaje się dziwnie liczyć do tego)

Dzięki @ceilingcat dla tej wersji.

p,i,X=10;f(n){for(i=1e3;i/=X;)for(p=L"\fðՆ\32\x9dতŧ0ɃD"[n/i%X];p;p/=X)printf("%d ",n/i/X*i*X+p%X*i+n%i);}

Wypróbuj online!

gastropner
źródło
@ceilingcat Hm. TiO mówi 108 bajtów.
gastropner
Nie sądzę, aby TIO poprawnie liczyło bajty UTF-8 w C. Spróbuj zmienić język na bash lub coś innego i obserwuj zmianę liczby bajtów.
ceilingcat
@ceilingcat Tak, też był lokalny. Zapisany plik to 114, wystarczy.
gastropner
111 bajtów
ceilingcat
1

Perl 5 , 120 85 + 2 ( -F) = 87 bajtów

map{@,=@F;$,[$i]=$_,say@,for(12,240,1350,26,157,2468,359,48,579,68)[$_]=~/./g;$i++}@F

Wypróbuj online!

Zaoszczędź 35 bajtów, pożyczając pomysł z rubinowej odpowiedzi @ AsoneTuhid.

Xcali
źródło
1

Python 2 , 103 bajty

dzięki @Lynn za -4 bajty.

lambda n:{n[:i]+r+n[i+1:]for i,v in enumerate(n)for r in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10]}

Wypróbuj online!

ovs
źródło
Zaoszczędź 4 bajty za pomocą: in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10](Próbowałem int('…',36)też, ale jest to o jeden bajt dłużej).
Lynn
1

Julia 0.6 , 93 bajty

~r=[(R=copy(r);R[j]=i;R)for i=0:9,j=1:3 if(big(1)<<(i+10r[j]))&0x502A044228550A21102B05406>0]

Wypróbuj online!

  • Pobiera wektor cyfr i zwraca listę w tym samym formacie.
  • 0x502A044228550A21102B05406jest wartością, UInt128w której 1+10justawiony jest th, iff iznajduje się obok jna klawiaturze numerycznej.
  • big(1)jest BigInt. Służy do zapobiegania przepełnieniu i używa mniej znaków niż Int128(1)lub UInt128(1).
Łukasza
źródło
1

SQL (SQLite), 533 bajtów

with m as (select 0 as i, 1 as o union values (0,2),(1,0),(1,2),(1,4),(2,0),(2,1),(2,3),(2,5),(3,2),(3,6),(4,1),(4,5),(4,7),(5,2),(5,4),(5,6),(5,8),(6,3),(6,5),(6,9),(7,4),(7,8),(8,5),(8,7),(8,9),(9,6),(9,8))select o || substr('008', 2, 1) || substr('008', 3, 1)from m where substr('008', 1, 1) = cast(i as text)union select substr('008', 1, 1) || o || substr('008', 3, 1)from m where substr('008', 2, 1) = cast(i as text)union select substr('008', 1, 1) || substr('008', 2, 1) || o from m where substr('008', 3, 1) = cast(i as text)

Bez golfa

with m as (
    select 0 as i, 1 as o
    union
    values
    /*(0,1),*/(0,2),
    (1,0),(1,2),(1,4),
    (2,0),(2,1),(2,3),(2,5),
    (3,2),(3,6),
    (4,1),(4,5),(4,7),
    (5,2),(5,4),(5,6),(5,8),
    (6,3),(6,5),(6,9),
    (7,4),(7,8),
    (8,5),(8,7),(8,9),
    (9,6),(9,8)
)
select o || substr(s, 2, 1) || substr(s, 3, 1)
from m, t
where substr(s, 1, 1) = cast(i as text)
union
select substr(s, 1, 1) || o || substr(s, 3, 1)
from m, t
where substr(s, 2, 1) = cast(i as text)
union
select substr(s, 1, 1) || substr(s, 2, 1) || o
from m, t
where substr(s, 3, 1) = cast(i as text)

Wyjaśnienie

Dane wejściowe to pojedynczy wiersz tekstu w tabeli tz kolumną s. Rozumiem, że według tej meta-odpowiedzi jest to akceptowalna forma wkładu. Dane wejściowe można utworzyć jak poniżej.

drop table if exists t;
create table t (s text);
insert into t values('555'); -- Your input here

Rozwiązanie z adnotacjami

with m as ( -- Using this in the "with" allows us to only type is once
    select 0 as i, 1 as o -- The first pair is here and it names the columns
    union
    values
    /*(0,1),*/(0,2),
    (1,0),(1,2),(1,4),
    (2,0),(2,1),(2,3),(2,5),
    (3,2),(3,6),
    (4,1),(4,5),(4,7),
    (5,2),(5,4),(5,6),(5,8),
    (6,3),(6,5),(6,9),
    (7,4),(7,8),
    (8,5),(8,7),(8,9),
    (9,6),(9,8)
)
select o || substr(s, 2, 1) || substr(s, 3, 1) -- concat the first wrong char with two correct chars
from m, t
where substr(s, 1, 1) = cast(i as text) -- when the first char is in the i (input) column from above
union
select substr(s, 1, 1) || o || substr(s, 3, 1)
from m, t
where substr(s, 2, 1) = cast(i as text)
union
select substr(s, 1, 1) || substr(s, 2, 1) || o
from m, t
where substr(s, 3, 1) = cast(i as text)
Captain Man
źródło
1

Kotlin , 117 bajtów

mapIndexed{i,c->"12,024,0135,26,157,2468,359,48,579,68".split(",")[c-'0'].map{replaceRange(i,i+1,it+"")}}.flatMap{it}

Upiększony

mapIndexed { i, c ->
    "12,024,0135,26,157,2468,359,48,579,68"
        .split(",")[c - '0']
        .map { replaceRange(i, i + 1, it + "") }
}.flatMap { it }

Test

fun String.f(): List<String> =
mapIndexed{i,c->"12,024,0135,26,157,2468,359,48,579,68".split(",")[c-'0'].map{replaceRange(i,i+1,it+"")}}.flatMap{it}

data class Test(val input:Int, val answers: List<Int>)

val tests = listOf(
    Test(8, listOf(108, 208, 18, 28, 5, 7, 9)),
    Test(123, listOf(23, 223, 423, 103, 113, 133, 153, 122, 126)),
    Test(585, listOf(285, 485, 685, 885, 555, 575, 595, 582, 584, 586, 588)),
    Test(777, listOf(477, 877, 747, 787, 774, 778)),
    Test(963, listOf(663, 863, 933, 953, 993, 962, 966)),
    Test(555, listOf(255, 455, 655, 855, 525, 545, 565, 585, 552, 554, 556, 558))
)

fun main(args: Array<String>) {
    for (r in tests) {
        val input = r.input.toString().padStart(3, '0')
        val expected = r.answers.map { it.toString().padStart(3, '0') }.sorted()
        val actual = input.f().sorted()
        if (expected != actual) {
            throw AssertionError("$input -> $actual | $expected")
        }
    }
}

TIO

TryItOnline

jrtapsell
źródło
0

Galaretka , 35 bajtów

ḷþị“-ⱮⱮVḟ|żṣ~ẋ³ɱgẆ’ḃ⁽¦ḳ¤$ṛ¦DŒp$¥"JẎ

Wypróbuj online!

-1 dzięki Jonathan Allan .

Objaśnienie jest aktualizowane ...

Erik the Outgolfer
źródło
3
Szczerze mówiąc, nie mam pojęcia, jak to jest analizowane, nie mówiąc już o tym, jak to działa. Wyjaśnienie byłoby bardzo mile widziane.
caird coinheringaahing
@cairdcoinheringaahing przepraszam, nie ma czasu
Erik the Outgolfer
-1 bajt: Wẋ3->ḷþ
Jonathan Allan
0

T-SQL , 322 bajty

WITH m AS(SELECT LEFT(value,1)i,RIGHT(value,1)o FROM STRING_SPLIT('01,02,10,12,14,20,21,23,25,32,36,41,45,47,52,54,56,58,63,65,69,74,78,85,87,89,96,98',','))SELECT o+RIGHT(s,2)FROM t,m WHERE i=LEFT(s,1)UNION SELECT LEFT(s,1)+o+RIGHT(s,1)FROM t,m WHERE i=SUBSTRING(s,2,1)UNION SELECT LEFT(s,2)+o FROM t,m WHERE i=RIGHT(s,1)

Dane wejściowe są pobierane z kolumny stabeli o jednym wierszu o nazwie t:

DROP TABLE IF EXISTS t
CREATE TABLE t (s CHAR(3))
INSERT INTO t VALUES('008')

Nie golfowany:

WITH m AS (
    SELECT LEFT(value,1) i, RIGHT(value,1) o
    FROM STRING_SPLIT('01,02,10,12,14,20,21,23,25,32,36,41,45,47,52,54,56,58,63,65,69,74,78,85,87,89,96,98',',')
)
SELECT o+RIGHT(s,2) FROM t,m WHERE i=LEFT(s,1)
UNION
SELECT LEFT(s,1)+o+RIGHT(s,1) FROM t,m WHERE i=SUBSTRING(s,2,1)
UNION
SELECT LEFT(s,2)+o FROM t,m WHERE i=RIGHT(s,1)

SQLFiddle

Razvan Socol
źródło