Lily nhảy


24

Trong thử thách này, bạn cần mô phỏng một con ếch nhảy qua lại trên tấm lót lily. Cái ao là vô cùng lớn, có một dòng vô số miếng lily và con ếch có thể nhảy qua bao nhiêu miếng lily tùy thích.

Loài ếch này thích nhảy qua nhảy lại: sau khi nhảy về phía trước, nó luôn nhảy về phía sau và ngược lại.

Bạn được thông qua một danh sách các số nguyên, đại diện cho bước nhảy của anh ấy. Bạn cần phải đưa ra kết quả của bước nhảy của mình.

Ví dụ: giả sử bạn được thông qua [2,3,6,8,2]:

Ếch của chúng tôi bắt đầu bằng cách nhảy 2 miếng lily về phía trước:

_2

Sau đó, 3 miếng lily trở lại:

3__2

Sau đó, 6 miếng lily phía trước:

3__2__6

8 trở lại:

8_3__2__6

Cuối cùng, 2 miếng lily phía trước (chú ý cách 2 ghi đè lên 3):

8_2__2__6

Để rõ ràng hơn: Đầu vào của bạn là một dãy số S, bạn cần xuất ra S[K]tại vị trí S[K] - S[K-1] + S[K-2] - S[K-3]....

  • Nếu nhiều số được in ở một vị trí nhất định, chỉ in số có chỉ số cao nhất.
  • Bạn phải sử dụng _nếu một vị trí cụ thể trống
  • Nếu một số có nhiều chữ số, nó không chiếm nhiều vị trí. (Nói cách khác, một vị trí có thể bao gồm nhiều ký tự)
  • Bạn có thể giả sử rằng danh sách của bạn không trống và tất cả các số nguyên đều lớn hơn 0.

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

5                   ____5
2,2                 2_2
4,3,2,1             3124
5,3,2,1             _3125
2,3,6,8,2           8_2__2__6
10,3,12,4,1,12,16   ___12__3__10____41__1216
100,4,7,2,2         _______________________________________________________________________________________________4___1002_2

Đây là một , vì vậy hãy trả lời bằng càng ít ký tự càng tốt!


13
Tôi tự hỏi ai đã xem Numberphile?
Okx 23/2/2017

3
Vì vậy, sẽ có một thách thức cho mọi video Numberphile sau đó ...
Fatalize 23/2/2017


5
@Firthize Tôi thấy không có gì sai với điều đó.
orlp

1
Cũng liên quan ;-)
Arnauld

Câu trả lời:


9

MATL , 35 34 byte

Cảm ơn @Emigna vì đã tiết kiệm 1 byte!

32Oittn:oEq*Yst1hX<-Q(Vh' 0'95ZtXz

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

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

Golf mã của bạn, không phải giải thích của bạn!

Dưới đây sử dụng đầu vào [2,3,6,8,2]làm ví dụ. Để xem kết quả trung gian trong mã thực tế, bạn có thể muốn chèn %(ký hiệu nhận xét) để dừng chương trình tại thời điểm đó và xem nội dung ngăn xếp. Ví dụ, điều này cho thấy ngăn xếp sau câu lệnh Ys(tổng tích lũy).

32       % Push 32 (ASCII for space)
O        % Push 0
i        % Input array
         % STACK: 32, 0, [2,3,6,8,2]
t        % Duplicate
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2]
tn:      % Push [1 2 ... n] where n is length of input array
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,2,3,4,5]
o        % Modulo 2
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,0,1,0,1]
Eq       % Multiply by 2, subtract 1
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,-1,1,-1,1]
*        % Multiply elementwise
         % STACK: 32, 0, [2,3,6,8,2], [2,-3,6,-8,2]
Ys       % Cumulative sum
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1]
         % The top-most array is the positions where the entries of the second-top
         % array will be written. But postions cannot be less than 1; if that's
         % the case we need to correct so that the minimum is 1. If this happens,
         % it means that the frog has gone further left than where he started
t        % Duplicate
1hX<     % Append 1 and compute minimum. So if the original minimum is less than 1
         % this gives that minimum, and if it is more than 1 it gives 1
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1], -3
-        % Subtract
         % STACK: 32, 0, [2,3,6,8,2], [5 2 8 0 2]
Q        % Add 1
         % STACK: 32, 0, [2,3,6,8,2], [6 3 9 1 3]
