ดูแม่! ฉันสร้างระบบเลขฐาน 10 ของตัวเอง! [ปิด]


21

เราทำมาทั้งหมดแล้วอาจจะไม่ใช่ แต่การสร้างภาษาต่างประเทศของคุณเองและระบบการนับเลขเป็นแก่นของการเขียนแฟนตาซีโดยเฉพาะ แต่ส่วนใหญ่เป็นเพียงกิจกรรมที่สนุกสนาน

งานง่าย ๆ รับสองอินพุต:

  1. อินพุตรายการที่เรียงลำดับแล้ว 10 [สิบ] ที่ไม่ซ้ำกัน 'ตัวเลข' (อักขระ ASCII ใด ๆ ที่พิมพ์ได้) และตีความตามลำดับเป็นค่า 0, 1, 2, 3, ... , 9

    + มีข้อยกเว้นสำหรับสิ่งที่สามารถเป็นตัวเลขได้ที่นี่ ตัวดำเนินการทางคณิตศาสตร์ (+, -, *, /), วงเล็บและช่องว่างไม่สามารถใช้เป็นหนึ่งในตัวเลขได้

  2. ปัญหาเกี่ยวกับเลขคณิตโดยใช้ 'ตัวเลข' เท่านั้น

และส่งออกผลลัพธ์จำนวนเต็มเทียบเท่าในรูปแบบที่กำหนด

นี่คือตัวอย่าง:

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

ในตัวอย่างรายการอินพุต (คุณสามารถเลือกรูปแบบรายการได้) ของ 'abcdefghij' ตรงกับ '0123456789' เช่นเดียวกับ 'hjkloiwdfp' จะตรงกับ 1 ถึง 1 กับ '0123456789' ซึ่งแทนที่จะเป็น 'a' ที่เชื่อมโยงกับ ศูนย์ 'h' ทำ เลขคณิตต่อไปนี้ 'แปล' เป็น 123 + 456 + 789 ซึ่งเท่ากับ 1368 จากนั้นจะต้องแสดงผลลัพธ์ในรูปแบบที่เราให้ดังนั้น b (ซึ่งแสดงถึง 1) d (สำหรับ 2) g (สำหรับ 6) และ i (สำหรับ 8)

กรณีทดสอบ

abcdefghij
abc + def - ghij

-gedc
qwertyuiop
qwerty / uiop

e
%y83l;[=9|
(83l * 9) + 8%

y9|8

กฎเพิ่มเติม

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

9
กรณีที่ 2 q.ioiopewioyetqorw...การทดสอบแสดงให้เห็นว่าผลสุดท้ายจะถูกปัดเศษมิฉะนั้นผลจะเป็น ถ้าเป็นเช่นนั้นควรปัดเศษแบบไหน
Arnauld

2
หากต้องการเพิ่มจุดของ @ SriotchilismO'Zaic เรายังมีกล่องทรายสำหรับประโยชน์และของเรา ความตั้งใจที่จะให้ชุมชนช่วยปรับแต่งความท้าทายก่อนที่จะโพสต์ ความคิดที่ดีสำหรับความท้าทาย แต่!
จูเซปเป้

3
ภาษาที่แตกต่างกันมีแนวโน้มที่จะประเมินสมการเดียวกันแตกต่างกันฉันไม่แน่ใจว่ามีวิธีใดอยู่รอบ ๆ ตัวอย่างเช่น T-SQL ส่งคืน1สำหรับ5/3ไม่ใช่2เนื่องจากการหารจำนวนเต็ม (ไม่ใช่การปัดเศษ) สิ่งนี้ไม่ได้ทำให้ความท้าทายเป็นโมฆะ แต่คุณอาจต้องอนุญาตคำตอบที่ยอมรับได้แตกต่างกันสำหรับกรณีทดสอบเดียวกัน (ดูคำตอบ T-SQL ของฉันด้านล่าง)
BradC

2
@Giuseppe ว้าวฉันได้เรียกดูสแต็กนี้มานานแล้วและไม่เคยรู้เลย! จะเป็นประโยชน์อย่างแน่นอนโดยเฉพาะอย่างยิ่งในฐานะผู้โพสต์ครั้งแรก (ผู้ฟังเป็นเวลานาน) ที่ฉันเป็น จะเก็บบันทึกไว้ในครั้งต่อไป! ขอบคุณสำหรับความคิดเห็นและคำตอบของคุณ
Bill W

2
รูปแบบที่น่าสนใจเกี่ยวกับเรื่องนี้จะเป็นหนึ่งที่สนับสนุนฐานหมายเลขใดขึ้นอยู่กับความยาวของสายแรกในการป้อนข้อมูลที่ ...
Darrel ฮอฟแมน

คำตอบ:


11

05AB1E , 10 9 ไบต์

žh‡.Eò¹Åв

(ตอนนี้) เอาท์พุทเป็นรายการของตัวละคร

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

          # Transliterate the second (implicit) input, replacing every character of 
           # the first (implicit) input with:
žh         # The builtin "0123456789"
   .E      # Then evaluate it as Elixir code
     ò     # Round it to the nearest integer
      ¹Åв  # And change it back by using a custom base-conversion with the first input as
           # base (which results in a character list)
           # (after which that result is output implicitly)

รุ่นใหม่ของ 05AB1E คือการสร้างคือการสร้างในยาอายุวัฒนะ .Eฟังก์ชั่นจะเรียกcall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)ที่เป็นยาอายุวัฒนะในตัวCode.eval_string

