Một chuyến tàu đi qua một cây cầu được dán nhãn


9

Hãy xem xét một cây cầu có chiều dài B được hình thành bởi các ô được dán nhãn bằng các chữ số của các số nguyên dương được nối với nhau. Ví dụ: nếu B là 41, thì nó sẽ trông như thế này:

-----------------------------------------
12345678910111213141516171819202122232425

Bây giờ hãy tưởng tượng một chuyến tàu dài T băng qua cầu. Điểm ngoài cùng bên trái của tàu bắt đầu từ vị trí X (1-index). Để hiểu rõ hơn về vấn đề, chúng ta hãy lập sơ đồ của sự kiện, với B = 41, T = 10, X = 10 . Tàu được vẽ bằng các dấu bằng ( =) và đường thẳng:

         __________
         | ======== |
         | ======== |
-----------------------------------------
12345678910111213141516171819202122232425

Tàu có thể tiến lên, ở mỗi bước, bằng tổng số gạch duy nhất mà nó được đặt trên đó. Ví dụ: các ô mà tàu đứng ở trên là : [1, 0, 1, 1, 1, 2, 1, 3, 1, 4], các ô duy nhất (được lặp lại) là : [1, 0, 2, 3, 4], và tổng của chúng là 10. Do đó, tàu có thể tiến lên bằng 10gạch. Chúng ta nên vẽ lại và lặp lại quá trình cho đến khi điểm ngoài cùng bên trái của tàu đã vượt qua ô cuối cùng:

                   __________
                   | ======== |
                   | ======== |
-----------------------------------------
12345678910111213141516171819202122232425

Tổng các ô độc đáo: 1 + 5 + 6 + 7 + 8 + 9 = 36. Tàu tiến lên 36 ô ...

                                                       __________
                                                       | ======== |
                                                       | ======== |
-----------------------------------------
12345678910111213141516171819202122232425

Tàu rõ ràng đã đi qua cầu hoàn toàn, vì vậy chúng ta nên dừng ngay bây giờ.

Vì những người bên trong đang buồn chán, họ đếm những viên gạch mà tàu đã nâng cao mỗi lần. Trong trường hợp cụ thể này, 1036. Tổng kết mọi thứ, tàu đã di chuyển 46trước khi qua cầu.


Bài tập

Cho ba số nguyên dương, B (chiều dài cầu), T (chiều dài tàu) và X (vị trí bắt đầu, 1 chỉ số ), nhiệm vụ của bạn là xác định số lượng tàu đã di chuyển cho đến khi vượt qua cầu theo quy tắc ở trên.

  • Bạn có thể cho rằng:
    • B là cao hơn so với T .
    • X là thấp hơn so với B .
    • T ít nhất là 2 .
    • Tàu cuối cùng qua cầu.
  • Tất cả các quy tắc tiêu chuẩn của chúng tôi áp dụng.
  • Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

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

Đầu vào ([B, T, X]) -> Đầu ra

[41, 10, 10] -> 46
[40, 10, 10] -> 46
[30, 4, 16] -> 24
[50, 6, 11] -> 50

Một ví dụ khác cho trường hợp thử nghiệm cuối cùng:

Cây cầu có chiều dài 50, tàu 6 và vị trí bắt đầu là 11.

          ______
          | ==== |
          | ==== |
--------------------------------------------------
12345678910111213141516171819202122232425262728293

Gạch độc đáo: [0, 1, 2]. Tổng: 3.

             ______
             | ==== |
             | ==== |
--------------------------------------------------
12345678910111213141516171819202122232425262728293

Gạch độc đáo: [1, 2, 3, 4]. Tổng: 10.

                       ______
                       | ==== |
                       | ==== |
--------------------------------------------------
12345678910111213141516171819202122232425262728293

Gạch độc đáo: [1, 7, 8, 9]. Tổng: 25.

                                                ______
                                                | ==== |
                                                | ==== |
--------------------------------------------------
12345678910111213141516171819202122232425262728293

Gạch độc đáo: [9, 3]. Tổng: 12.
                                                            ______
                                                            | ==== |
                                                            | ==== |
--------------------------------------------------
12345678910111213141516171819202122232425262728293