(        % Assign values (top array) to specified positions (second-top) into array
         % which contains a single 0 (third-top). Newer values overwrite earlier
         % values at the same position
         % STACK: 32, [8 0 2 0 0 2 0 0 6]
V        % Convert to string. This produces spaces between the numbers
         % STACK: 32, '8 0 2 0 0 2 0 0 6'
h        % Concatenate with initial 32 (space). This converts to char
         % STACK: ' 8 0 2 0 0 2 0 0 6'
         % Thanks to this initial space, all zeros that need to be replaced by '_'
         % are preceded by spaces. (In this example that initial space would not
         % be needed, but in other cases it will.) Other zeros, which are part of
         % a number like '10', must not be replaced
' 0'     % Push this string: source for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 '
95       % Push 95 (ASCII for '_'): target for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 ', 95
Zt       % String replacement
         % STACK: ' 8_2__2__6'
Xz       % Remove spaces. Implicit display
         % STACK: '8_2__2__6'

Tôi nghĩ bạn có thể tiết kiệm hai byte bằng cách thay thế '0' thay vì ' 0 ', bởi vì Xzloại bỏ các khoảng trống sau
B. Mehta

1
@ B.Mehta Cảm ơn. Ban đầu tôi đã làm điều đó, nhưng tiếc là nó không làm việc, bởi vì sau đó '0'trong '10'được thay thế quá. Đó là lý do tại sao tôi thêm một ban đầu 32quá
Luis Mendo

Tất nhiên, lỗi của tôi
B. Mehta

@ B.Mehta Không, không có gì rõ ràng từ lời giải thích của tôi. Tôi sẽ làm rõ điều đó sau
Luis Mendo

1
Mảng mod 2 được đảo ngược trong phần giải thích. Và ngoài ra, sẽ không ' 0'làm việc như vậy?
Emigna

4

PHP, 100 101 99 104 byte

for($p=-1;$d=$argv[++$k];+$i<$p?:$i=$p,$x>$p?:$x=$p)$r[$p+=$k&1?$d:-$d]=$d;for(;$i<=$x;)echo$r[$i++]?:_;

lấy đầu vào từ các đối số dòng lệnh; chạy với -nr.

phá vỡ

for($p=-1;          // init position
    $d=$argv[++$k]; // loop $d through command line arguments
    +$i<$p?:$i=$p,          // 3. $i=minimum index
    $x>$p?:$x=$p            // 4. $x=maximum index
)
    $r[
        $p+=$k&1?$d:-$d     // 1. jump: up for odd indexes, down else
    ]=$d;                   // 2. set result at that position to $d
for(;$i<=$x;)           // loop $i to $x inclusive
    echo$r[$i++]?:_;        // print result at that index, underscore if empty

Làm thế nào để điều này xử lý đầu vào ví dụ 2,3,6,8,2, trong đó các 8bước nhảy "ngược" qua "bắt đầu" của các miếng lily?
admBorkBork

@AdmBorkBork PHP hỗ trợ các chỉ mục mảng âm.
Tít

À, không biết điều đó. Cảm ơn!
admBorkBork 23/2/2017

4

JavaScript (ES6), 99 107 byte

Chỉnh sửa: Vì OP đã làm rõ rằng giới hạn duy nhất phải là bộ nhớ khả dụng, điều này đã được cập nhật để phân bổ chính xác dung lượng cần thiết thay vì dựa vào phạm vi tối đa được mã hóa cứng.

f=(a,x='',p=M=0)=>a.map(n=>x[(p-=(i=-i)*n)<m?m=p:p>M?M=p:p]=n,i=m=1)&&x?x.join``:f(a,Array(M-m).fill`_`,-m)

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

Hàm này hoạt động trong hai lần:

  • Trong lần đầu tiên vượt qua:

    • 'Con trỏ ếch' p được khởi tạo thành 0.
    • Các x biến được thiết lập để một chuỗi rỗng, để tất cả những nỗ lực để sửa đổi nó chỉ đơn giản là bỏ qua.
    • Chúng tôi tính toán mMtương ứng là các giá trị tối thiểu và tối đa đạt đượcp .
    • Vào cuối của vượt qua này: chúng tôi thực hiện một cuộc gọi đệ quy đến f().
  • Trong lần vượt qua thứ hai:

    • p được khởi tạo để -m .
    • x được đặt thành một mảng kích thước M-m , chứa đầy các _ký tự.
    • Chúng tôi chèn các số tại các vị trí chính xác trong x .
    • Vào cuối của vượt qua này: chúng tôi trả lại một phiên bản đã tham gia x, đó là kết quả cuối cùng.

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


Điều này không thành công trong trường hợp ếch nhảy xuống dưới chỉ số -998 hoặc trên 1002. Ví dụ: [1100]dẫn đến số được in tại vị trí 1002thay vì vị trí 1100.
nderscore

1
@nderscore Điều này là cố định, với chi phí 8 byte.
Arnauld

tuyệt vời! phương pháp cũng hay :)
nderscore 24/2/2017

