Localisateur de numéro de chambre

24

Localisateur de numéro de chambre

Je suis tombé sur une technique de résolution de problèmes intéressante à mon travail quand on m'a donné le mauvais numéro de chambre d'un collègue pour une réunion. De temps en temps, alors que je me rends à une réunion, un membre de mon équipe m'envoie le mauvais numéro de chambre, généralement parce qu'il est pressé à son bureau et qu'il a la grosse clé du mauvais doigt.

Fait intéressant, à mon arrivée dans la mauvaise pièce, je peux généralement deviner de quelle pièce il s'agissait vraiment en imaginant un pavé numérique :

et en devinant un nombre adjacent, ils voulaient appuyer.

Défi

Votre défi consiste à écrire une fonction qui prend un numéro de bureau de bâtiment (000-999) et génère les solutions de faute de frappe possibles, en supposant que votre collègue ne tape qu'un chiffre.

Le tableau suivant montre quels numéros sont adjacents les uns aux autres sur un pavé numérique:

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

Contribution

Un numéro à 3 chiffres: 000-999. Supposons une entrée d'exactement 3 chiffres. Si le nombre est inférieur à 100 ou inférieur à 10, vous recevrez les zéros de tête. (c.-à-d. 004 et 028).

Sortie

Une liste des chambres possibles. Cela peut prendre la forme que vous souhaitez, tant qu'il y a un délimiteur entre les numéros de pièce. (c.-à-d. espace, virgule, nouvelle ligne, etc.). Si le nombre est inférieur à 100 ou inférieur à 10, vous pouvez ou ne pouvez pas avoir les zéros de tête en sortie, cela dépend de vous. (c.-à-d. 004 peut être 004 04 4et 028 peut être 028 28)

Cas de test (les zéros en tête sont facultatifs):

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

Il s'agit de , donc le code le plus court en octets pour chaque langue l'emporte.

DevelopingDeveloper
la source
1
Pouvons-nous prendre la saisie comme une liste de trois chiffres (0-9)?
HyperNeutrino
9
... et c'est pourquoi les salles de réunion doivent avoir des noms.
Jonathan Allan
2
@JonathanAllan Il est beaucoup plus difficile pour les nouvelles personnes de trouver "Dolphin Room" que "Room 218" (en supposant que les numéros de chambre sont attribués dans l'ordre). Un compromis serait de classer les noms par ordre alphabétique, mais vous n'en avez plus que 26.
Andrew dit Reinstate Monica
1
@KellyLowder aurait dû l'être 933donc je l'ai corrigé.
Jonathan Allan
4
En relation, j'ai déjà travaillé dans l'informatique où un professeur avait des problèmes avec la technologie de la salle plusieurs semaines de suite. Il était dans Bradley 210 (que je connaissais, Bradley étant le nom du bâtiment. Le bâtiment voisin - Matheson - était connecté via un pont aérien au 3ème étage. Bradley était de 5 étages, Matheson 4). Il n'a jamais pu me dire dans quelle pièce il se trouvait correctement. Une fois, il m'a dit qu'il était dans "Matheson 605", ce qui n'existait manifestement pas, et qu'il n'avait aucun chiffre correct.
Draco18s

Réponses:

13

Wolfram Language (Mathematica) , 112 106 octets

Reconnaissant qu'un pavé numérique est essentiellement un 3x3 GridGraphavec des bords ajoutés pour 0, nous obtenons les chiffres adjacents pour chaque chiffre d'entrée avec AdjacencyList.

Cela peut être vu ci-dessous:

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

entrez la description de l'image ici

Ensuite, j'utilise Tuplespour comprendre toutes les erreurs possibles et choisir celles avec exactement une erreur avec Selectet EditDistance. Soit dit en passant, cela fonctionnera pour des numéros de pièce plus longs et vous pouvez également augmenter le EditDistanceparamètre pour permettre plusieurs erreurs. Pourrait être en mesure de jouer au golf un peu plus loin, mais je voulais montrer mon approche.

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

Version légèrement plus golfée codée en dur pour une longueur de 3 numéros de pièce (106 octets). Cela produira une liste de rang 3 correspondant à chaque chiffre:

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

Essayez-le en ligne!

Kelly Lowder
la source
On pourrait également utiliser d'autres fonctions de distance telles que, DamerauLevenshteinDistanceau lieu de EditDistancecela, incluraient également des erreurs de transposition.
Kelly Lowder
9

Python 2 , 89 octets

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

Essayez-le en ligne!

Les 1 er et 5 e caractères peuvent ne pas être affichés ici (selon le navigateur), mais la chaîne complète équivaut à[21, 204, 1035, 62, 157, 2468, 359, 48, 579, 68]

Barre
la source
3

R , 190 octets

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}),]}

Essayez-le en ligne!


Ma deuxième tentative chez CodeGolf! Assez long, 190 octets, mais le mieux que j'ai pu gérer avec R. Curieux de voir si d'autres ont des retours ou peuvent faire mieux!

