Giải thích sự lặp lại!


11

Thử thách này là lần đầu tiên trong loạt hai thử thách về Sự lặp lại. Thứ hai sẽ sớm lên.

Trong một ngôn ngữ gọi là Lặp lại (một cái gì đó tôi vừa tạo ra), bao gồm một chuỗi vô tận 12345678901234567890..., với sự 1234567890lặp lại mãi mãi.

Cú pháp sau đây có sẵn cho các số đầu ra:

  • +-*/: Điều này chèn toán tử vào chuỗi các chữ số lặp lại.
    • Ví dụ:
      • +-> 1+2= 3(Việc +chèn a +giữa 12)
      • +*-> 1+2*3= 1+6= 7(Tương tự như trên, ngoại trừ hai toán tử được sử dụng ngay bây giờ)
      • /-> 1/2= 0(Lặp lại sử dụng phép chia số nguyên)
      • //-> 1/2/3= 0/3= 0(Lặp lại sử dụng "liên kết trái" với nhiều phép trừ và phép chia)
    • Mỗi toán tử được chèn sao cho nó có một chữ số ở bên trái, trừ khi có c(xem bên dưới).
  • c: Nối với chữ số tiếp theo trong chuỗi.
    • Ví dụ:
      • c+-> 12+3= 15(Chữ c"tiếp tục" 1và nối nó với chữ số tiếp theo 2, để tạo thành 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Chân đế để xử lý số.
    • Ví dụ:
      • (c+)*-> (12+3)*4= 15*4= 60(Lặp lại sử dụng thứ tự các thao tác)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Bỏ qua một số (loại bỏ số khỏi chuỗi vô hạn).
    • s+-> 2+3= 5( sbỏ qua 1)
    • csc-> 124(Các cconcats đầu tiên 12, sbỏ qua 3, và các cconcats cuối cùng 12để 4)
    • +s+-> 7(Lần đầu tiên +thêm 12thực hiện 3, sbỏ qua 3và cuối cùng +thêm 3vào 4để thực hiện 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

Trong các ví dụ trên, chỉ một lượng chữ số hữu hạn trong chuỗi vô hạn được sử dụng. Số chữ số được sử dụng tương đương với number of operators, concats and skips + 1.

Nhiệm vụ của bạn là, khi được cung cấp một chuỗi mã Lặp lại, đưa ra kết quả.

Ví dụ về đầu vào và đầu ra là:

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng!

Thông số kỹ thuật:

  • Bạn được đảm bảo rằng kết quả sẽ không bao giờ đi trên 2^31-1.
  • Bạn cũng được đảm bảo rằng đầu vào sẽ chỉ bao gồm các ký hiệu +-*/cs().
  • Một chương trình trống sẽ xuất ra 1.

Còn ~s thì sao? Đừng để chúng tôi treo.
Robert Fraser

@RobertFraser Rất tiếc, đó là một lỗi - c ban đầu là ~, nhưng có vẻ như tôi đã không sửa nó hoàn toàn.
clismique

1
@TonHosp Ooh, bạn đã có một điểm tốt ở đó. Biểu tượng "s" về cơ bản sẽ loại bỏ số mà nó được liên kết khỏi chuỗi vô hạn hoàn toàn, do đó, nó là có cho cả hai trường hợp.
clismique

2
Tuy nhiên, đặc điểm kỹ thuật của bạn nói s+2+3ví dụ đầu tiên. Và vẫn stiếp tục làm phiền tôi. Tôi tự hỏi làm thế nào +s()+mở rộng. Nếu đó là 1+(2)+4sau đó (đến trước 2nhưng smà đến ngay cả trước khi (bỏ qua dường như vẫn còn 3, không 2. Tuy nhiên, nếu kết quả là 1+(3)+4thì hiệu quả của một sphụ thuộc vào những gì xảy ra sau nó (so sánh với nó +s+)
TonMedel

1
sc23s+1+3? Có sbỏ qua 1bây giờ hay 2không? Tất cả các ví dụ sử dụng thao tác đầu tiên trên toán hạng 12... vì vậy scnên 13.
Tít

Câu trả lời:


4

JavaScript (ES6), 110 byte

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

Rất đơn giản, nhưng phép chia số nguyên thêm 25 byte. Vì một số lý do, một biểu thức chính quy trong JS không thể khớp cả phần đầu của chuỗi và ký tự đầu tiên, do đó cũng thêm một vài byte.

Làm thế nào nó hoạt động

  1. Chuẩn bị một không gian cho đầu vào.
  2. Nối chữ số tiếp theo cho mỗi ký tự (ngoại trừ )) không phải ngay trước a (.
  3. Xóa từng c, một chữ số + sở đầu ( 1s2-> 2) và mỗi s+ một chữ số ( 3s4-> 3).
  4. Biến mỗi hoạt động phân chia thành int-Division ( 1/2-> (1/2|0)).
  5. Đánh giá và trả lại.

OK ... chương trình của bạn có một lỗi ... ss+trả về 6, khi nó có nghĩa là trở lại 7( sBỏ qua hai cái, 12vì vậy, +thêm 34).
clismique

@ Qwerp-Derp Cảm ơn, đã sửa.
Sản phẩm ETH

Một cái gì đó giống như /^|,|$/gsẽ chỉ khớp một lần khi bắt đầu bởi vì cả hai trận đấu sẽ có cùng chỉ số. $không có cùng một vấn đề vì trận đấu có chỉ số lớn hơn bất kỳ trận đấu nào khác có thể.
Neil

0

Mẻ, 332 byte

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

Các hành vi slàm cho điều này rất khó xử. (Có lẽ csnên đánh giá đến 13-sđể -2?) Các biến:

  • s chuỗi đầu vào (được làm trống rõ ràng vì set / p không thay đổi biến nếu bạn không nhập bất cứ thứ gì)
  • ebiểu thức một phần trong số học số nguyên bình thường (mà chúng ta có thể chuyển qua set/adưới dạng eval)
  • d chữ số tiếp theo từ chuỗi chữ số vô hạn
  • rbên tay phải của nhà điều hành mới nhất. Chúng tôi không thể kết hợp điều này ngay lập tức vì (cần phải đến trước, nhưng chúng tôi cần lưu trữ nó để skhông làm tăng nó. May mắn là nó kết thúc làm cho việc xử lý )dễ dàng hơn một chút.
  • c nhân vật hiện tạ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.