4

R , 100 97 96 byte

function(x){p=cumsum(x*c(1,-1))[seq(x^0)]
p=p+max(1-p,0)
v=rep('_',max(p));v[p]=x
cat(v,sep='')}

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

Dòng 1 tìm thấy tất cả các vị trí để nhảy. Đầu tiên, tất cả các bước nhảy trong xđược nhân với 1 hoặc −1 và sau đó được chuyển đổi sang các vị trí cuối cùng bằng cách sử dụng tổng cộng tích lũy. Vectơ c(-1,1)được tái chế nếu cần thiết, tuy nhiên, khi xcó độ dài 1, xđược tái chế thay thế. Do đó, chỉ các khoản tiền seq(x^0)(tương đương seq_along(x)) được xem xét. (Một cảnh báo được tạo khi chiều dài củax không phải là bội của 2 nhưng nó không ảnh hưởng đến kết quả)

Dòng 2 tăng các vị trí nhảy sao cho tất cả ít nhất là 1.

Dòng 3 và 4 tạo đầu ra và in nó.

Byte1 byte từ Giuseppe


Thủ thuật gọn gàng với seq(x^0)!
Giuseppe

-p+1có thể 1-pcho một byte ít hơn.
Giuseppe

@Giuseppe Ah, chắc chắn, cảm ơn!
Robert Hacken

3

Javascript (ES6), 109 byte

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value.split(/,/)))>
<datalist id=l><option value=5><option value="4,3,2,1"><option value="5,3,2,1"><option value="2,3,6,8,2"><option value="10,3,12,4,1,12,16"><option value="100,4,7,2,2"></datalist>

Đã bình luận:

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
                /* initialize output array [] and index j at -1: */  o=[],j=-1
     x.map((y,i)=> /* iterate over all items in input x (y=item, i=index) */  )
                      (j-=i%2?y:-y) /* update j +/-y based on if index i is odd */
                                   <0? /* if resulting j index is less than zero */
                                      o.unshift(...Array(-j)) /* prepend -j extra slots to the output array */
                                                             &0 /* and give result 0 */
                                                               :j /* else give result j */
                    j= /* assign result to j */
                  o[ /* assign y to output array at index j */   ]=y
   /* short-circuit && then spread output array to fill any missing entries */ &&[...o]
                                                      /* fill falsey slots with '_' */ .map(y=>y||'_')
                                                                         /* join with empty spaces */ .join``

3

Perl 6 , 68 67 byte

