ที่ตั้งหมายเลขห้องพัก


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) ได้หรือไม่?
HyperNeutrino

9
... และนี่คือเหตุผลที่ห้องประชุมควรมีชื่อ
Jonathan Allan

2
@JanathanAllan เป็นเรื่องยากมากสำหรับคนใหม่ที่จะหา "ห้องปลาโลมา" มากกว่า "ห้อง 218" (สมมติว่ามีการกำหนดหมายเลขห้องตามลำดับ) การประนีประนอมจะเรียงตามตัวอักษรตามลำดับตัวอักษร แต่เมื่อคุณมีเพียง 26
แอนดรูว์พูดว่า Reinstate Monica

1
@ KellyLowder ควรจะเป็น933อย่างนั้นฉันได้แก้ไขมันแล้ว
Jonathan Allan

4
ที่เกี่ยวข้องฉันเคยทำงานในไอทีที่มีอาจารย์ที่มีปัญหากับเทคโนโลยีห้องทำงานหลายสัปดาห์ เขาอยู่ในแบรดลีย์ 210 (ซึ่งฉันรู้ว่าแบรดลีย์เป็นชื่อของอาคารอาคารถัดไป - Matheson - เชื่อมต่อผ่านสะพานฟ้าที่ชั้น 3 แบรดลีย์สูง 5 ชั้นคือแมทเทสัน 4) เขาไม่สามารถบอกฉันว่าเขาอยู่ในห้องอย่างถูกต้อง มีอยู่ครั้งหนึ่งที่เขาบอกฉันว่าเขาอยู่ใน "Matheson 605" ซึ่งไม่ได้มีอยู่จริงและไม่ได้รับตัวเลขใด ๆ เลย
Draco18s

คำตอบ:


13

ภาษา Wolfram (Mathematica) , 112 106 ไบต์

จำได้ว่าปุ่มกดตัวเลขเป็นพื้น 3x3 GridGraphที่มีขอบเพิ่มสำหรับ 0, AdjacencyListเราได้รับตัวเลขที่อยู่ติดกันสำหรับแต่ละการป้อนข้อมูลหลักด้วย

สามารถดูได้ด้านล่าง:

EdgeAdd[GridGraph[{3,3},VertexLabels->"Name",GraphLayout->"SpringEmbedding"],{0<->1,0<->2}] อัตราผลตอบแทน:

enter image description here

แล้วฉันจะใช้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ซึ่งจะรวมถึงข้อผิดพลาดการขนย้าย
Kelly Lowder

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 THตัวละครอาจจะไม่ได้รับการแสดงที่นี่ (เบราว์เซอร์ขึ้น) แต่ทั้งสตริงเทียบเท่ากับ[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! ค่อนข้างยาว 190 ไบต์ แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ด้วย R. Curious เพื่อดูว่าคนอื่นมีความคิดเห็นหรือสามารถทำได้ดีกว่า!


1
สิ่งเล็ก ๆ น้อย ๆ ทั้งหมด: คุณมีพื้นที่พิเศษในบรรทัดที่สอง เหยียดหยามความสำคัญของ:กว่า*/+-สามารถโกนไม่กี่ไบต์ในบรรทัดแรก, การกำจัดdo.callการรักษาaเป็นmatrixและ transposing มันจะช่วยประหยัดทั่ว 39 ไบต์: ลองออนไลน์!
Giuseppe

คุณเก่งเรื่องนี้! ขอบคุณสำหรับความคิดเห็น.
Florian

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

แก้ไข: บันทึกแล้ว 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>


ฉันเห็นสิ่งนี้ [สำหรับ (... )] ในสนามกอล์ฟจำนวนมาก แต่ฉันไม่เข้าใจและฉันไม่สามารถหามันได้ในเอกสารใด ๆ คุณช่วยอธิบายหรือโพสต์ลิงค์เพื่ออธิบายได้ไหม?
Anton Ballmaier

บันทึก 6 ไบต์[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
edc65

1
@AntonBallmaier [for(...)]เป็นหนึ่งในข้อเสนอทางไวยากรณ์ของความเข้าใจอาเรย์หลายอย่างที่ไม่เคยทำให้มันกลายเป็น ECMAscript มันอนุญาตให้คุณวนซ้ำตัววนซ้ำและกรองและ / หรือแผนที่ผลลัพธ์ (ฉันพบว่ามีประโยชน์อย่างยิ่งเมื่อทำการวนซ้ำสองครั้ง)
Neil

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
ออราเคิลควรเปลี่ยนชื่อเพื่อสิ่งที่ต้องการtoCharArraygetCrs

เครดิต

อักขระ -28 ตัวโดยKevin Cruijssen


1
การตีกอล์ฟ (String b)->อาจจะเป็นแค่และคุณสามารถลบต่อท้ายb-> ;สำหรับสิ่งที่เกิดขึ้นจริงกับกอล์ฟ: คุณใช้เพียงaครั้งเดียวเพื่อให้คุณสามารถลบString[]a=...;และใช้"12,024,0135,26,157,2468,359,48,579,68".split(",")[...]โดยตรง นอกจากนี้ยังสามารถByte.parseByte new Byteทั้งหมด: 177 ไบต์
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณนี่เป็นกลเม็ดบางอย่างที่ฉันจะต้องเรียนรู้ :)
Reinis Mazeiks



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 bytes (ดูเหมือนว่า 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 อืม TiO พูดว่า 108 ไบต์
Gastropner

ฉันไม่คิดว่า TIO จะนับ UTF-8 ไบต์อย่างถูกต้องใน C ลองเปลี่ยนภาษาเป็น bash หรืออย่างอื่นแล้วดูการเปลี่ยนแปลงจำนวนไบต์
ceilingcat

@ceilingcat ใช่แล้วมันก็ไม่แพงเหมือนกัน ไฟล์ที่บันทึกไว้คือ 114 จริงพอ
Gastropner



1

Python 2 , 103 ไบต์

ขอบคุณ @Lynn เป็นเวลา 4 ไบต์

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

Julia 0.6 , 93 bytes

~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+10jบิต TH เป็นชุด IFF 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

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
ฉันไม่มีเบาะแสเกี่ยวกับวิธีการแยกวิเคราะห์โดยสุจริตว่ามันทำงานอย่างไร คำอธิบายจะได้รับการชื่นชมอย่างมาก
caird coinheringaahing

@cairdcoinheringaahing ขออภัยไม่มีเวลาแล้ว
Erik the Outgolfer

-1 ไบต์: Wẋ3->ḷþ
Jonathan Allan

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.