Florian
la source
1
un tas de petites choses: vous avez un espace supplémentaire dans la deuxième ligne; abuser de la priorité de :over */+-peut raser quelques octets dans la première ligne, s'en débarrasser do.call, le traiter acomme un matrixet le transposer économise environ 39 octets: Essayez-le en ligne!
Giuseppe
Tu es bon à ça! Merci pour les commentaires.
Florian
2

JavaScript (Firefox 30-57), 115 109 octets

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)]:[]

Edit: 6 octets enregistrés grâce à @ edc65 (bien que les suggestions 0apparaissent maintenant après d'autres suggestions). Version ES6, 118 112 octets:

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
la source
Je vois cela [pour (...)] dans beaucoup de golfs de code, mais je ne le comprends pas complètement, et je n'arrive pas à le trouver dans aucune documentation. Pourriez-vous l'expliquer ou publier un lien vers une explication?
Anton Ballmaier
enregistrer 6 octets[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
edc65
1
@AntonBallmaier [for(...)]était l'une des nombreuses propositions de syntaxe de compréhension de tableau qui n'ont jamais été intégrées dans ECMAscript. Il vous a permis de parcourir un itérateur et de filtrer et / ou cartographier succinctement les résultats. (Je l'ai trouvé particulièrement utile lors d'une double itération.)
Neil
2

Java, 205 177 octets

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);}}}

Je sais que c'est long par rapport aux autres réponses. Mon excuse: c'est en Java.
Oracle devrait renommer toCharArrayquelque chose comme getCrs.

Crédits

-28 personnages de Kevin Cruijssen

Reinis Mazeiks
la source
1
Quelques petites choses au golf. (String b)->peut être juste b->, et vous pouvez supprimer la fin ;. Quant aux choses réelles au golf: vous ne l'utilisez aqu'une seule fois, vous pouvez donc l'enlever String[]a=...;et l'utiliser "12,024,0135,26,157,2468,359,48,579,68".split(",")[...]directement. , Aussi Byte.parseBytepeut être new Byte. Au total: 177 octets .
Kevin Cruijssen
1
@KevinCruijssen merci, ce sont des astuces que je vais devoir apprendre :)
Reinis Mazeiks
1
Des conseils pour jouer au golf en Java et des conseils pour jouer au golf dans <toutes les langues> peuvent être intéressants à lire si vous ne l'avez pas encore fait. :)
Kevin Cruijssen
2

Ruby 97 octets

->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}}

Essayez-le en ligne!

Alternativement, 94 caractères mais 100 octets

->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}}

Essayez-le en ligne!

Asone Tuhid
la source
2

C (gcc) , 136 ou 114 octets

ASCII version 136 octets

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);}

Essayez-le en ligne!

Unicode 114 108 octets (TiO semble compter étrangement pour cela)

Merci à @ceilingcat pour cette version.

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);}

Essayez-le en ligne!

gastropner
la source
@ceilingcat Hm. TiO indique 108 octets.
gastropner
Je ne pense pas que TIO compte correctement les octets UTF-8 en C. Essayez de changer la langue en bash ou autre chose et regardez le nombre d'octets changer.
plafondcat
@ceilingcat Ouais, c'était trop chancelant localement. Le fichier enregistré est 114, c'est vrai.
gastropner
111 octets
plafondcat
1

Perl 5 , 120 85 + 2 ( -F) = 87 octets

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

Essayez-le en ligne!

Économisé 35 octets en empruntant une idée à la réponse ruby ​​de @ AsoneTuhid.

Xcali
la source
1

Python 2 , 103 octets

merci à @Lynn pour -4 octets.

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

Essayez-le en ligne!

ovs
la source
Économisez 4 octets avec: in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10](J'ai essayé int('…',36)aussi mais c'est un octet de plus.)
Lynn
1

Julia 0,6 , 93 octets

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

Essayez-le en ligne!

  • Prend un vecteur de chiffres et renvoie une liste dans le même format.
  • 0x502A044228550A21102B05406est un UInt128dans lequel le 1+10jbit e est défini ssi iest à côté jdu pavé numérique.
  • big(1)est un BigInt. Il est utilisé pour éviter le débordement et utilise moins de caractères que Int128(1)ou UInt128(1).
LukeS
la source
1

SQL (SQLite), 533 octets

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)

Non golfé

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)

Explication

L'entrée est une seule ligne de texte sur un tableau tavec une colonne s. Ma compréhension est que selon cette méta-réponse, c'est une forme d'entrée acceptable. L'entrée peut être créée comme ci-dessous.

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

Solution annotée

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
la source
1

Kotlin , 117 octets

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

Embellie

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

Tester

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
la source
0

Gelée , 35 octets

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

Essayez-le en ligne!

-1 merci à Jonathan Allan .

Explication en cours de mise à jour ...

Erik le Outgolfer
la source
3
Honnêtement, je n'ai aucune idée de la façon dont cela est analysé, et encore moins de la façon dont cela fonctionne. Une explication serait grandement appréciée.
caird coinheringaahing le
@cairdcoinheringaahing désolé, pas de temps maintenant
Erik the Outgolfer
-1 octet: Wẋ3->ḷþ
Jonathan Allan
0

T-SQL , 322 octets

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)

L'entrée provient de la colonne sd'une table à une seule ligne nommée t:

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

Non golfé:

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
la source