部屋番号ロケーター


24

部屋番号ロケーター

会議で同僚から間違った部屋番号を与えられたとき、私は仕事で興味深い問題解決テクニックに出会いました。時々、会議に向かう途中で、私のチームのメンバーが間違った部屋番号を送信します。これは通常、デスクで急いでいて、太い指で間違ったキーを押しているためです。

おもしろいことに、間違った部屋に着くと、私は通常、テンキーを想像することで彼らが本当に意味した部屋を推測できます:

そして、隣接する数字を推測することにより、彼らは押すことを意図していました。

チャレンジ

あなたの課題は、同僚が1桁しか入力しない仮定して、建物のオフィス番号(000〜999)を受け取り、可能なタイプミスを出力する関数を記述することです

次の表に、数字キーパッドで隣接する数字を示します。

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

入力

3桁の数字: 000-999。正確に3桁の入力を想定しています。数値が100未満または10未満の場合、先行ゼロが与えられます。(つまり、004および028)。

出力

可能な部屋のリスト。部屋番号の間に区切り記号がある限り、これは任意の形式にすることができます。(つまり、スペース、コンマ、改行など。)数値が100未満または10未満の場合、出力として先行ゼロを使用できるかどうかは、ユーザー次第です。(つまり、004は004 04 4、028は028 28

テストケース(先行ゼロはオプション):

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

これはであるため、各言語のバイト単位の最短コードが優先されます。


1
入力を3桁のリスト(0-9)として受け取ることはできますか?
ハイパーニュートリノ

9
...そしてこれが会議室に名前を付けるべき理由です。
ジョナサンアラン

2
@JonathanAllan新しい人が「Room 218」よりも「Dolphin Room」を見つけるのはずっと難しい(部屋番号が順番に割り当てられていると仮定した場合)。妥協はアルファベット順に名前を注文することになるが、その後、あなただけの26を持っている
アンドリューは回復モニカ言う

1
@KellyLowderは933そうだったはずなので、修正しました。
ジョナサンアラン

4
関連して、私はかつてITで働いていましたが、そこでは数週間のルームテクノロジーに問題を抱えていた教授がいました。彼はブラッドリー210にいました(私は知っていました、ブラッドリーは建物の名前です。隣の建物であるマテソンは3階のスカイブリッジで接続されていました。ブラッドリーは5階建て、マシソン4)。彼は、自分がどの部屋にいたのかを正確に教えてくれませんでした。あるとき、彼は「Matheson 605」にいると言ったが、それは特許的には存在しなかったし、正しい数字がなかった。
Draco18s

回答:


13

Wolfram言語(Mathematica)112 106バイト

数字キーパッドは基本的GridGraphに0にエッジが追加された3x3であると認識し、各入力桁の隣接桁を取得しAdjacencyListます。

これは以下で見ることができます:

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

enter image description here

次に、使用Tuplesして、考えられるすべての間違いを見つけ、Selectandで1つのエラーだけを見つけますEditDistance。ちなみに、これは長い部屋番号で機能します。また、EditDistanceパラメータを増やして複数のエラーを許容することもできます。これをもう少しゴルフできるかもしれませんが、私のアプローチを見せたかったのです。

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

長さ3の部屋番号(106バイト)にハードコードされたわずかにゴルフ版。これは、各桁に対応するランク3リストとして出力されます。

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

オンラインでお試しください!


また、DamerauLevenshteinDistance代わりEditDistanceに転置誤差を含むような他の距離関数を使用することもできます。
ケリーロウダー

9

Python 2、89バイト

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

オンラインでお試しください!

1 回目と5 回目の文字は(ブラウザ依存)ここに表示されていないかもしれないが、完全な文字列は同等です[21, 204, 1035, 62, 157, 2468, 359, 48, 579, 68]



3

R、190バイト

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

オンラインでお試しください!


CodeGolfでの2回目の試み!かなり長い、190バイトですが、Rで管理できる最高のものです。他の人がフィードバックを持っているか、もっとうまくやれるかどうかを知りたいと思っています。


1
たくさんのささいなこと:2行目に余分なスペースがあります。優先順位を乱用:にわたり*/+-最初の行に数バイトをオフに剃ることができ、を取り除くdo.call治療、aとしてmatrix:それはすべての周りの39バイトを保存し移調オンラインそれをお試しください!
ジュゼッペ

あなたはこれが得意です!フィードバックをお寄せいただきありがとうございます。
フロリアン

2

JavaScript(Firefox 30-57)、115 109バイト

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

編集:@ edc65のおかげで6バイト保存されました(ただし、提案された0sは他の提案の後に表示されます)。ES6バージョン、118 112バイト:

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>


私はこれを多くのコードゴルフで見ますが、完全には理解しておらず、どのドキュメントにも見当たりません。それを説明したり、説明へのリンクを投稿したりできますか?
アントンボールマイアー

6バイトを保存[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
-edc65

1
@AntonBallmaier [for(...)]は、ECMAscript を作成したことのない配列理解構文の提案の1つでした。イテレータをループして、結果を簡潔にフィルタリングおよび/またはマップできます。(二重反復を行うときに特に便利だとわかりました。)
ニール

2

Java、205 177バイト

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

私はそれが他の答えと比較して長いことを知っています。私の言い訳:それはJavaです。
OracleはtoCharArray次のような名前に変更する必要がありますgetCrs

クレジット

- ケビン・クルーイッセンの 28文字


1
ゴルフにいくつかの小さなもの。(String b)->ちょうどすることができますb->である、そして、あなたは末尾を取り除くことができます;。ゴルフの実際のものに関してはa、一度しか使用しないので、直接取り外しString[]a=...;て使用できます"12,024,0135,26,157,2468,359,48,579,68".split(",")[...]。また、Byte.parseByteすることができますnew Byte。合計:177バイト
ケビンCruijssen

1
@KevinCruijssenありがとう、それらは私が学ばなければならないいくつかのトリックです:)
Reinis Mazeiks

1
Javaでゴルフのヒント<すべての言語>でゴルフのヒントは、あなたがまだ持っていない場合には通じ読んでも面白いかもしれません。:)
ケビンクルーイッセン


