Стрибки з лілейної площадки


24

У цьому виклику вам потрібно імітувати жабу, яка стрибає туди-сюди на подушечках лілії. Ставок нескінченно великий, має лінію нескінченної кількості подушечок лілії, і жаба може перестрибувати стільки колодок лілії, скільки йому подобається.

Ця жаба любить стрибати вперед і назад: після стрибків вперед він завжди стрибає назад , і навпаки.

Вам передається список цілих чисел, який представляє його стрибки. Вам потрібно вивести результат його стрибків.

Наприклад, скажіть, що вас пройшли [2,3,6,8,2]:

Наша жаба починається зі стрибків 2 подушечок лілії вперед:

_2

Потім 3 подушечки лілії назад:

3__2

Потім 6 подушечок лілії вперед:

3__2__6

8 назад:

8_3__2__6

Потім, нарешті, 2 подушечки лілії вперед (зауважте, як 2 замінює 3):

8_2__2__6

Щоб бути більш чітким: ваш вхід - це масив чисел S, вам потрібно вивести S[K]в позиції S[K] - S[K-1] + S[K-2] - S[K-3]....

  • Якщо в певному місці потрібно друкувати кілька номерів, друкуйте лише одне з найвищим показником.
  • Ви повинні використовувати, _якщо певне місце порожнє
  • Якщо число має кілька цифр, воно не займає декілька місцеположень. (Іншими словами, місцезнаходження може складатися з декількох символів)
  • Ви можете припустити, що ваш список не порожній і що всі цілі числа перевищують 0.

Тестові приклади:

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

Це , тому відповідайте на нього якомога менше символів!


13
Цікаво, хто дивився Numberphile?
Okx

3
Тож для кожного відео номер Numberphile буде виклик тоді ...
Підтвердити


5
@Fatalize Я не бачу нічого поганого в цьому.
orlp

1

Відповіді:


9

MATL , 35 34 байт

Дякуємо @Emigna за збереження 1 байта!

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

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Як це працює

Гольф свій код, а не ваші пояснення!

Далі використовується вхідний [2,3,6,8,2]приклад. Щоб побачити проміжні результати у фактичному коді, ви можете вставити %(символ коментаря), щоб зупинити програму в цьому пункті та переглянути вміст стека. Наприклад, це показує стек після оператора Ys(сукупна сума).

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'

Я думаю, ви могли б зберегти два байти заміною '0'замість ' 0 ', тому що Xzвидаляє пробіли після
Б. Мехта,

1
@ B.Mehta Дякую Спочатку я зробив це, але , до жаль , вона не працює, тому що тоді '0'в '10'замінюється теж. Ось чому я додати початковий 32теж
Луїс Mendo

Ну звичайно, моя помилка
Б. Мехта

@ B.Mehta Ні, це було зовсім не зрозуміло з мого пояснення. Поясню це пізніше
Луїс Мендо

1
У поясненні інвертується масив mod 2. А також, не буде ' 0'так добре?
Емінья

4

PHP, 100 101 99 104 байт

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++]?:_;

приймає дані з аргументів командного рядка; бігати з -nr.

зламатися

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

Як це обробляє приклад прикладу 2,3,6,8,2, коли 8стрибки "назад" повз "початок" подушечок лілії?
AdmBorkBork

@AdmBorkBork PHP підтримує індекси негативного масиву.
Тит

Ах, не знав цього. Спасибі!
AdmBorkBork

4

JavaScript (ES6), 99 107 байт

Редагувати: Оскільки в ОП з'ясовано, що єдиним обмеженням повинна бути наявна пам'ять, це було оновлено, щоб виділити саме необхідний простір, а не покладатися на жорстко закодований максимальний діапазон.

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)

Як це працює

Ця функція працює в два проходи:

  • Під час першого проходу:

    • "Жаба вказівника" pініціалізується на 0.
    • xМінлива встановлюється в порожній рядок, так що всі спроби змінити його просто ігноруються.
    • Ми обчислюємо mі Mякі є, відповідно, мінімальними та максимальними значеннями, досягнутими p.
    • В кінці цього проходу: ми робимо рекурсивний дзвінок до f().
  • Під час другого проходу:

    • pініціалізовано до -m.
    • xвстановлюється масив розмірів M-m, заповнений _символами.
    • Вставляємо числа в правильних положеннях в x.
    • В кінці цього проходу: ми повертаємо об'єднану версію x, що є кінцевим результатом.

