Сховати будівлі


15

Коротка версія виклику «Хмарочоси»

Завдання

Враховуючи масив висот будівлі та додатне ціле число k, знайдіть усі перестановки (без дублікатів) висот такими, що kвидно саме будинки.

Будь-яка будівля приховає всі будівлі коротшої або однакової висоти за нею.

Будь-який формат для введення та виводу є дійсним.

Вхідний масив ніколи не буде порожнім.

Якщо неможливо побачити стільки ж будівель, виведіть все, що не може бути відповіддю, але помилки немає.

Приклади:

(Довжина виводу показана для дуже довгих результатів, але ваш вихід повинен бути усіма можливими перестановками)

input:[1,2,3,4,5],2
output: 50

input:[5,5,5,5,5,5,5,5],2
output: []

input:[1,2,2],2
output:[(1,2,2)]
Seeing from the left, exactly 2 buildings are visible.

input:[1,7,4],2
output:[(4, 7, 1), (1, 7, 4), (4, 1, 7)]

input:[1,2,3,4,5,6,7,8,9],4
output:67284

input:[34,55,11,22],1
output:[(55, 34, 11, 22), (55, 22, 34, 11), (55, 34, 22, 11), (55, 11, 34, 22), (55, 22, 11, 34), (55, 11, 22, 34)]

input:[3,4,1,2,3],2
output:31

Це код-гольф, тому виграє найкоротший код

Необов’язково: якщо можливо, можете додати щось подібне if length is greater than 20: print length else print answer. У нижньому колонтитулі, а не в коді.


Чи повинні виводити всі кваліфіковані перестановки чи їх кількість?
Луїс Мендо

Це повинні бути всі кваліфіковані перестановки @LuisMendo
Vedant Kandoi

Схожий тест: [1,2,3,4,5],5 -> [(1,2,3,4,5)]. Жоден із нинішніх тестових випадків не гарантує, що відповіді можуть підтримувати показ усіх будівель (хоча я не знаю, чи є у них насправді проблема з цим).
Каміль Дракарі

Відповіді:


6

05AB1E , 10 9 байт

œÙʒη€àÙgQ

Спробуйте в Інтернеті або перевірте (майже) всі тестові випадки (час випробувань [1,2,3,4,5,6,7,8,9],4).
Нижній колонтитул TIO робить те, що внизу запитував ОП:

Необов’язково: якщо можливо, можете додати щось подібне if length is greater than 20: print length else print answer. У нижньому колонтитулі, а не в коді.

Пояснення:

œ            # Permutations of the (implicit) input-list
             #  i.e. [1,2,2] → [[1,2,2],[1,2,2],[2,1,2],[2,2,1],[2,1,2],[2,2,1]]
 Ù           # Only leave the unique permutations
             #  i.e. [[1,2,2],[1,2,2],[2,1,2],[2,2,1],[2,1,2],[2,2,1]]
             #   → [[1,2,2],[2,1,2],[2,2,1]]
  ʒ          # Filter it by:
   η         #  Push the prefixes of the current permutation
             #   i.e. [1,2,2] → [[1],[1,2],[1,2,2]]
    ۈ       #  Calculate the maximum of each permutation
             #   i.e. [[1],[1,2],[1,2,2]] → [1,2,2]
      Ù      #  Only leave the unique maximums
             #   i.e. [1,2,2] → [1,2]
       g     #  And take the length
             #   i.e. [1,2] → 2
        Q    #  And only leave those equal to the second (implicit) input
             #   i.e. 2 and 2 → 1 (truthy)

1
Вражає, кожен байт тут є частиною дерева функцій!
lirtosiast

1
@lirtosiast Так, 05AB1E іноді має досить короткі вбудовані конструкції, які були ідеальними у цій проблемі. :) Це насправді дуже схоже на вашу відповідь Pyth, яку я бачу. if length is greater than 20: print length; else print answer;Найсмішніше , що нижній колонтитул - це ̶b̶y̶t̶e̶ ̶l̶o̶n̶g̶e̶r̶ однакової довжини порівняно з самою програмою. xD
Кевін Круїссен


5

Желе , 12 10 байт

Œ!Q»\QL=ʋƇ

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

-2 байти по @Erik The Outgolfer

Це діадична функція, яка приймає висоти будівлі і kв такому порядку.