2

C(gcc)、136または114バイト

ASCIIバージョン136バイト

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

オンラインでお試しください!

Unicode 114 108バイト(TiOはこのために奇妙にカウントされるようです)

このバージョンの@ceilingcatに感謝します。

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

オンラインでお試しください!


@ceilingcat Hm。TiOは108バイトと言います。
ガストロプナー

TIOがCでUTF-8バイトを正しくカウントするとは思わない。言語をbashなどに変更して、バイトカウントの変化を観察してください。
ceilingcat

@ceilingcatええ、ローカルでも不安定でした。保存されたファイルは114で、十分に真実です。
ガストロプナー



1

Python 2 2、103バイト

-4バイトの@Lynnに感謝します。

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

オンラインでお試しください!


4バイトを節約します:(in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10]私も試しint('…',36)ましたが、1バイト長くなりました。)
リン

1

ジュリア0.6、93バイト

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

オンラインでお試しください!

  • 数字のベクトルを受け取り、同じ形式のリストを返します。
  • 0x502A044228550A21102B05406が次の場合UInt1281+10jthビットが設定さiれるjテンキーに。
  • big(1)ですBigInt。オーバーフローを防ぐために使用され、Int128(1)またはより少ない文字を使用しUInt128(1)ます。

1

SQL(SQLite)、533バイト

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)

非ゴルフ

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)

説明

入力は、テーブルの上に単一のテキスト列であるt列を有しますs。私の理解では、このメタ回答によれば、これは入力の許容可能な形式であるということです。入力は次のように作成できます。

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

注釈付きソリューション

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)

1

Kotlin、117バイト

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

美化

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

テスト

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


0

ゼリー、35バイト

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

オンラインでお試しください!

-1 ジョナサンアランのおかげます。

説明を更新しています...


3
正直に言って、これがどのように解析されるかについては手掛かりがありません。説明をいただければ幸いです。
19:22にコイナーリンガーをケアします。

@cairdcoinheringaahingごめんなさい、今は時間がありません
エリック・ザ・アウトゴルファー

-1バイト:Wẋ3->ḷþ
ジョナサンアラン

0

T-SQL、322バイト

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)

入力は、次のs名前の単一行テーブルの列から取得されますt

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

ゴルフをしていない:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.