रूम नंबर लोकेटर


24

रूम नंबर लोकेटर

मैं एक दिलचस्प समस्या को सुलझाने की तकनीक पर आया हूं जब एक बैठक के लिए एक सहकर्मी से गलत कमरा नंबर दिया गया था। हर अब और फिर, एक बैठक के रास्ते पर, मेरी टीम में एक सदस्य मुझे गलत कमरा नंबर भेजेगा, आम तौर पर क्योंकि वे अपने डेस्क पर एक भीड़ में हैं और गलत कुंजी को उंगली करते हैं।

दिलचस्प बात यह है कि गलत कमरे में आने पर, मैं आमतौर पर अंदाजा लगा सकता हूं कि वास्तव में वे किस कमरे में न्यूमेरिक कीपैड की कल्पना कर रहे थे :

और आसन्न संख्या का अनुमान लगाकर वे प्रेस करने के लिए थे।

चुनौती

आपकी चुनौती एक फ़ंक्शन लिखना है जो एक बिल्डिंग ऑफिस नंबर (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
क्या हम तीन अंकों (0-9) की सूची के रूप में इनपुट ले सकते हैं?
हाइपरन्यूट्रिनो

9
... और इसीलिए मीटिंग रूम के नाम होने चाहिए।
जोनाथन एलन

2
@JonathanAllan नए लोगों के लिए "रूम 218" की तुलना में "डॉल्फिन रूम" खोजना बहुत मुश्किल है (यह मानते हुए कि कमरे के नंबर क्रम में दिए गए हैं)। एक समझौता वर्णानुक्रम से नामों का आदेश देने का होगा, लेकिन तब आपके पास केवल 26 होते हैं।
एंड्रयू कहते हैं कि मोनिका

1
@ केलीलॉउडर होना चाहिए था 933इसलिए मैंने इसे ठीक किया।
जोनाथन एलन

4
संबंधित, मैंने एक बार आईटी में काम किया था, जहाँ एक प्रोफेसर थे, जिन्हें कई हफ्तों तक चलने वाली कमरे की तकनीक से परेशानी थी। वह ब्रैडली 210 में था (जिसे मैं जानता था, ब्रैडली इमारत का नाम है। भवन का अगला दरवाजा - मैथेसन - तीसरी मंजिल पर एक आकाश पुल के माध्यम से जुड़ा था। ब्रैडले 5 कहानियों से लंबा था, मैथेसन 4)। वह मुझे कभी नहीं बता सकता था कि वह सही ढंग से किस कमरे में है। एक बार उसने मुझे बताया कि वह "मैथेसन 605" में था, जो वर्तमान में मौजूद नहीं था, और अंकों में से कोई भी सही नहीं मिला।
ड्रेको

जवाबों:


13

वोल्फ्राम भाषा (गणितज्ञ) , 112 106 बाइट्स

यह समझते हुए कि एक संख्यात्मक कीपैड मूल रूप से GridGraph0 के लिए जोड़े गए किनारों के साथ एक 3x3 है , हमें प्रत्येक इनपुट अंक के साथ आसन्न अंक मिलते हैं AdjacencyList

इसे नीचे देखा जा सकता है:

EdgeAdd[GridGraph[{3,3},VertexLabels->"Name",GraphLayout->"SpringEmbedding"],{0<->1,0<->2}] पैदावार:

यहाँ छवि विवरण दर्ज करें

फिर मैं Tuplesसभी संभावित गलतियों का पता लगाने और उन लोगों के साथ एक त्रुटि निकालने का उपयोग करता हूंSelect और 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

पायथन 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

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

इसे ऑनलाइन आज़माएं!


कोडगोल्फ में मेरा दूसरा प्रयास! सुंदर लंबी, 190 बाइट्स, लेकिन सबसे अच्छा मैं आर के साथ प्रबंधन कर सकता था। यह देखने के लिए कि क्या दूसरों के पास प्रतिक्रिया है या बेहतर कर सकते हैं!


1
छोटी चीज़ों का एक पूरा गुच्छा: आपके पास दूसरी पंक्ति में एक अतिरिक्त जगह है; :ओवर की पूर्वता का दुरुपयोग करते */+-हुए, पहली पंक्ति में कुछ बाइट्स काट सकते हैं, छुटकारा पा रहे हैं do.call, aएक के रूप में इलाज कर रहे हैं matrixऔर इसे ट्रांसपोज़ कर रहे हैं, यह लगभग 39 बाइट्स बचाता है: इसे ऑनलाइन आज़माएं!
ग्यूसेप

आप इस पर अच्छे हैं! प्रतिक्रिया के लिए धन्यवाद।
फ्लोरियन

2

जावास्क्रिप्ट (फ़ायरफ़ॉक्स 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)]:[]

संपादित करें: सहेजे गए 6 बाइट्स @ edc65 के लिए धन्यवाद (हालांकि सुझाव दिया गया है कि 0अब अन्य सुझावों के बाद दिखाई देंगे)। 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]+'']
बचाएं

1
@AntonBallmaier [for(...)]कई एरे कॉम्प्रिहेंशन सिंटैक्स प्रस्तावों में से एक था, जिसने इसे ECMAscript में कभी नहीं बनाया। इसने आपको परिणामों पर इट्रेटर और रसीले फिल्टर और / या मानचित्र पर लूप करने की अनुमति दी। (मैंने दोहरा पुनरावृत्ति करते समय इसे विशेष रूप से उपयोगी पाया।)
नील

2

जावा, 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);}}}

मुझे पता है कि अन्य उत्तरों की तुलना में यह लंबा है। मेरा बहाना: यह जावा में है।
ओरेकल 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 बाइट्स
केविन क्रूज़सेन

1
@KevinCruijssen धन्यवाद, ये कुछ ट्रिक्स हैं जिनसे मुझे सीखना होगा :)
Reinis Mazeiks

1
जावा में गोल्फ के लिए सुझाव और <सभी भाषाओं> में गोल्फ के लिए सुझाव मामले में के माध्यम से पढ़ने के लिए दिलचस्प हो सकता है आप अभी तक नहीं किया है। :)
केविन क्रूज़सेन


2

सी (जीसीसी) , 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);}

इसे ऑनलाइन आज़माएं!

यूनिकोड 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 हम्म। टीआईओ कहते हैं 108 बाइट्स।
गैस्ट्रोपनर

मुझे नहीं लगता कि TIO C में सही ढंग से UTF-8 बाइट्स को गिनता है और भाषा को किसी अन्य चीज़ या भाषा में बदलने का प्रयास करें और बाइट काउंट परिवर्तन देखें।
छत

@ceilingcat हाँ, स्थानीय रूप से भी भारी था। सहेजा गया फ़ाइल 114, पर्याप्त सत्य है।
गैस्ट्रोपनर



1

अजगर २ , 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

जूलिया 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वह संख्या UInt128जिसमें 1+10jth बिट को सेट किया iजाता है j, यदि numpad पर बगल में है ।
  • 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)

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)

व्याख्या

इनपुट 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

कोटलिन , 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
मेरे पास ईमानदारी से इस बारे में कोई सुराग नहीं है कि यह कैसे पार्स किया जाता है, अकेले चलो यह कैसे काम करता है। एक स्पष्टीकरण बहुत सराहना की जाएगी।
केयर्ड कॉइनरहाइडिंग

@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')

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.