ค้นหาการแสดงตัวเลขที่สั้นที่สุดใน Modular SNUSP


10

พื้นหลัง

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

งาน

สำหรับวัตถุประสงค์ของการท้าทายนี้เป็นจำนวน Modular SNUSP คือสตริงที่เกิดขึ้นจากตัวละคร@, +และ=ยกเว้นว่าตัวอักษรตัวสุดท้ายเป็น#และที่ตัวละครสุดท้ายจะต้องเป็น+หรือ=(มันไม่สามารถเป็น@) ยกตัวอย่างเช่นตัวเลขที่ถูกต้อง ได้แก่@+#, ==#และ@@+@=#; ตัวอย่างของตัวเลขที่ไม่ถูกต้อง ได้แก่+=, และ@@#+?+#

ค่าของหมายเลข Modular SNUSP ถูกคำนวณแบบเรียกซ้ำดังนี้:

  • # มีค่าเป็น 0 (นี่คือกรณีพื้นฐาน)
  • ถ้าตัวเลขมีรูปแบบ=xสำหรับสตริงมูลค่าเท่ากับมูลค่าของxx
  • หากตัวเลขมีรูปแบบ+xสำหรับสตริงใด ๆxค่าของมันจะเท่ากับค่าของxบวก 1
  • ถ้าตัวเลขมีแบบฟอร์ม@cxสำหรับอักขระตัวเดียวcและสตริงxมูลค่าเท่ากับมูลค่าของแถมมูลค่าของxcx

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

ชี้แจง

  • เป็นไปได้ทั้งหมดที่จะมีมากกว่าหนึ่งสตริงที่มีค่าเท่ากันและโดยเฉพาะอย่างยิ่งสำหรับจำนวนเต็มบางตัวจะมีการผูกสำหรับหมายเลข Modular SNUSP ที่สั้นที่สุดด้วยค่านั้น ในกรณีเช่นนี้คุณสามารถส่งออกตัวเลขใด ๆ ที่เกี่ยวข้องกับการผูก
  • ไม่มีข้อ จำกัด เกี่ยวกับอัลกอริทึมที่คุณใช้เพื่อค้นหาหมายเลข ตัวอย่างเช่นการบังคับใช้สตริงที่โหดร้ายและการประเมินพวกเขาเป็นชั้นเชิงทางกฎหมาย แต่ก็ทำสิ่งที่ฉลาดกว่าเพื่อลดพื้นที่การค้นหา
  • ตามปกติใน PPCG การส่งของคุณอาจเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น (เลือกภาษาใดก็ได้ที่กระชับยิ่งขึ้น)
  • นี่ไม่ใช่ปัญหาเกี่ยวกับการจัดการรูปแบบอินพุตและเอาต์พุตดังนั้นคุณสามารถใช้วิธีการที่สมเหตุสมผลในการป้อนจำนวนเต็มที่ไม่ใช่ค่าลบและส่งออกสตริง มีคู่มือฉบับเต็มเกี่ยวกับเมตาแต่วิธีการทางกฎหมายที่ใช้กันมากที่สุด ได้แก่ ข้อโต้แย้งฟังก์ชัน / คืน, อาร์กิวเมนต์บรรทัดคำสั่งและอินพุต / เอาต์พุตมาตรฐานมาตรฐาน

กรณีทดสอบ

