Lily pad melompat

24

Dalam tantangan ini, Anda perlu mensimulasikan katak melompat-lompat di atas bantalan lily. Kolamnya sangat besar, memiliki garis bantalan bunga bakung yang tak terhingga jumlahnya, dan katak dapat melompat sebanyak mungkin pada bantalan bunga bakung.

Katak ini suka melompat-lompat: setelah melompat ke depan, ia selalu melompat mundur , dan sebaliknya.

Anda melewati daftar bilangan bulat, yang mewakili lompatannya. Anda perlu menampilkan hasil lompatannya.

Misalnya, Anda lulus [2,3,6,8,2]:

Katak kami mulai dengan melompat 2 bantalan lily ke depan:

_2

Kemudian 3 bantalan lily kembali:

3__2

Kemudian 6 bantalan lily ke depan:

3__2__6

8 kembali:

8_3__2__6

Lalu akhirnya, 2 lily bantalan ke depan (perhatikan bagaimana 2 menimpa 3):

8_2__2__6

Agar lebih eksplisit: Input Anda adalah array angka S, Anda perlu menampilkan S[K]pada posisi S[K] - S[K-1] + S[K-2] - S[K-3]....

  • Jika beberapa nomor harus dicetak di lokasi tertentu, cetak hanya satu dengan indeks tertinggi.
  • Anda harus menggunakan _jika lokasi tertentu kosong
  • Jika suatu angka memiliki beberapa digit, maka ia tidak mengambil banyak lokasi. (Dengan kata lain, lokasi dapat terdiri dari beberapa karakter)
  • Anda dapat mengasumsikan bahwa daftar Anda tidak kosong, dan bahwa semua bilangan bulat lebih besar dari 0.

Kasus uji:

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

Ini adalah , jadi jawablah sesedikit mungkin dalam karakter!

Nathan Merrill
sumber
13
Saya ingin tahu siapa yang menonton Numberphile?
Okx
3
Jadi akan ada tantangan untuk setiap video Numberphile kemudian ...
Fatalize
5
Terkait :-P
Luis Mendo
5
@Fatalize Saya tidak melihat ada yang salah dengan itu.
orlp
1
Juga terkait ;-)
Arnauld

Jawaban:

9

MATL , 35 34 byte

Terima kasih kepada @Emigna untuk menghemat 1 byte!

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

Cobalah online! Atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Golf kode Anda, bukan penjelasan Anda!

Berikut ini menggunakan input [2,3,6,8,2]sebagai contoh. Untuk melihat hasil antara dalam kode aktual, Anda mungkin ingin menyisipkan %(simbol komentar) untuk menghentikan program pada saat itu dan melihat isi tumpukan. Sebagai contoh, ini menunjukkan stack after statement Ys(jumlah kumulatif).

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'
Luis Mendo
sumber
Saya pikir Anda bisa menghemat dua byte dengan mengganti '0'alih-alih ' 0 ', karena Xzmenghapus spasi setelah
B. Mehta
1
@ B.Mehta Terima kasih. Saya awalnya melakukan itu, tapi sayangnya itu tidak bekerja, karena maka '0'di '10'akan diganti juga. Itu sebabnya saya menambahkan inisial 32juga
Luis Mendo
Ah tentu saja, kesalahanku
B. Mehta
@ B.Mehta Tidak, tidak jelas sama sekali dari penjelasan saya. Saya akan mengklarifikasi itu nanti
Luis Mendo
1
Array mod 2 terbalik dalam penjelasan. Dan juga, tidak akan ' 0'bekerja dengan baik?
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++]?:_;

mengambil input dari argumen baris perintah; jalankan bersama -nr.

kerusakan

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
Titus
sumber
Bagaimana ini menangani contoh input 2,3,6,8,2, di mana 8lompatan "mundur" melewati "awal" bantalan bunga bakung?
AdmBorkBork
@AdmBorkBork PHP mendukung indeks array negatif.
Titus
Ah, tidak tahu itu. Terima kasih!
AdmBorkBork
4

JavaScript (ES6), 99 107 byte

Sunting: Karena OP mengklarifikasi bahwa satu-satunya batasan adalah memori yang tersedia, ini diperbarui untuk mengalokasikan ruang yang dibutuhkan secara tepat alih-alih mengandalkan rentang maksimum yang di-hardcoded.

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)

Bagaimana itu bekerja

Fungsi ini berfungsi dalam dua lintasan:

  • Selama operan pertama:

    • 'Frog pointer' pdiinisialisasi ke 0.
    • The xvariabel diatur ke string kosong, sehingga semua upaya untuk memodifikasinya hanya diabaikan.
    • Kami menghitung mdan Mmasing-masing nilai minimum dan maksimum yang dicapai oleh p.
    • Di akhir pass ini: kami melakukan panggilan rekursif ke f().
  • Selama umpan kedua:

    • pdiinisialisasi ke -m.
    • xdiatur ke array ukuran M-m, diisi dengan _karakter.
    • Kami memasukkan angka pada posisi yang benar di x.
    • Di akhir pass ini: kami mengembalikan versi gabungan x, yang merupakan hasil akhir.

Uji kasus

