Oda Numarası Bulucu


24

Oda Numarası Bulucu

Bir meslektaşımdan bir toplantı için yanlış oda numarası verildiğinde işimde ilginç bir problem çözme tekniği ile karşılaştım. Her şimdi ve sonra, bir toplantıya giderken, ekibimdeki bir üye bana yanlış oda numarasını gönderecek, çünkü genellikle masalarında acele ediyorlar ve yanlış parmağı yanlış parmakla kullanıyorlar.

İlginç bir şekilde, yanlış odaya vardıklarında, genellikle bir Sayısal Tuş Takımı düşünerek hangi odayı kastettiklerini tahmin edebilirim :

ve bitişik bir sayıyı tahmin ederek basmak istediler.

Meydan okuma

Buradaki zorluk, meslektaşınızın sadece bir rakamı yanlış yazdığı varsayılarak, bir bina ofisi numarası (000-999) alan ve olası yazım hatası çözümlerini veren bir işlev yazmaktır .

Aşağıdaki tabloda, Sayısal Tuş Takımı'nda hangi numaraların birbirine bitişik olduğu gösterilmektedir:

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

Giriş

3 basamaklı bir sayı: 000-999. Tam olarak 3 hane girdi kabul edin. Sayı 100'den küçük veya 10'dan küçükse, size baştaki sıfırlar verilir. (yani, 004 ve 028).

Çıktı

Olası odaların bir listesi. Bu, oda numaraları arasında bir sınırlayıcı olduğu sürece, istediğiniz herhangi bir biçimde olabilir. (örn. boşluk, virgül, yeni satır, vb.) Sayı 100'den küçük veya 10'dan küçükse, çıktı olarak baştaki sıfırlara sahip olamazsınız veya olamaz, bu size bağlıdır. (yani 004 olabilir 004 04 4ve 028 olabilir 028 28)

Test Durumları (baştaki sıfırlar isteğe bağlıdır):

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

Bu , yani her dil için bayt cinsinden en kısa kod kazanır.


1
Girdiyi üç basamaklı bir liste olarak alabilir miyiz (0-9)?
HyperNeutrino 19:18

9
... ve bu yüzden toplantı salonlarının isimleri olmalı.
Jonathan Allan

2
@JonathanAllan Yeni insanların "Dolphin Room" u "Room 218" den daha zor bulması çok zor. Bir uzlaşma isimleri alfabetik olarak sıralardı, ama o zaman sadece 26
Andrew diyor

1
@KellyLowder bunu düzeltmiş olmalıydım 933.
Jonathan Allan

4
İlgili olarak, bir keresinde BT'de çalıştığımda, birkaç hafta boyunca oda teknolojisinde sorun yaşayan bir profesör vardı. Bradley 210’daydı (bence Bradley, binanın adıydı. Yan taraftaki bina - Matheson - 3. kattaki bir gökyüzü köprüsü ile bağlandı. Bradley 5 katlı, Matheson 4 idi). Hangi odada olduğunu doğru demedi. Bir keresinde bana, patenti olmayan "Matheson 605" te olduğunu ve hiçbir basamağın doğru olmadığını söyledi.
Draco18s

Yanıtlar:


13

Wolfram Dili (Mathematica) , 112 106 bayt

Sayısal tuş takımının temelde GridGraph0 için kenarları eklenmiş 3x3 olduğunu kabul ederek, her giriş basamağı için bitişik basamağı alırız AdjacencyList.

Bu aşağıda görülebilir:

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

enter image description here

Sonra Tuplesolası tüm hataları bulmak ve bunları tek bir hatayla çözmek için kullanıyorum.Select veEditDistance . Bu arada, bu daha uzun oda numaraları için çalışacaktır ve EditDistancebirden fazla hataya izin vermek için parametreyi de artırabilirsiniz . Bu biraz daha golf oynamak mümkün olabilir ama benim yaklaşımımı göstermek istedim.

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

Biraz daha fazla golf oyunu 3 oda numarasına (106 Bytes) kadar kodlanmış. Bu, her bir basamağa karşılık gelen bir sıralama 3 listesi olarak çıkacaktır:

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

Çevrimiçi deneyin!


Biri, DamerauLevenshteinDistancebunun yerine EditDistanceaktarma hatalarını da içerecek olan gibi başka mesafe fonksiyonlarını da kullanabilir .
Kelly Lowder

9

Python 2 , 89 bayt

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

Çevrimiçi deneyin!

1 st ve 5 inci karakterleri (tarayıcı bağlı) burada görüntülenir, ancak tam dize eşdeğerdir varlık olmayabilir[21, 204, 1035, 62, 157, 2468, 359, 48, 579, 68]



3

R , 190 bayt

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

Çevrimiçi deneyin!


CodeGolf'teki ikinci denemem! Oldukça uzun, 190 bayt, ancak en iyisi R. ile başa çıkabiliyorum. Başkalarının geri bildirim aldığını veya daha iyisini yapabileceğini merak ediyorum!


1
bir sürü küçük şey: ikinci satırda fazladan bir yeriniz var; önceliğini kötüye :üzerinde */+-ilk satırında birkaç byte tıraş olabilir kurtulmak do.calltedavisi, abir şekilde matrix: ve tüm çevresinde 39 bayt kaydeder aktaran çevrimiçi deneyin!
Giuseppe

