Nhìn mẹ! Tôi đã tạo hệ thống số (Cơ sở 10) của riêng mình! [đóng cửa]


21

Tất cả chúng ta đã làm điều đó, tốt, có thể không, nhưng làm cho ngôn ngữ và hệ thống đánh số người ngoài hành tinh của riêng bạn là một yếu tố chính của văn bản tưởng tượng, nhưng chủ yếu chỉ là một hoạt động vui vẻ.

Nhiệm vụ rất đơn giản, có hai đầu vào:

  1. Một đầu vào danh sách được sắp xếp gồm 10 [mười] 'số' duy nhất (bất kỳ ký tự ASCII có thể in nào) và diễn giải chúng, theo thứ tự, như các giá trị 0, 1, 2, 3, ..., 9

    + Có ngoại lệ cho những gì có thể là một chữ số ở đây. Toán tử số học (+, -, *, /), Dấu ngoặc đơn và dấu cách không thể được sử dụng làm một trong các số.

  2. Một vấn đề số học chỉ sử dụng những 'số' đó

Và xuất kết quả số nguyên tương đương trong mẫu đã cho.

Đây là một ví dụ:

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

Trong ví dụ, danh sách đầu vào (bạn có thể chọn dạng nào trong danh sách) của 'abcdefghij' tương ứng với '0123456789' giống như 'hjkloiwdfp' cũng sẽ tương ứng 1 với 1 với '0123456789' thay vì 'a' không, 'h' nào. Số học sau 'dịch' thành 123 + 456 + 789, bằng 1368. Điều này sau đó phải được xuất ra dưới dạng chúng tôi đã đưa ra, vì vậy b (đại diện cho 1) d (cho 2) g (cho 6) và i (cho số 8).

TRƯỜNG HỢP KIỂM TRA

abcdefghij
abc + def - ghij

-gedc
qwertyuiop
qwerty / uiop

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

y9|8

QUY TẮC THÊM

  • Lỗ hổng tiêu chuẩn bị cấm!
  • Đây là mã golf, vì vậy câu trả lời ngắn nhất trong byte thắng.
  • Phải là một chương trình hoặc chức năng đầy đủ lấy đầu vào và đầu ra ở bất kỳ định dạng nào phù hợp nhất với bạn. (Chỉ không thể thêm thông tin bổ sung vào các đầu vào, chỉ 'số' và biểu thức.
  • Sử dụng bất kỳ ngôn ngữ nào bạn thích (miễn là nó tuân thủ các quy tắc khác)

9
Trường hợp thử nghiệm thứ 2 cho thấy rằng đầu ra cuối cùng được làm tròn, nếu không thì kết quả sẽ là q.ioiopewioyetqorw.... Nếu vậy, nên làm tròn loại nào?
Arnauld

2
Để thêm vào quan điểm của @ SriotchilismO'Z cổ, chúng tôi cũng có một hộp cát vì lợi ích của bạn và của chúng tôi; mục đích là để cho cộng đồng giúp tinh chỉnh các thách thức trước khi chúng được đăng. Ý tưởng tốt đẹp cho một thách thức, mặc dù!
Giuseppe

3
Các ngôn ngữ khác nhau có thể đánh giá cùng một phương trình khác nhau, tôi không chắc có bất kỳ cách nào xung quanh nó. Ví dụ, T-SQL lợi nhuận 1cho 5/3, không 2, do phân chia số nguyên (không làm tròn). Điều này không làm mất hiệu lực thách thức, nhưng bạn có thể phải cho phép các câu trả lời chấp nhận được khác nhau cho cùng một trường hợp thử nghiệm (xem câu trả lời T-SQL của tôi bên dưới).
BradC

2
@Giuseppe Wow, tôi đã duyệt ngăn xếp này trong một thời gian dài và không bao giờ biết về điều đó! Chắc chắn sẽ rất hữu ích, đặc biệt là poster lần đầu tiên (người nghe lâu năm) mà tôi đang có. Sẽ ghi chú cho lần sau! Cảm ơn bình luận và câu trả lời của bạn.
Bill W

2
Một biến thể thú vị về điều này sẽ là một biến thể hỗ trợ bất kỳ cơ sở số nào, tùy thuộc vào độ dài của chuỗi đầu tiên trong đầu vào ...
Darrel Hoffman

Câu trả lời:


11

05AB1E , 10 9 byte

žh‡.Eò¹Åв

(Bây giờ) xuất ra dưới dạng một danh sách các ký tự.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

          # 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)

Phiên bản mới của 05AB1E là bản dựng được xây dựng trong Elixir . Các .Echức năng sẽ gọi call_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a), nơi Code.eval_stringlà một BUILTIN Elixir .