{(my @a)[[[\+] |(1,-1)xx*Z*$_].&{$_ X-min 1,|$_}]=$_;[~] @a X//"_"}

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

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

Đầu tiên, nó xác định các vị trí nhảy tích lũy:

[[\+] |(1,-1)xx*Z*$_]
                  $_  # Input array.          e.g.  2, 3, 6, 8, 2
      |(1,-1)xx*      # Infinite sequence:          1,-1, 1,-1, 1...
                Z*    # Zip-multiplied.       e.g.  2,-3, 6,-8, 2
 [\+]                 # Cumulative addition.  e.g.  2,-1, 5,-3,-1

Sau đó, nó biến chúng thành các chỉ số mảng dựa trên 0 bằng cách trừ số tối thiểu (nhưng nhiều nhất là 1) khỏi tất cả các số:

.&{$_ X-min 1,|$_}    #                       e.g.  5, 2, 8, 0, 2

Sau đó, nó tạo ra một mảng với các số đầu vào được gán cho các chỉ số đó:

(my @a)[   ]=$_;      #                       e.g.  8, Nil, 2, Nil, Nil, 2 Nil, Nil, 6

Cuối cùng, nó nối chuỗi thành một chuỗi, với dấu gạch dưới thay cho các phần tử không xác định:

[~] @a X//"_"         #                       e.g.  8_2__2__6

3

Thạch ,  28  24 byte

-2 (và tiếp tục cho phép -2 khác) nhờ FrownyFrog (sử dụng chức năng [thử thách sau] của ứng dụng tiền tố một cách nhanh chóng, Ƥ)

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷

Hãy thử trực tuyến! Chương trình đầy đủ, cho một bộ thử nghiệm sử dụng cùng chức năng, bấm vào đây .

Làm sao?

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷ - Main link: list a       e.g. [ 5, 3, 2, 1]
 Ƥ                       - prefix application of:
Ṛ                        -  reverse                e.g. [[5],[3,5],[2,3,5],[1,2,3,5]]
   -                     - literal minus one
  ḅ                      - from base (vectorises)  e.g. [ 5, 2, 4, 3]=
    µ                    - start a new monadic chain - call that list c
                         - [code to shift so minimum is 1 or current minimum]
     C                   - complement (vectorises) e.g. [-4,-1,-3,-2]
      Ṁ                  - maximum                 e.g.     -1
       »0                - maximum of that & zero  e.g.      0
         +               - add to c (vectorises)   e.g. [ 5, 2, 4, 3]
          µ              - start a new monadic chain - call that list d
           Ṭ€            - untruth €ach            e.g. [[0,0,0,0,1],[0,1],[0,0,0,1],[0,0,1]]
               ³         - the program input (a)
             ×"          - zip with multiplication e.g. [[0,0,0,0,5],[0,3],[0,0,0,2],[0,0,1]]
                Ṛ        - reverse                      [[0,0,1],[0,0,0,2],[0,3],[0,0,0,0,5]]
                 o/      - reduce with or          e.g. [0,3,1,2,5]
                    ”_   - '_'
                   o     - or (replace 0 with '_') e.g. ['_',3,1,2,5]
                      ;⁷ - concatenate a newline   e.g. ['_',3,1,2,5, '\n']
                         - implicit print

Ghi chú:

Sự kết hợp cuối cùng của một dòng mới, ;⁷dành cho các trường hợp khi không _xuất hiện trong đầu ra, trong trường hợp đó, bản in ẩn sẽ hiển thị một đại diện của danh sách, ví dụ [3, 1, 2, 4], chứ không phải là ví dụ như _3125. Để không có dòng mới, người ta có thể thay thế ;⁷bằng ;““cách nối thêm danh sách các danh sách nhân vật,[[''],['']] (không yêu cầu chặt chẽ vì đó là ký tự cuối cùng của chương trình).

Chức năng không thật, T, đưa ra một danh sách với 1s tại các chỉ số trong đó là đầu vào, đối với một số tự nhiên duy nhất, nn-1 0 s theo sau là một 1phép số đầu vào để được đặt ở khoảng cách chính xác từ cánh trái nhân . Sự đảo ngược, được yêu cầu để ghi lại các lần truy cập ếch sau đó thay vì ghi lại trước đó khi việc giảm bằng hoặc o/, được thực hiện.


1,-ṁ×µ+\UƤ_@/€?
FrownyFrog

Ƥkhông phải là một tính năng tại thời điểm này được viết, nhưng vâng, nó sẽ hoạt động. Tốt hơn là UƤḅ€-(vì chuyển đổi từ cơ sở -1 giống như nhân với ...,1,-1,1,-1,1,-1,1và sau đó tổng hợp).
Jonathan Allan

... hoặc thậm chí UƤḅ-kể từ vectơ :) (Tôi cũng đã đi ngược lại , vì chúng ta không cần sự phức tạp của upend, U)
Jonathan Allan

1

APL (Dyalog Unicode) , 45 30 byte SBCS

{∊⍕¨⍵@i⍴∘'_'⌈/1+i←(⊢-1⌊⌊/)-\⍵}

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

-\⍵quét đối số xen kẽ -+

(⊢ - 1 ⌊ ⌊/)từ đó ( ) trừ 1 hoặc tối thiểu ( ⌊/), giá trị nào nhỏ hơn ( )

i← giao cho i

⌈/ 1+ tăng và lấy tối đa

⍴∘'_' sản xuất mà nhiều dấu gạch dưới

⍵@iđặt các số từ đối số ( ) tại các vị tríi

∊⍕¨ định dạng từng và làm phẳng


0

Ruby , 85 byte

->a{i=1;j=c=0;a.map{|x|[c-=x*i=-i,x]}.to_h.sort.map{|x,y|[?_*[x+~j,0*j=x].max,y]}*''}

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

Ghi lại các vị trí sau mỗi lần nhảy, chuyển đổi mảng kết quả thành hàm băm để loại bỏ trùng lặp (giữ nguyên giá trị cuối cùng ở mỗi vị trí trùng lặp), sau đó dán các giá trị với số lượng dấu gạch dưới yêu cầu.


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.