หนูกับไดนาไมท์


23

คุณเป็นหนู เพื่อนของคุณถูกจับและหมดสติและถูกขังอยู่ในเขาวงกตที่มีทางเข้า / ทางออกเดียวเท่านั้น คุณมีแผนที่ที่สมบูรณ์แบบของเขาวงกตดังนั้นคุณจึงสามารถวางแผนการแก้ปัญหาเพื่อเร่งรีบและพาพวกมันทั้งหมดไปสู่ความปลอดภัย อย่างไรก็ตามเขาวงกตได้รับการปกป้องด้วยระบบรักษาความปลอดภัยที่จะเปิดการแจ้งเตือนหากถึงเกณฑ์1000ทำให้คุณถูกจับและล้มเหลวในภารกิจกู้ภัยของคุณ

จากการตรวจสอบก่อนหน้าของเขาวงกตของคุณแต่ละตารางคุณก้าว (เช่นการเคลื่อนไหวในแนวนอนหรือแนวตั้ง - หนูไม่สามารถเคลื่อนที่ในแนวทแยงมุม ) เพิ่ม1ไปยังเคาน์เตอร์ของระบบรักษาความปลอดภัย อย่างไรก็ตามหากคุณกำลังแบกน้ำหนัก (ทั้งบล็อกของไดนาไมต์หรือเพื่อนของเมาส์ที่ไม่รู้สึกตัว) มันเพิ่มแทน2เพราะมันตรวจจับแรงกดดันเพิ่มเติม จัตุรัสทางเข้า / ทางออกไม่มีระบบรักษาความปลอดภัยนี้ดังนั้นจึงไม่เพิ่มลงในตัวนับ

คุณมีไดนาไมต์จำนวนไม่ จำกัด ที่คุณนำมาที่ทางเข้าดังนั้นคุณสามารถระเบิดกำแพงทั้งหมดเพื่อปลดปล่อยเพื่อนของคุณ แต่คุณต้องระมัดระวังในการทำเช่นนี้เนื่องจากการระเบิดแต่ละครั้งจะเพิ่ม50ความกดดันจากการสั่นสะเทือน นอกจากนี้คุณสามารถพกพาได้ครั้งละหนึ่งอย่างเท่านั้นไม่ว่าจะเป็นหนึ่งเม้าส์หรือหนึ่งบล็อกไดนาไมต์ เนื่องจากบล็อกไดนาไมต์แต่ละอันสามารถทำให้เกิดการระเบิดได้เพียงพื้นที่เดียวเท่านั้นซึ่งหมายความว่าหากมีหลายกำแพงติดต่อกันคุณจะต้องเดินทางด้วยมือเปล่ากลับไปที่ทางเข้าเพื่อคว้ามากขึ้น

ตัวอย่างการทำงานผ่าน

สมมติว่าเขาวงกตของเรามีลักษณะดังนี้:

######
#M# E#
######

ฉันจะใช้cสำหรับเคาน์เตอร์ เราเริ่มต้นที่Entrance เลื่อนไปทางซ้ายหนึ่งตารางขณะถือไดนาไมต์c=2. เราระเบิดวัตถุระเบิดเพื่อระเบิดกำแพง, c=52. เราเลื่อนสี่เหลี่ยมสองช่องไปทางซ้ายมือเปล่าเพื่อรับc=54และตอนนี้เรากำลังยืนอยู่บนสี่เหลี่ยมของเมาส์ เราหยิบเพื่อนของเราขึ้นมาแล้วขยับ 3 สี่เหลี่ยมกลับไปที่Exit แต่จตุรัสสุดท้ายไม่นับเพราะไม่มีเซ็นเซอร์เลยนั่นเป็นเพียง 2 สี่เหลี่ยมที่มีบางอย่างอยู่ด้านหลังของเรา นั่นหมายความว่าเมื่อเราไปถึงทางออกด้วยเมาส์สุดท้ายc=58ซึ่งน้อยกว่า1000ดังนั้นภารกิจจึงสำเร็จ

ท้าทาย