Arnauld
sumber
Ini gagal untuk kasus di mana katak melompat di bawah indeks -998 atau di atas 1002. Contoh: [1100]menghasilkan angka yang dicetak pada posisi 1002alih-alih posisi 1100.
nderscore
1
@nderscore Ini sudah diperbaiki, dengan biaya 8 byte.
Arnauld
luar biasa! metode yang bagus juga :)
nderscore
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='')}

Cobalah online!

Baris 1 menemukan semua posisi tempat melompat. Pertama, semua lompatan xdikalikan dengan 1 atau −1 dan kemudian ditransformasikan ke posisi akhir menggunakan penjumlahan kumulatif. Vektor c(-1,1)didaur ulang jika perlu, namun ketika xpanjang 1, xsebaliknya didaur ulang. Karenanya hanya jumlah seq(x^0)(setara dengan seq_along(x)) yang dipertimbangkan. (Peringatan dihasilkan ketika panjangnya xbukan kelipatan dari 2 tetapi itu tidak mempengaruhi hasil)

Baris 2 meningkatkan posisi melompat sehingga semuanya setidaknya 1.

Baris 3 dan 4 membuat output dan mencetaknya.

Byte1 byte dari Giuseppe

Robert Hacken
sumber
trik rapi dengan seq(x^0)!
Giuseppe
-p+1bisa kurang 1-pdari satu byte.
Giuseppe
@ Giuseppe Ah, pasti, terima kasih!
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>

Berkomentar:

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``
nderscore
sumber
3

Perl 6 , 68 67 byte

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

Cobalah online!

Bagaimana itu bekerja

Pertama menentukan lokasi lompatan kumulatif:

[[\+] |(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

Kemudian mengubahnya menjadi indeks array berbasis 0 dengan mengurangi angka minimum (tetapi paling banyak 1) dari semua angka:

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

Kemudian ia menciptakan array dengan nomor input yang ditetapkan untuk indeks tersebut:

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

Akhirnya menggabungkan array ke string, dengan garis bawah menggantikan elemen yang tidak ditentukan:

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

Jelly ,  28  24 byte

-2 (dan selanjutnya mengizinkan -2 lainnya) berkat FrownyFrog (gunakan fungsi [pasca-tantangan] dari aplikasi awalan cepat, Ƥ)

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

Cobalah online! Program lengkap, untuk test suite menggunakan fungsi yang sama, klik di sini .

Bagaimana?

ṚƤḅ-µ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

Catatan:

Rangkuman terakhir dari baris baru, ;⁷adalah untuk kasus-kasus ketika tidak ada yang _muncul dalam output, dalam hal ini cetakan tersirat akan menampilkan representasi daftar, misalnya [3, 1, 2, 4], daripada sesuatu seperti contoh _3125,. Karena tidak ada baris baru yang dapat diganti ;⁷dengan seseorang ;““untuk menambahkan daftar daftar karakter, [[''],['']](tidak diperlukan penutupan karena merupakan karakter terakhir dari suatu program).

Fungsi tidak benar, Ṭ, memberikan daftar dengan 1s pada indeks dalam inputnya, untuk bilangan alami tunggal, n yaitu n-1 0 s diikuti dengan 1memungkinkan nomor input ditempatkan pada jarak yang benar dari kiri dengan penggandaan . Pembalikan, , diwajibkan untuk memiliki kemudian katak-kunjungan menimpa daripada sebelumnya yang ketika pengurangan dengan atau, o/, dilakukan.

Jonathan Allan
sumber
1,-ṁ×µ+\UƤ_@/€?
FrownyFrog
Ƥbukan fitur pada titik ini ditulis, tetapi ya itu akan berhasil. Lebih baik adalah UƤḅ€-(karena konversi dari basis -1 seperti mengalikan dengan ...,1,-1,1,-1,1,-1,1dan kemudian menjumlahkan).
Jonathan Allan
... atau bahkan UƤḅ-sejak vektorisasi :) (Saya juga menggunakan reverse ,, karena kita tidak perlu kompleksitas upend, U)
Jonathan Allan
1

APL (Dyalog Unicode) , 45 30 byte SBCS

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

Cobalah online!

-\⍵memindai argumen dengan bolak-balik -dan+

(⊢ - 1 ⌊ ⌊/)dari itu ( ) kurangi 1 atau minimum ( ⌊/), mana yang lebih kecil ( )

i← ditugaskan kepada i

⌈/ 1+ kenaikan dan ambil yang maksimal

⍴∘'_' menghasilkan banyak garis bawah

⍵@iletakkan angka-angka dari argumen ( ) pada posisii

∊⍕¨ format masing-masing dan ratakan

ngn
sumber
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]}*''}

Cobalah online!

Merekam posisi setelah setiap lompatan, mengubah array yang dihasilkan menjadi hash untuk menghapus duplikat (mempertahankan nilai terakhir di setiap posisi yang digandakan), dan kemudian menempelkan nilai-nilai dengan jumlah garis bawah yang diperlukan.

Kirill L.
sumber
0

Python 2 , 113 110 byte

J=input()
i=sum(J)
l=['_']*2*i
v=i,
d=1
for j in J:i+=d*j;d=-d;l[i]=`j`;v+=i,
print''.join(l[min(v):max(v)+1])

Cobalah online!

TFeld
sumber