Bu işte iyisin! Geri dönüşünüz için teşekkür ederiz.
Florian

2

JavaScript (Firefox 30-57), 115 109 bayt

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

Düzenleme: @ edc65 sayesinde kaydedilmiş 6 bayt (önerilenler 0şimdi diğer önerilerden sonra görünmesine rağmen ). ES6 sürümü, 118 112 bayt:

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>


Bunu [için (...)] birçok kod golfünde görüyorum, ancak tam olarak anlamıyorum ve hiçbir belgede bulamıyorum. Bunu açıklayabilir veya bir açıklamaya bağlantı gönderebilir misiniz?
Anton Ballmaier,

6 bayt tasarruf edin[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
edc65

1
@AntonBallmaier [for(...)], ECMAscript'e hiç girmemiş birkaç dizi anlama sözdizimi teklifinden biriydi. Bir yineleyici üzerinde döngü sağlamanıza ve sonuçları net bir şekilde filtrelemenize ve / veya eşlemenize olanak tanır. (Çift yineleme yaparken özellikle yararlı buldum.)
Neil

2

Java, 205 177 bayt

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

Diğer cevaplara göre çok uzun olduğunu biliyorum. Pardon: Java'da.
Oracle, bunun toCharArraygibi bir şeyi yeniden adlandırmalı getCrs.

Kredi

Cruijssen tarafından -28 karakter


1
Golf için bazı küçük şeyler. (String b)->sadece b->olabilir ve izini kaldırabilirsiniz ;. Gerçek golf oynamaya gelince: Yalnızca bir akez kullanırsınız , böylece doğrudan kaldırabilir String[]a=...;ve kullanabilirsiniz "12,024,0135,26,157,2468,359,48,579,68".split(",")[...]. Ayrıca, Byte.parseByteolabilir new Byte. Toplamda: 177 bayt .
Kevin Cruijssen,

1
@KevinCruijssen teşekkürler, bunlar öğrenmem gereken bazı püf noktaları :)
Reinis Mazeiks

1
Java golf için ipuçları ve <tüm dillerde> golf için İpuçları henüz yapmadıysanız durumunda okumaya ilginç olabilir. :)
Kevin Cruijssen,

2

Ruby 97 bayt

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

Çevrimiçi deneyin!

Alternatif olarak, 94 karakter ama 100 bayt

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

Çevrimiçi deneyin!


2

C (gcc) , 136 veya 114 bayt

ASCII sürüm 136 bayt

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

Çevrimiçi deneyin!

Unicode 114 108 bayt (TiO bunun için çok garip görünüyor)

Bu sürüm için @ceilingcat'e teşekkürler.

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

Çevrimiçi deneyin!


@ceilingcat Hm. TiO, 108 bayt diyor.
gastropner

TIO’nun C’de UTF-8 baytları doğru saydığını sanmıyorum. Dili bash veya başka bir şey olarak değiştirmeyi deneyin ve bayt sayısı değişimini izleyin.
ceilingcat

@ceilingcat Evet, yerel olarak da riskliydi. Kaydedilen dosya 114, yeterince doğru.
gastropner


1

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

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

Çevrimiçi deneyin!

@ AsoneTuhid'in yakut cevabından bir fikir ödünç alarak 35 bayt kurtardı.


1

Python 2 2,103 bayt

-4 byte için @Lynn'e teşekkürler.

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

Çevrimiçi deneyin!


4 bayt ile kaydedin: in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10](Ben de denedim int('…',36)ama bir bayt daha uzun.)
Lynn

1

Julia 0.6 , 93 bayt

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

Çevrimiçi deneyin!

  • Bir rakam vektörünü alır ve aynı formatta bir liste döndürür.
  • 0x502A044228550A21102B05406Bir olduğu UInt128hangi 1+10jinci uç seti IFF olduğu iyanındadırj numpad üzerinde.
  • big(1)bir BigInt. Taşmayı önlemek için kullanılır ve Int128(1)veya ' dan daha az karakter kullanır UInt128(1).

1

SQL (SQLite), 533 bayt

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)

Ungolfed

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)

açıklama

Giriş, tsütunlu masada tek bir metin satırıdır s. Anladığım kadarıyla bu meta cevaba göre bu kabul edilebilir bir girdi şeklidir. Giriş aşağıdaki gibi oluşturulabilir.

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

Açıklamalı çözüm

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 bayt

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

Beautified

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

Ölçek

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

Jöle , 35 bayt

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

Çevrimiçi deneyin!

-1 Jonathan Allan'a teşekkürler .

Açıklama güncelleniyor ...


3
Dürüst olmak gerekirse, nasıl çalıştığı hakkında, nasıl ayrıştırıldığı konusunda hiçbir fikrim yok. Bir açıklama çok takdir edilecektir.
caird coinheringaahing

@cairdcoinheringaahing üzgünüm, şimdi vaktimiz yok
Erik Outgolfer

-1 bayt: Wẋ3->ḷþ
Jonathan Allan

0

T-SQL , 322 bayt

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)

Giriş, sadında tek satırlık bir tablonun sütunundan alınır t:

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

Ungolfed:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.