ด้วยการป้อนข้อมูลในเขาวงกตเอาท์พุทไม่ว่าคุณจะเป็นฮีโร่ของเมาส์สามารถช่วยเหลือหนูที่ติดกับดักทั้งหมดภายใต้ข้อ จำกัด ที่ระบุไว้ข้างต้นหรือว่าภารกิจนั้นล้มเหลว

อินพุต

  • เขาวงกต 2 มิติในทุกรูปแบบที่ยอมรับได้ (สตริงหลายแถว, อาร์เรย์ของสตริง ฯลฯ )
  • สำหรับความท้าทายนี้ฉันจะใช้#ทั้งผนังภายในและภายนอกMสำหรับเพื่อนเมาส์และEทางเข้า
  • ทางเข้าจะไม่ติดกับผนังภายในทันที (จะต้องมีที่ว่างอย่างน้อยหนึ่งช่องที่สามารถเคลื่อนที่ได้อย่างอิสระ)
  • คุณสามารถแทนที่อักขระ ASCII ที่พิมพ์ได้ที่คุณต้องการตราบใดที่มันสอดคล้องกัน นี้ไม่ยอมให้คุณใช้สองสัญลักษณ์ที่แตกต่างกันสำหรับผนังภายในกับผนังด้านนอก, ตราบใดที่คุณรักษาความมั่นคง (เช่นถ้าคุณเลือกที่จะใช้@สำหรับผนังภายในแทนและลา#สำหรับภายนอกทุกผนังภายในต้อง@และทุกผนังด้านนอก#)
  • เขาวงกตจะถูกล้อมรอบด้วยกำแพงเสมอ แต่ไม่จำเป็นต้องเป็นรูปสี่เหลี่ยมผืนผ้า หากต้องการคุณสามารถสันนิษฐานได้ว่าเขาวงกตนั้นมีเบาะที่มีช่องว่างในการทำอินพุตสี่เหลี่ยม (อุปกรณ์เสริม)
  • เขาวงกตอาจมีส่วนที่ไม่สามารถเข้าถึงได้โดยไม่มีวัตถุระเบิด
  • คุณไม่สามารถระเบิดกำแพงด้านนอกของเขาวงกตได้

เอาท์พุต

truthy / falseyค่า ความจริงสำหรับ "ใช่หนูสามารถช่วยเหลือหนูตัวอื่น ๆ ทุกตัว" หรือ Falsey สำหรับ "ไม่ระบบเตือนภัยจะถูกสะดุด"

กฎระเบียบ

  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

ตัวอย่างความจริงคั่นด้วยบรรทัดว่าง

#####
#M E#
#####

######
#M# E#
######

########
#E  # M#
#   #  #
#   #  #
#      #
########

#############################
#    ##      #       #      #
#  M ## M    #       #      #
#    ##      #   M   #    E #
#M   ##      #       #      #
#############################

###############
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMM MM#
#MMMMMMMMMMMME#
###############

ตัวอย่าง Falsey คั่นด้วยบรรทัดว่าง

#############################
#M   ##      ##      ##     #
#  M ## M    ##      ##     #
#    ##      ##  M   ##   E #
#M   ##      ##      ##     #
#############################
#############################
                     ########
                     ########
                     #   #  #
                     # M # M#
                     ########

              #####
              # M #
              #####
              #####
              #####
              #####
###################
# # # ##   ## # # #
#M#M#M## E ##M#M#M#
# # # ##   ## # # #
###################
#######
######
#####
####
# M#
####

###############
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMME#
###############

3
หนูโกรธ (สปอยเลอร์อ่อน)
Luis Mendo

3
@AlexA ขออภัยที่คุณต้องเรียนรู้จากคนแปลกหน้าบนอินเทอร์เน็ต ;-)
AdmBorkBork

2
ฉันสงสัยว่าคนส่วนใหญ่จะมีเวลาในการแก้ปัญหานี้ด้วยรหัสปกติให้เล่นกอล์ฟเพียงอย่างเดียว มันเป็นความท้าทายที่ยิ่งใหญ่ที่ฉันโชคไม่ดีที่ไม่มีเวลาทำงาน
Moshe Katz