ต่อไปนี้เป็นตัวแทนที่สั้นที่สุดของตัวเลขสองสามตัวแรก:

  • 0 :#
  • 1 :+#
  • 2 :++#
  • 3 : +++#หรือ@++#
  • 4 : ++++#หรือ+@++#หรือ@=++#
  • 5 : @+++#หรือ@@++#
  • 6 : +@+++#หรือ+@@++#หรือ@=+++#หรือ@=@++#หรือ@@=++#
  • 7 : @++++#หรือ@+@++#
  • 8 : @@+++#หรือ@@@++#
  • 9 : +@@+++#หรือ+@@@++#หรือ@+++++#หรือ@++@++#หรือ@+@=++#หรือ@@=+++#หรือ@@=@++#
  • 10 : @=@+++#หรือ@=@@++#หรือ@@@=++#( นี่เป็นกรณีทดสอบที่สำคัญที่ควรตรวจสอบเนื่องจากมีคำตอบทั้งหมดที่เป็นไปได้=)
  • 11 : @+@+++#หรือ@+@@++#หรือ@@++++#หรือ@@+@++#
  • 12 : +@+@+++#หรือ+@+@@++#หรือ+@@++++#หรือ+@@+@++#หรือ@=+@+++#หรือ@=+@@++#หรือ@=@=+++#หรือ@=@=@++#หรือ@=@@=++#หรือ@@=++++#หรือ@@=+@++#หรือ@@=@=++#
  • 13 : @@@+++#หรือ@@@@++#
  • 14 : +@@@+++#หรือ+@@@@++#หรือ@=@++++#หรือ@=@+@++#หรือ@@+++++#หรือ@@++@++#หรือ@@+@=++#
  • 15 : @+@++++#หรือ@+@+@++#หรือ@@=@+++#หรือ@@=@@++#หรือ@@@=+++#หรือ@@@=@++#

เป็นกรณีการทดสอบใหญ่ออกจากการป้อนข้อมูลที่40ควรจะ@@@=@@+++#, @@@=@@@++#, หรือ@@@@=@+++#@@@@=@@++#

เงื่อนไขชัยชนะ

ในฐานะที่เป็นความท้าทายผู้ชนะคือรายการที่สั้นที่สุดวัดเป็นไบต์


1
=จะเกิดขึ้นได้อย่างเหมาะสมเท่านั้น@=ใช่ไหม
orlp

3
อย่างไรก็ตามความท้าทายเหล่านี้มักจะถูกโพสต์ในฐานะmetagolfที่สุดเนื่องจากแทบจะไม่มีคำตอบที่น่าสนใจ (เพียงแค่ประเมินสตริงและวนรอบสตริงที่เป็นไปได้ทั้งหมด)
orlp

3
@ orlp: ฉันไม่เห็นด้วยความท้าทายนี้จะง่ายเกินไปในฐานะ metagolf เนื่องจากการหาคำตอบที่ดีที่สุดนั้นค่อนข้างง่ายและ metagolf ไม่ได้มีข้อ จำกัด อื่นใดในการให้คะแนน ฉันคาดหวังว่าคำตอบส่วนใหญ่ของที่นี่จะเป็นเดรัจฉาน แต่สเปคนั้นซับซ้อนพอที่เดรัจฉานกำลัง a) อาจไม่สั้นและ b) น่าจะน่าสนใจที่จะเล่นกอล์ฟด้วยตัวของมันเอง หากคุณต้องการการเปลี่ยนแปลงในเงื่อนไขแห่งชัยชนะน่าจะเป็นสิ่งที่น่าสนใจอีกอย่างหนึ่งคือรหัสที่เร็วที่สุดและนั่นจะทำให้เข้าใจว่าเป็นความท้าทายที่แตกต่างออกไป

นอกจากนี้เรายังมีการแข่งขันกอล์ฟจำนวนมากสำหรับ Brain-flak ด้วยเช่นกัน
ASCII เท่านั้น

คำตอบ:


3

Oracle SQL 11.2, 341 262 ไบต์

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c,i)AS(SELECT'#',0,0,e,1 FROM e UNION ALL SELECT c||s,DECODE(c,'+',1,'@',p,0)+v,v,e,i+1 FROM n,e WHERE i<11)CYCLE s SET y TO 1 DEFAULT 0 SELECT s FROM n WHERE:1=v AND rownum=1;

เวอร์ชั่นเก่า

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c) AS(SELECT'#',0,0,e FROM e UNION ALL SELECT s||c,CASE c WHEN'+'THEN 1 WHEN'='THEN 0 WHEN'@'THEN p ELSE 0 END+v,v,e FROM n,e WHERE LENGTH(s)<10)CYCLE s SET y TO 1 DEFAULT 0 SELECT MIN(REVERSE(s))KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s))FROM n WHERE v=:1;