Œ!                All permutations of first input
Œ!Q               Unique permutations of first input
   »\              Running maximum
     Q             Unique values
      L            Length of this array
       =           Equals k
        ʋ        Create a monad from these 4 links
   »\QL=ʋ        "Are exactly k buildings visible in arrangement x?"
         Ƈ     Filter if f(x)
Œ!Q»\QL=ʋƇ     All distinct perms of first input with k visible buildings.

1
Вітайте нове ʋ! (це набагато старше, ніж Ƈнасправді: P)
Ерік Аутгольфер

4

Піт, 18 16 байт

fqvzl{meSd._T{.p

Спробуйте тут .

Зауважте, що онлайн-версія інтерпретатора Pyth видає помилку пам'яті на найбільшому тестовому випадку.

f                       Filter lambda T:
  q                       Are second input and # visible buildings equal?
    v z                     The second input value
    l {                     The number of unique elements in
        m                   the maximums
          e S d             ...
          ._ T              of prefixes of T
    { .p                  over unique permutations of (implicit first input)

З поверненням! :-)
Луїс Мендо

2

Perl 6 , 81 63 байт

-18 байт завдяки nwellnhof!

{;*.permutations.unique(:with(*eqv*)).grep:{$_==set [\max] @_}}

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

Блок анонімного коду, який приймає криві введення, наприклад f(n)(list). Але .unique(:with(*eqv*))це дратує довго:(

Пояснення:

{;                                                            }  # Anonymous code block
  *.permutations.unique(:with(*eqv*))  # From all distinct permutations
                                     .grep:{                 }  # Filter where
                                                set [\max] @_   # Visible buildings
                                            $_==      # Equals num

1
FWIW, я щойно подав питання про Ракудо, щоб ми могли ;врешті позбутися цього докучливого ;)
nwellnhof

2

Japt , 11 байт

á f_åÔâ Ê¥V

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

Для більш тривалих результатів додавання } l до кінця замість цього виводить довжину. Онлайн-перекладач вичерпується на [1,2,3,4,5,6,7,8,9],4тестовий випадок, незалежно від розміру довжини чи списку.

Пояснення:

á              :Get all permutations
  f_           :Keep only ones where:
    åÔ         : Get the cumulative maximums (i.e. the visible buildings)
      â Ê      : Count the number of unique items
         ¥V    : True if it's the requested number

1

JavaScript (ES6), 108 107 байт

Вводиться як " (k)(array). Друкує результати за допомогою alert().

k=>P=(a,p=[],n=k,h=0)=>a.map((v,i)=>P(a.filter(_=>i--),[...p,v],n-(v>h),v>h?v:h))+a||n||P[p]||alert(P[p]=p)

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

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

k =>                        // k = target number of visible buildings
  P = (                     // P = recursive function taking:
    a,                      //   a[] = list of building heights
    p = [],                 //   p[] = current permutation
    n = k,                  //   n = counter initialized to k
    h = 0                   //   h = height of the highest building so far
  ) =>                      //
    a.map((v, i) =>         // for each value v at position i in a[]:
      P(                    //   do a recursive call:
        a.filter(_ => i--), //     using a copy of a[] without the i-th element
        [...p, v],          //     append v to p[]
        n - (v > h),        //     decrement n if v is greater than h
        v > h ? v : h       //     update h to max(h, v)
      )                     //   end of recursive call
    )                       // end of map()
    + a ||                  // unless a[] was not empty,
    n ||                    // or n is not equal to 0,
    P[p] ||                 // or p[] was already printed,
    alert(P[p] = p)         // print p[] and store it in P


0

J, 43 38 байт

-5 байт після включення оптимізації з відповіді Кевіна O5AB13

(]#~[=([:#@~.>./\)"1@])[:~.i.@!@#@]A.]

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

неозорий

(] #~ [ = ([: #@~. >./\)"1@]) ([: ~. i.@!@#@] A. ])

пояснення

ми просто перераховуємо всі можливі фізичні особи i.@!@#@] A. ], беручи з них Uniq елементи~. , а потім фільтруємо їх за кількістю видимих ​​будівель, яка повинна дорівнювати лівому входу.

Ключова логіка - це дієслово з дужкою, яке визначає кількість видимих ​​будівель:

([: #@~. >./\)

Тут ми використовуємо макс. Сканування, >./\щоб зберегти підрахунок найвищої будівлі, яку бачили досі. Тоді ми просто беремо унікальні елементи макс. Сканування, і це кількість видимих ​​будівель.

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