2
เป็นที่ยอมรับหรือไม่ว่ามีรูปแบบที่แตกต่างกันสำหรับผนังภายนอก
Tensibai

2
@Moshe แคทซ์ , แน่ใจว่าคุณไม่ได้มีเวลา คุณไม่ต้องการบันทึกMäuse
msh210

คำตอบ:


19

Perl, 216 215 ไบต์

รวมถึง +2 สำหรับ -0p

ให้อินพุตบน STDIN ใช้%สำหรับผนังภายนอกสำหรับผนัง#ภายใน0สำหรับพื้นที่ว่างเปล่า8สำหรับหนูและrสำหรับตำแหน่งเริ่มต้น บอร์ดทั้งหมดจะต้องมีเบาะเพื่อให้มันเป็นรูปสี่เหลี่ยมผืนผ้า คุณสามารถแปลงและรันตัวอย่างเป็น:

cat dynamite.txt | perl -p0e 's/.+/$a^=$&/egr;s//sprintf"%-*s",length$a,$&/eg;1while/\n/,s/^ *\K#|#(?= *$)|^ *.{@{-}}\K#|\A[^\n]*\K#|#(?=[^\n]*\n\z)|#(?=.{@{-}} *$)/%/sm;y/ EM/0x2/' | dynamite.pl

dynamite.pl:

#!/usr/bin/perl -0p
sub f{@a{@_}||=push@{$%+($&?$1?50:$&=~8?0:$&&"5"?2:1:0)},@_}f$_;for(@{$%}){f y/xr|/ytx/r;{f s/\pL\d/$&^(E&$&)x2/er}{f s/(q|s|y)#/$&^"\x01\x13"/er}my$o;{$\|=/x/>/2/;$o.="
"while s/.$/$o.=$&,""/meg}f$o}$%++>999|$\||redo}{

แทนที่ทาง\xhhหนีสำหรับคะแนนที่อ้างสิทธิ์

โปรแกรมไม่สามารถจัดการกรณีที่ซับซ้อนได้แนบเนียน โดยเฉพาะอย่างยิ่งมันไม่สามารถจัดการกับกรณีความล้มเหลวใด ๆ นี่เป็นเพราะมีวิธีที่แตกต่างกันมากมายในการทำให้กำแพงภายในหรือหยิบหนูขึ้นมาดังนั้นการค้นหาจึงกว้างเกินไปและใช้หน่วยความจำมากเกินไปแม้ว่าอย่างน้อยก็ฉลาดพอที่จะไม่ประมวลผลสถานะเดียวกันหลายครั้ง ต้อง จำกัด ระดับแรงดันให้ต่ำลงเพื่อ100ให้ใช้งานได้นานและการใช้หน่วยความจำ

คำอธิบาย

ฉันใช้รูปแบบบิตของอักขระเพื่อแสดงสถานะของฟิลด์:

contains victim: 0000 0010
has hero:        0100 0000
carry dynamite   0000 0001
carry mouse      0000 0100
home             0000 1000
walkable         0001 0000 (not really needed but results in shorter regexes)
make printable   0010 0000
wall             0010 xxxx (bit patterns not very important,
permawall        0010 xxxx  just avoid letters and digits)

ตัวอย่างเช่นฮีโร่ ( 01000000) ถือระเบิด ( 00000001) จะต้องอยู่ในสถานที่ที่เขาสามารถเดินได้ ( 00010000) และเราต้องการให้ค่าทั้งหมดสามารถพิมพ์ได้ ASCII ( 00100000) การบิตorของ bitmasks ทั้งหมดเหล่านี้จะช่วยให้01110001ซึ่งเป็นรหัส ASCII qสำหรับ ทั้งหมดนี้กลายเป็น ::

p: hero                     r hero on victim
q: hero carrying dynamite   s hero carrying dynamite on victim
t: hero carrying mouse      v hero carrying mouse on victim

x : hero at home
y : hero at home carrying dynamite
| : hero at home carrying mouse

0: empty  without hero
8: home   without hero
2: victim without hero

%: permanent wall
#: normal wall

โปรแกรมจะพิจารณาเฉพาะฮีโร่ที่เคลื่อนที่ไปทางขวา (การหมุนที่อธิบายในภายหลังจะดูแลทิศทางอื่น ๆ ) Bitmasks ได้รับการคัดเลือกอย่างรอบคอบเพื่อให้ตัวละครนั้นถูกแสดงด้วยตัวอักษรและสถานที่ที่เขาสามารถเคลื่อนย้ายไปตามหลัก (ยกเว้นฮีโร่ที่บ้านถือเหยื่อ แต่อีกครั้งนี้เป็นเจตนาเพื่อให้การเคลื่อนไหวเพียงอย่างเดียวของฮีโร่จะลดลง เหยื่อผู้เคราะห์ร้าย). /\pL\d/ดังนั้นเป็นฮีโร่ที่สามารถก้าวไปข้างหน้าโดยจะถูกจับคู่ สตริงย่อยที่ตรงกันจะต้องได้รับการแก้ไขเพื่อให้ฮีโร่และสิ่งที่เขาถืออยู่ถูกลบออกจากตัวละครตัวแรกและเพิ่มไปยังตัวที่สองซึ่งสามารถทำได้ด้วยบิตที่xorมีค่าเดียวกันสำหรับตัวละครทั้งสอง ค่า xor ประกอบด้วย bit hero ( 01000000), dynamite bit ( 00000001) และ bit mouse carry ( 00000100) พวกเขาช่วยกันorไป01000101ซึ่งเป็น EASCII ดังนั้นการย้ายฮีโร่จึงกลายเป็น:

s/\pL\d/$&^(E&$&)x2/e

พระเอกสามารถระเบิดผนังถ้าเขายืนอยู่ตรงหน้ามันและแบกระเบิด ( q, sหรือy) ฮีโร่จะสูญเสียไดนาไมต์ ( xorกับ00000001) และกำแพง#จะเปลี่ยนเป็นทางเดิน0(xor ด้วย00010011) ดังนั้น

s/(q|s|y)#/$&^"\x01\x13"/e

ในการจัดการทิศทางอื่นคณะกรรมการทั้งหมดจะถูกหมุน (จบลงด้วยการหมุนกระดาน$o):

my$o;$o.="\n"while s/.$/$o.=$&,""/meg

นอกเหนือจากการเคลื่อนไหวฮีโร่ยังมีตัวเลือกอื่น ๆ อีกมากมายที่เขาสามารถทำได้:

When at home, pick up dynamite:                   x -> y
When on victim not carrying anything pick him up: r -> t
When at home carrying a victim, drop him off:     | -> x

สิ่งนี้ทำได้โดย

y/xr|/ytx/

กระดานจะเสร็จสิ้นหากฮีโร่อยู่ที่บ้านโดยที่ไม่มีสิ่งใด ( x) และไม่มีผู้ประสบภัยมาช่วยเหลืออีก (ไม่มี2) สามารถทดสอบได้โดยสะดวก

/x/>/2/

เมื่อคณะกรรมการได้รับการแก้ไขฉันต้องการที่จะจำสถานะนี้และในตอนท้ายพิมพ์มัน เพื่อที่ฉันจะดำเนินการธง "แก้ไข" ใน$\และพิมพ์ว่าในตอนท้ายของโปรแกรมโดยไม่ต้องพิมพ์$_ดังนั้น

$\|=/x/>/2/  ...   }{

รัฐต้องดำเนินการที่ความดัน 0 จะถูกเก็บไว้ใน@0ที่ความดัน 1 @1ฯลฯ $%ความดันในปัจจุบันถูกเก็บไว้ใน การใช้$nหรือสิ่งที่ต้องการมันจะสั้น แต่รหัสไม่ทำงานถ้าตัวแปรไม่ได้เริ่มต้นที่จะอะไรเพราะ autovivification มิฉะนั้นจะมีการเปลี่ยนแปลง$nไปยัง reference.Looping ARRAY มากกว่ารัฐที่ความดันบางอย่างจะกระทำโดยใช้forและไม่ได้เป็นmapเพราะ ด้วยforคุณสามารถขยายอาร์เรย์ในขณะที่มันยังคงถูกลูปและจะรับองค์ประกอบใหม่ สิ่งนี้เป็นสิ่งจำเป็นเนื่องจากการหมุนและการเลือกฟิลด์เดียวของฮีโร่เกิดขึ้นในเวลา 0 และสิ้นสุดในอาร์เรย์ความดันเดียวกัน ดังนั้นการวนรอบสำหรับความดันที่กำหนดจึงกระทำโดย

for(@{$%}){...}

สิ่งนี้จะเกิดขึ้นซ้ำ ๆ จนกว่าความดันจะสูงถึง 1,000 หรือหาวิธีแก้ปัญหา:

$%++>999|$\||redo

สิ่งที่เหลืออยู่คือการเพิ่มสถานะที่ค้นพบใหม่ไปยังอาร์เรย์แรงดันตามลำดับ fที่จะทำได้โดยการย่อย เราเพียงต้องการเพิ่มสถานะหากยังไม่เห็น รัฐที่เคยเห็นมาก่อนจะถูกเก็บไว้ใน%a:

sub f{@a{@_}||=push@$n, @_}

$nแสดงถึงแรงกดดันใหม่สำหรับรัฐ ฉันจะได้รับจากสถานะที่ตัวแปร regex ยังคงเป็นผลมาจากการกระทำของฮีโร่ที่นำไปสู่การโทรนี้:

if $1 is set it was from s/(q|s|y)#/$&^"\x01\x13"/e which blows a wall -> 50
else if $& is set it was from s/\pL\d/$&^(E&$&)x2/e, so the hero moves.
    if $& contains 8 the hero went home -> 0
    else if the hero has carry bits (5) -> 2
    else                                   1
else ($& was not set) it was from y/xr|/ytx/r -> 0

สิ่งนี้นำไปสู่สูตรต่อไปนี้สำหรับ$n:

$%+($&?$1?50:$&=~8?0:$&&"5"?2:1:0)

การแทนที่ทั้งหมดจะได้รับrตัวแก้ไขเพื่อให้พวกเขาส่งคืนสถานะที่เปลี่ยนแปลงและปล่อยให้สถานะปัจจุบันอยู่$_คนเดียว fจะถูกเรียกในสถานะที่เปลี่ยนแปลงนี้ดังนั้นคุณจะได้รับรหัสเช่น

f y/xr|/ytx/r;

เนื่องจากการคำนวณ$nความต้องการของตัวแปร regex พวกเขาจะต้องเริ่มต้นเพื่อยกเลิกการตั้งค่าในกรณีที่การทดแทนไม่มีการเปลี่ยนแปลงอะไร (เพราะเงื่อนไขที่จะทำให้พวกเขาไม่ได้ปฏิบัติตาม) ฉันต้องไม่รับตัวแปร regex จากลูปก่อนหน้า ดังนั้นการแทนที่จะถูกห่อใน{}บล็อกเพื่อบันทึกและกู้คืนสถานะ regex นั่นเป็นวิธีที่คุณจะได้รับข้อความเช่น

{f s/\pL\d/$&^(E&$&)x2/er}

โดยเฉพาะอย่างยิ่งการหมุนถูกห่อดังนั้นจึงเรียกfโดยไม่ต้องตัวแปร regex และได้รับการสนับสนุนความดันเป็น 0

สิ่งเดียวที่ยังคงต้องทำคือทำสิ่งสำคัญให้@0กับสถานะเริ่มต้นเมื่อเริ่มต้น

f$_

นี่อยู่ในลูปหลักดังนั้นจึงพยายามเพิ่ม$_อาร์เรย์แรงดันในภายหลัง แต่เนื่องจากสถานะเริ่มต้นจะ%aไม่มีอะไรเกิดขึ้น

รวมกันทั้งหมดนี้โดยทั่วไปพบว่าวิธีการแก้ปัญหาที่สั้นที่สุดโดยใช้อัลกอริทึมของ Dijkstra มีปัญหาที่อาจเกิดขึ้นได้ รหัสปัจจุบันจะไม่เพิ่มสถานะถ้าค้นพบใหม่ด้วยความดันต่ำกว่าการค้นพบครั้งแรก ฉันไม่สามารถสร้างกระดานที่จะกระตุ้นเรื่องนี้ได้ แต่ก็ไม่สามารถพิสูจน์ได้ว่าเป็นไปไม่ได้


3
Ooo ที่รัก นี่สั้นกว่าที่คาดไว้อย่างมาก คุณสามารถเพิ่มคำอธิบายเล็กน้อยได้ไหม? ฉันไม่ได้ง้อ Perl จริงๆ
AdmBorkBork

3
@ TimmyD Ok คำอธิบายที่เพิ่มเข้ามามีรายละเอียดเพียงพอเพื่อให้แม้แต่ผู้ที่ไม่ใช่โปรแกรมเมอร์ควรได้รับความประทับใจอย่างน้อยในการทำงาน
Ton Hospel

1
ที่น่าประทับใจมาก!
Emigna

การเล่นกอล์ฟที่ยอดเยี่ยมมันน่าประทับใจจริง ๆ ... เมื่อฉันคิดว่าฉันไม่เลวในการเล่นกอล์ฟกับ Perl ฉันดูการตีกอล์ฟของคุณและความรู้สึกนั้นก็หายไปอย่างรวดเร็ว!
Dada

13

JavaScript, 863 834 785 781 ไบต์

บันทึก 29 ไบต์ขอบคุณ ETHproductions
บันทึก 53 ไบต์ขอบคุณจอร์แดน

L=[]
f=(S,r="",R="",p=0,s=S.replace(RegExp(r),R),l=`((.|\n){${s.split`
`[0].length}})`,q=p+1,o=p+2,n=p+50)=>s in L|p>999?1e3:!/M/.test(s,L[s]=0)&/E/.test(s)?p:Math.min(...[[/ E/,"me",q],[/ E/,"de",o],[/ME/,"ce",q],[/E /,"em",q],[/E /,"ed",o],[/EM/,"ec",q],[`E${l} `,"e$1m",q],[`E${l} `,"e$1d",o],[`E${l}M`,"e$1c",q],[` ${l}E`,"m$1e",q],[` ${l}E`,"d$1e",o],[`M${l}E`,"c$1e",q],[/ m/,"m ",q],[/m /," m",q],[`m${l} `," $1m",q],[` ${l}m`,"m$1 ",q],[/ (d|c)/,"$1 ",o],[/(d|c) /," $1",o],[`(d|c)${l} `," $2$1",o],[` ${l}(d|c)`,"$3$1 ",o],[/d#/,"m ",n],[/#d/," m",n],[`#${l}d`," $1m",n],[`d${l}#`,"m$1 ",n],[/mM/," c",q],[/Mm/,"c ",q],[`M${l}m`,"c$1 ",q],[`m${l}M`," $1c",q],[/[mc]e/," E",p],[/e[mc]/,"E ",p],[`e${l}[mc]`,"E$1 ",p],[`[mc]${l}e`," $1E",p]].map(a=>f(s,...a)))
F=s=>f(s)<1e3

รับอินพุตเป็นสตริงหลายบรรทัด

นี่เป็นการกำหนดฟังก์ชั่นนิรนามที่ใช้ฟังก์ชั่นวนซ้ำfเพื่อตรวจสอบว่าคุณเดินทางออกจากการเตือนภัยก่อนที่จะดึงหนูทั้งหมดออกหรือไม่ fผลตอบแทน1000ถ้าความดันมากกว่า 1,000 (เพื่อหลีกเลี่ยงการเรียกซ้ำไม่สิ้นสุด), ส่งกลับความกดดันหากไม่มีหนูที่จะช่วยเหลือและเมาส์ในทางออกอีกต่อไปและส่งกลับความดันขั้นต่ำของการเคลื่อนไหวที่เป็นไปได้ทั้งหมดจากสถานะปัจจุบันเป็นอย่างอื่น มันใช้อาร์เรย์Lเพื่อติดตามตำแหน่งที่เคยเยี่ยมชมแล้วซึ่งL[pos]==0ถ้ามันถูกเยี่ยมชมและไม่ได้กำหนดถ้ามันไม่ได้เป็น สิ่งนี้อาจไม่จำเป็น แต่ป้องกันไม่ให้เมาส์ทำการเคลื่อนไหวที่ไร้ประโยชน์และทิ้งข้อผิดพลาดการเรียกซ้ำอย่างน้อยที่สุด (นี่หมายความว่าคุณควรกำหนดใหม่Lหากคุณทำการทดสอบหลายครั้ง)

สิ่งนี้ใช้รูปแบบในคำถามอื่นนอกเหนือจากที่กำหนดให้คุณใช้อักขระอื่นสำหรับกำแพงภายนอก (มีอะไรอื่นนอกจาก# MEmecd)

รุ่นที่อ่านเพิ่มเติมได้:

stateList = []
f=(s,regex="",replacement="",pressure=0,state=s.replace(regexp(regex),replacement),line=`((.|\n){${state.split("\n")[0].length}})`)=>{
    if (state in stateList || pressure > 999) return 1e3
    if (!/M/.test(state) && /E/.test(state)) return pressure

    stateList[state] = 0

    return [
        [/ E/,"me",pressure+1],
        [/ E/,"de",pressure+2],
        [/ME/,"ce",pressure+1],
        [/E /,"em",pressure+1],
        [/E /,"ed",pressure+2],
        [/EM/,"ec",pressure+1],
        [`E${line} `,"e$1m",pressure+1],
        [`E${line} `,"e$1d",pressure+2],
        [`E${line}M`,"e$1c",pressure+1],
        [` ${line}E`,"m$1e",pressure+1],
        [` ${line}E`,"d$1e",pressure+2],
        [`M${line}E`,"c$1e",pressure+1],
        [/ m/,"m ",pressure+1],
        [/m /," m",pressure+1],
        [`m${line} `," $1m",pressure+1],
        [` ${line}m`,"m$1 ",pressure+1],
        [/ ([dc])/,"$1 ",pressure+2],
        [/([dc]) /," $1",pressure+2],
        [`([dc])${line} `," $2$1",pressure+2],
        [` ${line}([dc])`,"$3$1 ",pressure+2],
        [/d#/,"m ",pressure+50],
        [/#d/," m",pressure+50],
        [`#${line}d`," $1m",pressure+50],
        [`d${line}#`,"m$1 ",pressure+50],
        [/mM/," c",pressure+1],
        [/Mm/,"c ",pressure+1],
        [`M${line}m`,"c$1 ",pressure+1],
        [`m${line}M`," $1c",pressure+1],
        [/[mc]e/," E",pressure],
        [/e[mc]/,"E ",pressure],
        [`e${line}[mc]`,"E$1 ",pressure],
        [`[mc]${line}e`," $1E",pressure]
    ].map(a=>f(state,...a)).reduce((a,b)=>a-b<0?a:b) //reduce used for support in more browsers.
}
s=>f(s)>1e3

s in L|p > 999ช่องว่างที่ไร้ประโยชน์
Yytsi

@TuukkaX ขอบคุณที่เตือนฉันเกี่ยวกับเรื่องนั้น bytecount สำหรับรุ่นที่ไม่มีช่องว่างอยู่แล้ว
DanTheMan

ดูว่าคุณสามารถบันทึกไบต์โดยการตัดรหัสในevalและแทนที่@ด้วย$1(ไม่แน่ใจว่านี้จะทำงาน แต่คุณเขียน$1มาก)
Cyoce

ฉันคิดว่าคุณสามารถประหยัดได้โดยการทำfสายการบินf=(...)=>s in L|p>999?1e3:!/M/.test(s,L[s]=0)&/E/.test(s)?p:Math.min(...
ETHproductions

@Cyoce ฉันใช้$118 ครั้งและ.replace("@","$1")18 ไบต์ ฉันไม่เห็นวิธีที่จะดึงมันออก
DanTheMan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.