Tàu tồn tại cầu. Tổng cộng: 3 + 10 + 25 + 12 = 50.

6
Cuối cùng chúng ta có thể cho rằng tàu không qua cầu không? Đối với đầu vào như (200, 2, 169), tàu bị kẹt 00ở trong …9899100101102….
Lynn

@Lynn Một chút muộn, vâng, bạn có thể.
Ông Xcoder

Câu trả lời:


3

Husk , 20 byte

ṁ←U¡S↓←moΣuX_⁰↓Θ↑ṁdN

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

Mất ba đối số theo thứ tự T , B , X .

Giải trình

ṁ←U¡S↓←moΣuX_⁰↓Θ↑ṁdN
                 ṁdN    Build the list of digits of natural numbers
              ↓Θ↑       Take the first B digits, add a 0 in front
                        then drop the first X digits
           X_⁰          Get all sublists of length T
       moΣu             Map the sum of unique values of each sublist

   ¡S↓←                 Repeatedly drop as many elements from the start of the list as the
                        first element of the list says;
                        keep all partial results in an infinite list.

  U                     Take elements until the first repeated one
                        (drops tail of infinite empty lists)

ṁ←                      Sum the first elements of each remaining sublist

6

Con trăn 2 , 110 105 104 103 100 97 96 byte

  • Đã lưu năm byte nhờ ông Xcoder ; loại bỏ sự phân công không cần thiết, chuyển phủ định vào khoảng trắng có sẵn.
  • Đã lưu một byte nhờ ông Xcoder ; golfed [~-x:x+~-t]tới [~-x:][:t].
  • Đã lưu một byte; golfed ...range(1,-~b)))[:b]tới ...range(b)))[1:-~b].
  • Đã lưu ba byte; golfed [1:-~b][~-x:]tới [:-~b][x:].
  • Đã lưu ba byte; chơi gôn[:-~b][x:]tới [x:-~b].
  • Đã lưu một byte nhờ Lynn ; chơi golf whilevòng lặp đến một exectuyên bố.
b,t,x=input();S=x;exec"x+=sum(set(map(int,''.join(map(str,range(b)))[x:-~b][:t])));"*b;print-S+x

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


Một giải pháp dài 105 byte thay thế .
Jonathan Frech

104 byte . [~-x:x+~-t]có thể được thay thế bởi[x-1:][:t]
Ông Xcoder

exec"x+=sum(set(map(int,''.join(map(str,range(b)))[x:-~b][:t])));"*bhoạt động trong 96. (Tàu sẽ không bao giờ mất nhiều bbước để rời khỏi cây cầu và toàn bộ hoạt động sẽ kéo x+=0dài hơn một lần khi nó rời đi.)
Lynn

4

Haskell, 106 102 byte