: 1 หมายเลขที่จะแสดงใน Modular SNUSP

ยกเลิกการตีลูก:

WITH e AS (SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),  
n(s,v,p,c,i) AS                   
(
  SELECT '#',0,0,e,1 FROM e
  UNION ALL
  SELECT s||c
       , DECODE(c,'+',1,'@',p,0)+v 
       , v
       , e
       , i+1
  FROM n,e
  WHERE i<11
) CYCLE s SET y TO 1 DEFAULT 0
SELECT s FROM n WHERE:1=v AND rownum=1;

ขั้นแรกให้สร้างมุมมองที่มี 3 บรรทัดหนึ่งรายการสำหรับแต่ละสัญลักษณ์ที่ใช้เพื่อแสดงตัวเลขลบ # ซึ่งใช้เฉพาะที่ส่วนท้ายของสตริง:

SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4;    

จากนั้นมุมมองแบบเรียกซ้ำ n จะสร้างสตริงทั้งหมดที่เป็นไปได้ด้วยสัญลักษณ์ 3 ตัวเชื่อมต่อกับ # และประเมินค่า

พารามิเตอร์คือ:

s: ตัวแทน Modular SNUSP ของจำนวนที่ถูกประเมิน
v: ค่าทศนิยมของ s ที่คำนวณโดยการวนซ้ำก่อนหน้านี้
p: v ที่คำนวณโดยการวนซ้ำ i-2
c: สัญลักษณ์ถัดไปเพื่อต่อกับ s
i: ความยาวของ s เท่านั้น จำเป็นต้องกำจัด LENGTH () สองจุดสำหรับการเล่นกอล์ฟ

DECODE(c,'+',1,'@',p,0)+v 

หากสัญลักษณ์สุดท้ายคือ + ให้เพิ่ม 1
หากเป็น @ ให้เพิ่มค่าของการทำซ้ำ i-2
อื่นสัญลักษณ์คือ # หรือ = v ถูกกำหนดค่าเริ่มต้นด้วย 0 ในส่วน init ของมุมมองแบบเรียกซ้ำดังนั้น v ใหม่จะเท่ากับ v ก่อนหน้าในกรณีใดกรณีหนึ่ง

WHERE i<11

ทุกสตริงที่เป็นไปได้ที่มีสัญลักษณ์ 3 ถูกคำนวณส่วนนี้รับประกันว่าการร้องขอจะไม่ทำงานจนกว่าจะเกิดวิกฤติใหญ่

CYCLE s SET y TO 1 DEFAULT 0

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

SELECT s FROM n WHERE:1=v AND rownum=1;

ส่งคืนการแทน Modular SNUSP แรกที่ประเมินเป็นจำนวนทศนิยมที่ป้อนเป็นพารามิเตอร์: 1

ในการทดสอบของฉันว่าบรรทัดแรกเป็นหนึ่งในตัวแทนที่สั้นที่สุด

ในกรณีฐานข้อมูลของคุณจะไม่ทำในลักษณะเดียวกันดังนั้นควรเปลี่ยนประโยคสุดท้ายด้วย

SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY i)FROM n WHERE:1=v

2

JavaScript (ES6), 100 ไบต์

n=>eval("for(a=[['#',0,0]];[[s,t,p],...a]=a,t-n;)a.push(['='+s,t,t],['+'+s,t+1,t],['@'+s,t+p,t]);s")

อัลกอริธึมการค้นหาแบบกว้างแรกที่เรียบง่าย


สำหรับ 40 จะส่งคืน "@@@@@ = ​​= # #" ซึ่งประเมินเป็น 42
aditsu ออกเนื่องจาก SE เป็นความชั่วร้าย

แม้แต่ 12 ก็ให้ "@@@ +++ #" ซึ่งประเมินถึง 13
aditsu ออกเพราะ SE เป็นความชั่วร้าย

อืมฉันคิดว่าการเปลี่ยนt<nไปใช้t-nงานอาจจะเป็น ...
Neil

2

Pyth, 41 ไบต์