Тестові справи


Це не вдається для випадків, коли жаба стрибає нижче індексу -998 або вище 1002. Приклад: [1100]призводить до того, що число, надруковане у позиції, 1002замість позиції 1100.
nderscore

1
@nderscore Це фіксовано, ціною 8 байт.
Арнольд

приголомшливий! приємний метод також :)
nderscore

4

R , 100 97 96 байт

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='')}

Спробуйте в Інтернеті!

Рядок 1 знаходить усі позиції, куди слід стрибати. По-перше, всі стрибки у xперемножуються на 1 або −1, а потім перетворюються на кінцеві позиції за допомогою кумулятивного підсумовування. Вектор c(-1,1)переробляється за необхідності, однак, коли xдовжина 1, xзамість цього переробляється. Тому вважаються лише seq(x^0)(еквівалентні seq_along(x)) суми. (Попередження створюється, коли довжина xне кратна 2, але це не впливає на результат)

Лінія 2 збільшує позиції для стрибків так, щоб усі були принаймні 1.

Рядки 3 і 4 створюють вихід і друкують його.

-1 байт від Джузеппе


акуратний трюк з seq(x^0)!
Джузеппе

-p+1може бути 1-pна один байт менше.
Джузеппе

@Giuseppe Ах, безумовно, дякую!
Роберт Хакен

3

Javascript (ES6), 109 байт

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>

Прокоментував:

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 байт

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

Спробуйте в Інтернеті!

Як це працює

Спочатку він визначає кумулятивні місця стрибка:

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

Потім вони перетворюють їх на 0-базисні масиви, віднімаючи мінімальну кількість (але не більше 1) від усіх чисел:

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

Потім він створює масив із вхідними номерами, присвоєними цим індексам:

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

Нарешті, він об'єднує масив у рядок із підкресленням замість невизначених елементів:

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

3

Желе ,  28  24 байт

-2 (і надалі дозволяє ще -2) завдяки FrownyFrog (швидко використовуйте функцію [пост-виклик] програми префікса, Ƥ)

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

Спробуйте в Інтернеті! Повна програма, для тестового набору, що використовує однаковий функціонал, натисніть тут .

Як?

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

Примітки:

Остаточне з'єднання нового рядка - ;⁷це для випадків, коли _у висновку не з'являється жодна інформація , і в цьому випадку неявна друк відображатиме подання списку, наприклад [3, 1, 2, 4], а не щось на зразок прикладу _3125. Без жодної задньої нового рядка можна замінити ;⁷з , ;““щоб додати список списків символів, [[''],['']](не близько не потрібно , так як це останній символ програми).

Функція неправди, Ṭ, дає список з 1s на індексах, що вводяться, для єдиного натурального числа, n, що n-1 0 s, а потім 1дозволяє розмістити вхідні числа на правильній відстані зліва від множення. . Повернення, потрібно, щоб пізніші відвідування жаби замінювали замість попередніх , коли o/виконується скорочення з або .


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

ƤЦе не було особливістю, коли це було написано, але так, це спрацює. Краще UƤḅ€-(оскільки перетворення з бази -1 - це як множення на, ...,1,-1,1,-1,1,-1,1а потім підсумовування).
Джонатан Аллан

... або навіть UƤḅ-з тих пір, як векторизація :) (Я також пішов із простою реверсом, оскільки нам не потрібна складність упд, U)
Джонатан Аллан

1

APL (Dyalog Unicode) , 45 30 байт SBCS

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

Спробуйте в Інтернеті!

-\⍵сканувати аргумент з чергуванням -та+

(⊢ - 1 ⌊ ⌊/)від цього ( ) віднімаємо 1 або мінімум ( ⌊/), що б менше ( )

i← призначити i

⌈/ 1+ приріст і взяти максимум

⍴∘'_' створюють багато підкреслень

⍵@iпоставте числа з аргументу ( ) у позиціїi

∊⍕¨ відформатувати кожен і вирівняти


0

Рубін , 85 байт

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

Спробуйте в Інтернеті!

Записує позиції після кожного стрибка, перетворює отриманий масив у хеш для видалення дублікатів (зберігаючи останнє значення у кожній дублірованій позиції), а потім склеює значення з необхідною кількістю підкреслених.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.