import Data.List
(b#t)x|x>b=0|y<-sum[read[c]|c<-nub$take t$drop(x-1)$take b$show=<<[1..]]=y+(b#t)(x+y)

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

(b#t)x
   |x>b=0                 -- if the train has left the bridge, return 0
   |y<-sum[   ]           -- else let y be the sum of
      read[c]|c<-         -- the digits c where c comes from
        nub               -- the uniquified list of
            show=<<[1..]] -- starting with the digits of all integers concatenated
          take b          -- taking b digits (length of bridge)
         drop(x-1)        -- dropping the part before the train
        take t            -- take the digits under the train
     =y+(b#t)(x+y)        -- return y plus a recursive call with the train advanced

3

R , 123 byte

function(B,T,X){s=substring
while(X<B){F=F+(S=sum(unique(strtoi(s(s(paste(1:B,collapse=''),1,B),K<-X+1:T-1,K)))))
X=X+S}
F}

Chỉ cần thực hiện các thuật toán được mô tả.

R là khá khủng khiếp ở chuỗi.

function(B,T,X){
 s <- substring                         # alias
 b <- s(paste(1:B,collapse=''),1,B)     # bridge characters
 while(X<B){                            # until we crossed the bridge
  K <- X+1:T-1                          # indices of the characters
  S <- s(b,K,K)                         # the characters from b
  S <- sum(unique(strtoi(S)))           # sum
  F <- F + S                            # F defaults to 0 at the beginning
  X <- X + S                            # advance the train
 }
 F                                      # number of steps, returned
}

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


2

Thạch ,  22  21 byte

ḣ⁵QS
RDẎḣ⁸ṫṫÇ‘$$ÐĿÇ€S

Một chương trình đầy đủ lấy ba đối số - thứ tự là B , X , T - in kết quả.

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

Làm sao?

ḣ⁵QS - Link 1, calculate next jump: list of digits, bridge under and beyond train's left
 ⁵   - program's fifth command line argument (3rd input) = T (train length)
ḣ    - head to index (get the digits of the tiles under the train)
  Q  - de-duplicate
   S - sum

RDẎḣ⁸ṫṫÇ‘$$ÐĿÇ€S - Main link: number, B (bridge length); number, X (starting position)
R                - range(B) = [1,2,3,...,B-1,B]
 D               - to decimal list (vectorises) = [[1],[2],[3],...,[digits of B-1],[digits of B]]
  Ẏ              - tighten (flatten by one) = [1,2,3,...,digits of B-1,digits of B]
    ⁸            - chain's left argument, B
   ḣ             - head to index (truncate to only the bridge's digits)
     ṫ           - tail from index (implicit X) (truncate from the train's left)
           ÐĿ    - loop, collecting results, until no more change occurs:
          $      -   last two links as a monad:
         $       -     last two links as a monad:
       Ç         -       call last link (1) as a monad (get next jump)
        ‘        -       increment
      ṫ          -     tail from that index (remove the track to the left after train jumps)
             Ç€  - call last link (1) as a monad for €ach (gets the jump sizes taken again)
               S - sum
                 - implicit print

1

JavaScript (ES6), 117 byte

f=(B,T,X,g=b=>b?g(b-1)+b:'',o=0)=>X<B?[...g(B).substr(X-1,T)].map((e,i,a)=>o+=i+X>B|a[-e]?0:a[-e]=+e)&&o+f(B,T,X+o):0

Một cặp hàm đệ quy:

  1. f() tổng hợp các động thái của tàu.
  2. g() tạo chuỗi số.

Ít chơi gôn hơn:

f=
(B,T,X,
 g=b=>b?g(b-1)+b:'',                       //creates the string of numbers
 o=0                                       //sum of tiles the train sits on
)=>
  X<B?                                     //if we're not past the bridge:
      [...g(B).substr(X - 1,T)].map(       //  grab the tiles we're sitting on
        (e,i,a)=>o += i + X > B |          //  if we've passed the bridge,
                      a[-e] ? 0 :          //  ... or we've seen this tile before, add 0 to o
                              a[-e] = +e   //  else store this tile and add its value to o
      ) &&
      o + f(B,T,X+o) :                     //recurse
  0


0

PHP> = 7.1, 153 byte

<?$s=substr;[,$p,$q,$r]=$argv;while($i<$p)$a.=++$i;$a=$s($a,0,$p);;while($r<$p){$x+=$n=array_sum(array_unique(str_split($s($a,$r-1,$q))));$r+=$n;}echo$x;

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

Để làm cho nó tương thích với các phiên bản thấp hơn của PHP, hãy đổi [,$p,$q,$r]=thành list(,$p,$q,$r)=(+4 byte).

<?
[,$bridgelen,$trainlen,$position] = $argv;                  // grab input
while($i<$bridgelen)                                        // until the bridge is long enough...
  $bridgestr .= ++$i;                                       // add to the bridge
$bridgestr = substr($bridgestr,0,$bridgelen);               // cut the bridge down to size (if it splits mid-number)
while($position<$bridgelen){                                // while we are still on the bridge...
  $currtiles =                                              // set current tiles crossed to the...
    array_sum(                                              // sum of tiles...
      array_unique(                                         // uniquely...
        str_split(substr($bridgestr,$position-1,$trainlen)) // under the train
      )
    )
  ;
  $totaltiles += $currtiles;                                // increment total tiles crossed
  $position += $currtiles;                                  // set new position
}
echo $totaltiles;                                           // echo total tiles crossed
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.