L?b+ytb@[yttb001)Chb0+hfqQyTs^L"+@="UhQ\#

ชุดทดสอบ

มันทำงานอย่างไร:

มีสองส่วน ฟังก์ชั่นวนซ้ำซึ่งคำนวณค่าของนิพจน์ SNUSP โดยไม่มีการติดตาม#และชุดคำสั่งบังคับเดรัจฉาน

Evalutaion:

L?b+ytb@[yttb001)Chb0
L                        Define the function y(b) as follows
 ?b                      If b is nonempty
   +ytb                  The sum of y(tail(b)) and   # tail(b) = b[1:]
   @[       )            The element in the list at location
   Chb                   Character values of the first character.
                         Modular indexing means that 
                         + -> 3
                         @ -> 0
                         = -> 1
                         Index 2 is filler.
    [yttb001)            @ adds y(tail(tail(b)). Tail suppresses the error when
                         called on an empty list, so this treats @# as zero, but
                         this can't lead to problems because removing the @ will
                         always make the expression shorter.
                         + adds 1, = adds 0.
 0                       If b is the empty string, return 0

กำลังดุร้าย:

+hfqQyTs^L"+@="UhQ\#
               UhQ      0 ... Q     # Q is the input
        ^L"+@="         Map that list to all strings formed from the characters
                        "+@=", with that many characters.
       s                Concatenate
  fqQyT                 Filter for strings which evaluate to the input
 h                      Take the first success, which is the shortest due to
                        the order the strings were generated.
+                 \#    Add a '#' and output

1

CJam, 58

ri:M;'#0_]]{_{M&}#_)!}{;{~[2,+1$f+"@=+"\]z\f+\af.+~}%}w=0=

กำลังดุร้ายด้วยแรงบันดาลใจเล็กน้อยจากคำตอบของนีล ลองออนไลน์

รุ่นที่มีประสิทธิภาพ 107

ri0"#"a{_{:B\:A={'=A0j+}{A(B={'+B0j+}{AB>{BAB-j_N={'@\+}|}N?}?}?}{;_(0j'+\+a\,1>_W%.{j}Na-'@\f++{,}$0=}?}2j

ลองออนไลน์

สิ่งนี้ใช้การเขียนโปรแกรมแบบไดนามิก


1

Haskell , 89 86 ไบต์

แก้ไข:

  • -3 ไบต์: การซิปนั้นสั้นกว่าการจัดทำดัชนี

อีกวิธีแก้ปัญหากำลังดุร้ายซึ่งจบลงด้วยแรงบันดาลใจมากมายจากคำตอบของนีล (แม้ว่ามันจะทำงานได้ดีเหมือน Pyth ของ isaacg ก่อนที่จะเล่นกอล์ฟแนะนำl)

f n=[s|(a,_,s)<-l,a==n]!!0
l=(0,0,"#"):[(a+c,a,d:s)|(a,b,s)<-l,(c,d)<-zip[0,1,b]"=+@"]

ลองออนไลน์!

  • f เป็นฟังก์ชั่นหลักซึ่งใช้จำนวนเต็มและส่งกลับสตริง
  • lเป็นรายการที่ไม่มีที่สิ้นสุดของสิ่งอันดับ tuples การ(a,b,s)เป็นตัวแทนที่สั้นที่สุดsก่อนพร้อมกับคุณค่าaและคุณค่าbของการเป็นตัวแทนที่มีอักขระตัวแรกที่ถูกถอด (ตามที่คนอื่น ๆ ได้สังเกตเห็น / สังเกตเห็นว่ามันไม่เป็นอันตรายต่อการปฏิบัติหลังเป็น 0 สำหรับ#.)
  • องค์ประกอบขององค์ประกอบlอื่นที่ไม่ใช่องค์ประกอบแรกนั้นถูกสร้างขึ้นซ้ำ ๆ พร้อมกับความเข้าใจในรายการ dเป็นตัวละครที่จะใช้ได้กับsการสร้างตัวแทนใหม่ในรายการและ 'C' aเป็นเพิ่มขึ้นสอดคล้องกับ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.