Lưu ý rằng phiên bản kế thừa của 05AB1E sẽ không hoạt động vì điều này được xây dựng bằng Python. Các số có số 0 đứng đầu sẽ không được đánh giá:
Xem tất cả các trường hợp thử nghiệm trong phiên bản cũ (sử dụng phiên bản 10 byte vì Åвnội dung dựng sẵn là mới).


8

R , 58 byte

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

Hãy thử trực tuyến!

Sử dụng dịch ký tự chartrđể hoán đổi các chữ số, parses và evals biểu thức, và sau đó chartrs trở lại các chữ số ban đầu.

Nếu làm tròn đến số nguyên gần nhất là bắt buộc, đây là

R , 65 byte

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

Hãy thử trực tuyến!


Sử dụng [như một tên ngắn hơn cho một chức năng với 3 tham số là rất thông minh. Làm tốt.
Robin Ryder

6

T-SQL, 117 byte

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

Ngắt dòng chỉ dành cho khả năng đọc.

Đầu vào là thông qua một bảng t có sẵn với các cột văn bản c (ký tự) và e (phương trình), theo các quy tắc IO của chúng tôi .

Sử dụng hàm SQL 2017 TRANSLATEđể chuyển đổi giữa các ký tự và tạo một chuỗi không chỉ chứa phương trình, mà cả mã để dịch trở lại các ký tự gốc:

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

Chuỗi này sau đó được đánh giá bằng cách sử dụng EXEC().

Có thể có một số ký tự (chẳng hạn như một trích dẫn ') sẽ phá vỡ mã này; Tôi đã không kiểm tra tất cả các ký tự ASCII có thể.

Theo thử thách, tôi đang đánh giá biểu thức như đã cho, tùy thuộc vào cách ngôn ngữ của tôi diễn giải các toán tử đó. Như vậy, trường hợp thử nghiệm thứ hai trả về 1 ( w) chứ không phải 2 ( e) do phân chia số nguyên.


4

Perl 6 , 38 byte

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

Hãy thử trực tuyến!

Tôi không chắc cách làm tròn được cho là hoạt động. Nếu nó vòng ở cuối sau đó tôi có thể thêm .roundcho 6 byte . Nếu hành vi của /nên khác nhau thì nó có thể dài hơn. Mất đầu vào như thế f(arithmetic)(numerals)(arithmetic).

Giải trình:

{                                    }  # 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 byte

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

Chạy và gỡ lỗi nó

Stax không làm tốt ở đây, thiếu một hướng dẫn "eval" thực sự. Nó có một cái gọi là "eval" trong các tài liệu, nhưng nó chỉ hoạt động trên các giá trị nghĩa đen, không phải biểu thức đầy đủ.


Điều này có thể không tuân theo quy tắc vận hành. Không chắc chắn nếu điều đó là bắt buộc? staxlang.xyz/ Kẻ
dana

@dana: Điểm tốt. Tôi đã không xem xét điều đó. Một bản sửa lỗi có khả năng tiêu tốn một số byte, vì vậy tôi sẽ chờ một số giải thích trước khi cố gắng thay đổi hành vi đó.
đệ quy

3

Bash, 97 byte

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

Có thể ít hơn nếu chúng ta có thể cắt ngắn, thay vì tròn. Cũng khó khăn để xử lý các số 0 đứng đầu (như trong trường hợp thử nghiệm # 2) vì Bash diễn giải các số bắt đầu bằng 0 là số bát phân.


Sự đồng thuận về việc sử dụng các tiện ích như "bc" và "tr" để chơi gôn là gì?
nhổ

1
Tôi không phải là chuyên gia, nhưng tôi nghĩ những loại câu trả lời đó thường được gửi dưới dạng "bash + coreutils"
Giuseppe

@Giuseppe trlà một phần của coreutils, trong khi bcthì không. Tuy nhiên, bclà một công cụ rất phổ biến. Tất cả các lệnh khác trong câu trả lời này là bash.
rexkogitans

-7 byte bị đánh cắp từ câu trả lời của @ CM, giảm '0123456789' xuống '0-9'
tăng

Xác định T không còn thuận lợi nữa: $Tchỉ ngắn hơn một byte so với 0-9, bạn chỉ sử dụng hai lần và bạn dành 8 byte để xác định nó.
ruds

2

Bean , 94 90 byte

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

Giải trình

Chương trình này hoàn toàn gán các dòng đầu tiên và thứ hai dưới dạng chuỗi cho các biến abtương ứng.

Mỗi ký tự ctrên dòng bđược thay thế bằng chỉ mục tương ứng icủa ký tự được tìm thấy trên dòng ahoặc chính nó nếu không tìm thấy.

Sau đó, nó loại bỏ từng chuỗi của một hoặc nhiều 0s trước một ranh giới từ chuỗi kết quả. Điều này là để ngăn chặn việc eval()đánh giá bất kỳ chuỗi chữ số nào bắt đầu bằng 0một số bát phân.

Sau eval()Math.round(), kết quả được buộc lại thành một chuỗi và mỗi ký tự chữ số iđược thay thế bằng ký tự tương ứng từ dòng atại chỉ mục i.

Các trường hợp thử nghiệm

Bản giới thiệu

abcdefghij
abcd + efg + hij

bdgi

Bản giới thiệu

abcdefghij
abc + def - ghij

-gedc

Bản giới thiệu

qwertyuiop
qwerty / uiop

e

Bản giới thiệu

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

y9|8


1

Perl 5 , 130 byte

sub f{eval sprintf"'%.0f'=~y/%s/%s/r",eval(eval(sprintf"\$_[1]=~y/%s/%s/r",@r=map"\Q$_",$_[0],'0123456789')=~s,\b0,,gr),reverse@r}

Hãy thử trực tuyến!

Có lẽ đôi eval bằng cách nào đó có thể được biến thành s/.../.../geer.


1

Than , 14 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Lưu ý: Biểu thức được đánh giá theo ngữ nghĩa Python 3, do đó, các số 0 đứng đầu trên các số khác không là bất hợp pháp. Giải trình:

   ⭆η           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

Thật không may, hàng đầu 0không hoạt động trong Python, hiện diện trong các trường hợp thử nghiệm.
Jonathan Allan

0

Python 3 , 137 byte

Một cách tiếp cận phi regex bằng cách sử dụng str.translatestr.maketransđể thay thế các ký tự. Tôi đã mất rất nhiều nhân vật trong việc cắt tỉa những con số không ...

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

Hãy thử trực tuyến!



0

Ngôn ngữ Wolfram (Mathicala) , 121 byte

Tôi định nghĩa một hàm thuần túy với hai đối số. Vì một số chức năng được lặp lại, tôi lưu chúng trong một biến để lưu một vài ký tự. Mã này chỉ đơn giản là thực hiện một số thay thế chuỗi và sau đó sử dụng ToExpressionđể đánh giá biểu thức với nhân Wolfram.

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

Hãy thử trực tuyến!


0

Lua , 162 151 150 byte

  • -11 byte nhờ ý tưởng của tôi về việc sử dụng loadthay vìfunction(...) end
  • -1 byte bằng cách bỏ dòng mới
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)')))

Hãy thử trực tuyến!

Không phải là điều ngắn nhất trên thế giới (Lua buộc bạn phải ưa thích khá khó khăn, đặc biệt là các từ khóa lớn), nhưng khá thú vị để tạo ra. Chương trình đầy đủ lấy đầu vào làm đối số và kết quả in.

Giải trình

Giới thiệu

l,p=...

Gán các giá trị từ các đối số cho các biến. Từ điển của chúng tôi là lvà biểu hiện làp .

Biểu hiện sau đây khá khó hiểu vì nó có thứ tự thực hiện kỳ ​​lạ, vì vậy tôi sẽ giải thích từng bước một:

Chuyển đổi sang số bình thường

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

Thực hiện thay thế trên chuỗi biểu thức: lấy từng ký hiệu và chuyển nó vào hàm ( loadchứng tỏ nó được rút ngắn hơn khai báo bình thường ở đây).

Hàm tìm vị trí xuất hiện trong chuỗi dict cho biểu tượng được truyền bằng cách sử dụng find. ...là đối số đầu tiên (và duy nhất) ở đây vì chúng ta đang ở trong hàm vaarg (bất kỳ loaded nào ) là biểu tượng hiện tại của chúng ta. Các đối số sau đây được yêu cầu findbỏ qua các ký hiệu đặc biệt ( 1chỉ là giá trị ngắn để đánh giá truekhi được chuyển đổi thành boolean): vị trí bắt đầu (một mặc định ở đây) và plainthực sự vô hiệu hóa xử lý mẫu. Không có những chương trình thất bại trong trường hợp thử nghiệm thứ ba do %đặc biệt.

Nếu tìm thấy kết quả khớp, trừ một chuỗi là chuỗi Lua (và mảng btw) là dựa trên 1. Nếu không tìm thấy kết quả khớp, nó sẽ trả về không có kết quả, dẫn đến không có sự thay thế nào được thực hiện.

Giải quyết

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

Chuẩn bị returncho biểu thức của chúng tôi để cho nó trả về kết quả, tính toán nó bằng cách biên dịch thành hàm Lua và gọi nó, thực hiện làm tròn (cách này quay ngược lại để làm cho nó ngắn hơn).

Cuối cùng, chúng ta có được một giải pháp số cho vấn đề của mình, chỉ chuyển đổi nó trở lại.

Làm cho nó điên trở lại

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

Dòng đầu tiên là một cách ngắn để chuyển đổi số thành chuỗi, vì vậy bây giờ chúng ta có thể gọi các phương thức chuỗi theo cách ngắn. Hãy làm như vậy!

Bây giờ gsubđược gọi một lần nữa để thay thế mọi thứ trở lại điên rồ. Thời gian %dnày được sử dụng thay vì .mẫu thay thế như chức năng của chúng tôi có thể và phải xử lý chỉ các số ( .sẽ dẫn đến lỗi trên các số âm). Hàm thời gian này ( loaded một lần nữa để lưu byte) trước tiên thêm 1vào vaargument đầu tiên (và duy nhất) của nó, chuyển đổi nó thành vị trí trong chuỗi dict, sau đó trả về ký tự từ vị trí đó.

Hoan hô, gần đến rồi!

Đêm chung kết kịch, hay Why Brackets Matter

print((ABOVE))

Vâng, tại sao hai cặp dấu ngoặc dù sao? Đã đến lúc nói về parall đào eh, nhiều lần trở lại ở Lua. Điều đó là một hàm có thể trả về một vài giá trị từ một cuộc gọi (xem câu hỏi meta này để biết thêm ví dụ).

Ở đây, cuối cùng gsubtrả về hai giá trị: chuỗi câu trả lời chúng ta cần và số lần thay thế được thực hiện (số lượng chữ số thực sự, nhưng ai quan tâm). Nếu không phải là cặp nội bộ, cả chuỗi và số sẽ được in, làm chúng tôi khó chịu. Vì vậy, ở đây chúng tôi hy sinh hai byte để bỏ qua kết quả thứ hai và cuối cùng là sản phẩm in của nhà máy điên rồ này.


Chà, tôi rất thích giải thích gần như chơi golf ở nơi đầu tiên, hy vọng bạn có những gì đang diễn ra ở đây.


Lưu ý: nó vượt qua tất cả các testcase, nhưng có lẽ làm tròn không chính xác ở những người khác. Nếu bạn có thể tìm thấy một, tôi sẽ sửa nó.
val nói Phục hồi lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.