โปรดทราบว่ารุ่นเก่าของ 05AB1E จะไม่สามารถใช้งานได้เนื่องจากเป็นรุ่นที่สร้างใน Python ตัวเลขที่มี 0 นำหน้าจะไม่ได้รับการประเมิน:
ดูกรณีทดสอบทั้งหมดในเวอร์ชันดั้งเดิม (ซึ่งใช้รุ่น 10 ไบต์เนื่องจากบิวด์อินเป็นรุ่นÅвใหม่)


8

R , 58 ไบต์

function(d,s,`[`=chartr)'0-9'[d,eval(parse(t=d['0-9',s]))]

ลองออนไลน์!

ใช้การแปลอักขระchartrเพื่อสลับตัวเลขparseและevalการแสดงออกแล้วchartrกลับไปที่ตัวเลขเดิม

หากจำเป็นต้องปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงนี่คือ

R , 65 ไบต์

function(d,s,`[`=chartr)'0-9'[d,round(eval(parse(t=d['0-9',s])))]

ลองออนไลน์!


การใช้[ชื่อที่สั้นลงสำหรับฟังก์ชั่นที่มี 3 พารามิเตอร์นั้นฉลาดมาก ทำได้ดี.
Robin Ryder

6

T-SQL, 117 ไบต์

DECLARE @ CHAR(99)
SELECT @='SELECT TRANSLATE('+TRANSLATE(e,c,'0123456789')+',''0123456789'','''+c+''')'FROM t
EXEC(@)

การขึ้นบรรทัดใหม่มีไว้เพื่อให้สามารถอ่านได้เท่านั้น

การป้อนข้อมูลผ่านทางที่มีอยู่ก่อนตารางทีมีคอลัมน์ข้อความ (ตัวอักษร) และอี (สม) ต่อกฎ IO ของเรา

ใช้ฟังก์ชัน SQL 2017 TRANSLATEเพื่อสลับระหว่างอักขระและสร้างสตริงที่ไม่เพียง แต่มีสมการเท่านั้น แต่ยังมีรหัสเพื่อแปลกลับไปเป็นอักขระดั้งเดิม:

SELECT TRANSLATE(123 + 456 + 789,'0123456789','abcdefghij') 

EXEC()ข้อความนี้ได้รับการประเมินแล้วใช้

อาจมีอักขระบางตัว (เช่นอัญประกาศเดี่ยว') ที่จะทำลายรหัสนี้ ฉันไม่ได้ทดสอบอักขระ ASCII ที่เป็นไปได้ทั้งหมด

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


4

Perl 6 , 38 ไบต์

{*.trans($_=>^10).EVAL.trans(^10=>$_)}

ลองออนไลน์!

ฉันไม่แน่ใจว่าการปัดเศษควรจะทำงานอย่างไร ถ้ามันออกรอบได้ที่ท้ายที่สุดแล้วผมสามารถเพิ่ม.roundสำหรับ6 ไบต์ หากพฤติกรรมของ/ควรแตกต่างจากนั้นอาจนานขึ้น f(arithmetic)(numerals)(arithmetic)จะเข้าแกงกะหรี่เช่น

คำอธิบาย:

{                                    }  # Anonymous codeblock
 *                                      # Returning a whatever lambda
  .trans($_=>^10)       # That translates the numerals to digits
                 .EVAL  # Evaluates the result as code
                      .trans(^10=>$_)   # And translates it back again

3

Stax , 74 66 65 ไบต์

┼ö8Q#xóπcM~oÖ÷╦├mî☼yº─▐4ç≥e╘o▄ê‼ø_k╜ø8%N╫ ╗e<.╗P[─╛èA±!xêj«w╠°{B♪

เรียกใช้และแก้ไขข้อบกพร่อง

Stax ทำไม่ได้ดีที่นี่ไม่มีคำสั่ง "eval" ที่แท้จริง มันมีหนึ่งที่เรียกว่า "Eval" ในเอกสาร แต่จะทำงานเฉพาะกับค่าที่แท้จริงไม่ใช่การแสดงออกเต็มรูปแบบ


สิ่งนี้อาจไม่เชื่อฟังความมั่นใจของผู้ควบคุมเครื่อง ไม่แน่ใจว่าจำเป็นหรือไม่ staxlang.xyz/…
dana

@dana: จุดดี ฉันไม่ได้พิจารณาเรื่องนั้น การแก้ไขน่าจะมีค่าใช้จ่ายบางไบต์ดังนั้นฉันจะรอการชี้แจงบางอย่างก่อนที่จะพยายามเปลี่ยนพฤติกรรมที่
เรียกซ้ำ

3

Bash, 97 ไบต์

IFS=''
read S
read O
A=`echo "$O"|tr "$S" 0-9`
printf %0.f `bc<<<"(${A[@]##0})+0.5"`|tr 0-9 "$S"

อาจจะน้อยลงถ้าเราตัดทอนได้ ยังยุ่งยากในการจัดการเลขศูนย์นำหน้า (เช่นในกรณีทดสอบ # 2) เนื่องจาก Bash ตีความตัวเลขที่ขึ้นต้นด้วย 0 เป็นเลขฐานแปด


ฉันทามติเกี่ยวกับการใช้สาธารณูปโภคเช่น "bc" และ "tr" เพื่อเล่นกอล์ฟอย่างไร
spuck

1
ฉันไม่มีความเชี่ยวชาญ แต่ฉันคิดว่าประเภทที่ของคำตอบที่ถูกส่งมักจะเป็นสิ่งที่ชอบ "ทุบตี + coreutils"
จูเซปเป้

@Giuseppe trเป็นส่วนหนึ่งของ coreutils ในขณะที่bcไม่ได้เป็น อย่างไรก็ตามbcเป็นเครื่องมือที่พบบ่อยมาก คำสั่งอื่น ๆ ในคำตอบนี้คือทุบตี
rexkogitans

-7 ไบต์ถูกขโมยจากคำตอบของ @ CM ลด '0123456789' เป็น '0-9'
spuck

การกำหนด T ไม่มีประโยชน์อีกต่อไป: $Tมีความยาวเพียงหนึ่งไบต์0-9เท่านั้นคุณใช้สองครั้งเท่านั้นและคุณใช้เวลา 8 ไบต์เพื่อกำหนด
ปลุก

2

บีน , 94 90 ไบต์

hexdump

00000000: 53d0 80d6 d800 d3d0 80a0 1f20 8047 53a0  SÐ.ÖØ.ÓÐ. . .GS 
00000010: 1753 d080 d3d0 80a0 5e20 800a a181 8100  .SÐ.ÓÐ. ^ ..¡...
00000020: 40a0 5f52 cac3 4da0 6580 53d0 80a0 5d20  @ _RÊÃM e.SÐ. ] 
00000030: 8089 205f a065 205f 2080 0aa1 8181 0123  .. _ e _ ..¡...#
00000040: 0058 0020 800a a181 8102 40a0 6550 84a0  .X. ..¡...@ eP. 
00000050: 5d20 652e dce2 b02b dc64                 ] e.Üâ°+Üd

JavaScript

`${Math.round(
  eval(
    b.replace(
      /./g,
      c => ~(i = a.indexOf(c)) ? i : c
    ).replace(
      /\b0+/g,
      ''
    )
  )
)}`.replace(
  /\d/g,
  i => a[i]
)

คำอธิบาย

โปรแกรมนี้กำหนดบรรทัดแรกและบรรทัดที่สองเป็นสตริงให้กับตัวแปรโดยปริยาย aและbตามลำดับ

อักขระแต่ละตัวcบนบรรทัดbจะถูกแทนที่ด้วยดัชนีที่เกี่ยวข้องiของอักขระที่พบในบรรทัดaหรือตัวมันเองหากไม่พบ

จากนั้นจะลบแต่ละลำดับของหนึ่งหรือมากกว่านั้น0นำหน้าด้วยขอบเขตจากสตริงผลลัพธ์ นี่คือเพื่อป้องกันไม่ให้eval()ประเมินลำดับของตัวเลขใด ๆ ที่เริ่มต้นด้วย0ตัวอักษรฐานแปด

หลังจากeval()และMath.round()ผลลัพธ์จะถูกขู่เข็ญกลับเข้าไปในสตริงและอักขระแต่ละตัวiจะถูกแทนที่ด้วยอักขระที่สอดคล้องกันจากบรรทัดaที่ดัชนีiที่ดัชนี

กรณีทดสอบ

การสาธิต

abcdefghij
abcd + efg + hij

bdgi

การสาธิต

abcdefghij
abc + def - ghij

-gedc

การสาธิต

qwertyuiop
qwerty / uiop

e

การสาธิต

%y83l;[=9|
(83l * 9) + 8%

y9|8



1

ถ่าน 14 ไบต์

⍘UV⭆η⎇№θι⌕θιιθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด หมายเหตุ: นิพจน์ได้รับการประเมินตามซีแมนทิกส์ Python 3 ดังนั้นตัวอย่างเช่นเลขศูนย์นำหน้าเลขที่ไม่ใช่ศูนย์นั้นผิดกฎหมาย คำอธิบาย:

   ⭆η           Map over expression's characters and join
        ι       Current character
      №θ        Count matches in first input
     ⎇          If non-zero
         ⌕θι    Replace with position in first input
            ι   Otherwise keep character unchanged
 UV             Evaluate as Python 3
⍘            θ  Convert to base using first input as digits

น่าเสียดายที่ผู้นำ0ไม่ทำงานใน Python ซึ่งมีอยู่ในกรณีทดสอบ
Jonathan Allan

0

Python 3 , 137 ไบต์

วิธีการที่ไม่ใช่ regex ใช้str.translateและstr.maketransเพื่อแทนที่ตัวละคร ฉันสูญเสียอักขระจำนวนมากในการตัดค่าศูนย์นำหน้า ...

lambda s,t,d='0123456789',e=str.translate,m=str.maketrans:e(str(round(eval(' '.join(c.lstrip('0')for c in e(t,m(s,d)).split())))),m(d,s))

ลองออนไลน์!



0

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

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

(r=Thread[StringPartition[#,1]->(t=ToString)/@Range[0,9]];u[(u=StringReplace)[#2,r]//ToExpression//Round//t,Reverse/@r])&

ลองออนไลน์!


0

ลัว , 162 151 150 bytes

  • -11 ไบต์ขอบคุณที่ฉันใช้ loadแทนfunction(...) end
  • -1 ไบต์โดยเว้นบรรทัดใหม่
l,p=...print(((math.ceil(load('return '..p:gsub('.',load'n=l:find(...,1,1)return n and n-1'))()-0.5)..''):gsub('%d',load'c=...+1 return l:sub(c,c)')))

ลองออนไลน์!

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

คำอธิบาย

บทนำ

l,p=...

กำหนดค่าจากการขัดแย้งกับตัวแปร พจนานุกรมของเราเป็นและการแสดงออกเป็นlp

การแสดงออกต่อไปนี้ค่อนข้างยากที่จะเข้าใจเพราะมีลำดับการดำเนินการที่แปลกดังนั้นฉันจะอธิบายทีละขั้นตอน:

แปลงเป็นตัวเลขปกติ

p:gsub('.',
load'n=l:find(...,1,1)return n and n-1')

ดำเนินการแทนที่สายอักขระนิพจน์: นำแต่ละสัญลักษณ์และส่งไปยังฟังก์ชัน ( loadพิสูจน์ตัวเองว่าจะย่อให้สั้นกว่าการประกาศปกติที่นี่)

ฟังก์ชั่นพบว่าตำแหน่งของการเกิดขึ้นในสตริง Dict findสัญลักษณ์ผ่านการใช้ ...เป็นอาร์กิวเมนต์แรก (และเท่านั้น) ที่นี่เนื่องจากเราอยู่ในฟังก์ชัน vaarg (อันใดloadอันหนึ่งคือ) ที่เป็นสัญลักษณ์ปัจจุบันของเรา อาร์กิวเมนต์ต่อไปนี้จำเป็นต้องใช้เพื่อfindละเว้นสัญลักษณ์พิเศษ ( 1เป็นเพียงค่าสั้น ๆ ซึ่งประเมินว่าtrueเมื่อถูกแปลงเป็นบูลีน): ตำแหน่งเริ่มต้น (หนึ่งค่าเริ่มต้นที่นี่) และplainซึ่งปิดใช้งานการจัดการรูปแบบจริง ไม่มีโปรแกรมเหล่านั้นล้มเหลวในกรณีทดสอบที่สามเนื่องจาก%เป็นพิเศษ

หากพบการแข่งขันให้ลบออกหนึ่งรายการเป็นสตริง Lua (และอาร์เรย์ btw) ที่เป็น 1 หากไม่พบการจับคู่มันจะไม่ส่งคืนอะไรเลยทำให้ไม่ต้องทำการแทนที่

การแก้

math.ceil(load('return '..ABOVE)()-0.5)

นำหน้าreturnนิพจน์ของเราเพื่อให้ผลลัพธ์กลับมาคำนวณโดยรวบรวมเป็นฟังก์ชัน Lua และเรียกมันทำการปัดเศษ ( สิ่งนี้วิธีอื่น ๆ หันไปรอบ ๆ ให้สั้นลง)

ท้ายที่สุดเราจะได้คำตอบเชิงตัวเลขเกี่ยวกับปัญหาของเราเพียงแปลงกลับไปยังคงอยู่

ทำให้มันบ้าอีกครั้ง

(ABOVE..'')
:gsub('%d',load'c=...+1 return l:sub(c,c)')

บรรทัดแรกเป็นวิธีสั้น ๆ ในการแปลงตัวเลขเป็นสตริงดังนั้นตอนนี้เราสามารถเรียกใช้เมธอดสตริงได้แบบย่อ มาทำกันเถอะ!

ตอนนี้gsubถูกเรียกอีกครั้งเพื่อแทนที่ทุกอย่างกลับสู่ความวิกลจริต เวลา%dนี้ใช้แทน.รูปแบบการแทนที่เนื่องจากฟังก์ชันของเราอาจและต้องประมวลผลตัวเลขเท่านั้น ( .อาจส่งผลให้เกิดข้อผิดพลาดในจำนวนลบ) ฟังก์ชั่นเวลานี้ (เพิ่มloadอีกครั้งเพื่อบันทึกไบต์) เพิ่มครั้งแรก1 vaargument แรก (และเท่านั้น) ของมันแปลงเป็นตำแหน่งในสตริง dict แล้วส่งกลับอักขระจากตำแหน่งนั้น

ไชโยเกือบจะถึงแล้ว!

ฉากสุดท้ายของละครหรือทำไมต้องวงเล็บ

print((ABOVE))

อืม…ทำไมวงเล็บสองคู่ยังไงล่ะ? ถึงเวลาพูดถึงเรื่องพารัล…เอ๊ะกลับมาหลายครั้งในลัวะ สิ่งหนึ่งคือฟังก์ชั่นหนึ่งอาจคืนค่าสองสามค่าจากการโทรหนึ่งครั้ง (ดูที่คำถามเมตานี้เพื่อดูตัวอย่างเพิ่มเติม)

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


ฉันสนุกกับการอธิบายมากพอ ๆ กับการเล่นกอล์ฟตั้งแต่แรกหวังว่าคุณจะได้สิ่งที่เกิดขึ้นที่นี่


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