Ukryj budynki

15

Krótsza wersja Skyscrapers Challenge

Zadanie

Biorąc pod uwagę tablicę wysokości budynków i dodatnią liczbę całkowitą k, znajdź wszystkie permutacje (bez duplikatów) wysokości, tak aby dokładnie kwidoczne były budynki.

Każdy budynek ukryje za sobą wszystkie budynki o mniejszej lub równej wysokości.

Każdy format wejściowy i wyjściowy jest prawidłowy.

Tablica wejściowa nigdy nie będzie pusta.

W przypadku, gdy nie można zobaczyć dokładnie tylu budynków, wypisz wszystko, co nie może być odpowiedzią, ale bez błędu.

Przykłady:

(Długość danych wyjściowych jest pokazana dla bardzo długich danych wyjściowych, ale dane wyjściowe powinny zawierać wszystkie możliwe kombinacje)

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

To jest golf golfowy, więc wygrywa najkrótszy kod

Opcjonalnie: jeśli to możliwe, możesz dodać coś takiego if length is greater than 20: print length else print answer. W stopce, nie w kodzie.

Wedant Kandoi
źródło
Czy wynikiem powinny być wszystkie kwalifikujące się permutacje, czy ich liczba?
Luis Mendo,
To powinny być wszystkie kwalifikujące się permutacje @LuisMendo
Vedant Kandoi
Sugerowana przypadek testowy: [1,2,3,4,5],5 -> [(1,2,3,4,5)]. Żaden z bieżących przypadków testowych nie zapewnia, że ​​odpowiedzi mogą obsłużyć pokazywanie wszystkich budynków (chociaż nie wiem, czy rzeczywiście mają z tym problem).
Kamil Drakari

Odpowiedzi:

6

05AB1E , 10 9 bajtów

œÙʒη€àÙgQ

Wypróbuj online lub zweryfikuj (prawie) wszystkie przypadki testowe (przekroczono limit [1,2,3,4,5,6,7,8,9],4czasu dla przypadków testowych ).
Stopka TIO robi to, o co OP pytał u dołu:

Opcjonalnie: jeśli to możliwe, możesz dodać coś takiego if length is greater than 20: print length else print answer. W stopce, nie w kodzie.

Wyjaśnienie:

œ            # 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)
Kevin Cruijssen
źródło
1
Imponujące, każdy bajt tutaj jest częścią drzewa funkcyjnego!
lirtosiast
1
@lirtosiast Tak, 05AB1E ma czasami dość krótkie wbudowania, które były idealne w tym wyzwaniu. :) W rzeczywistości jest bardzo podobny do twojej odpowiedzi w Pythonie. Zabawne jest to, że stopka if length is greater than 20: print length; else print answer;jest o ̶b̶y̶t̶e̶ ̶l̶o̶n̶g̶e̶r̶ o równej długości w porównaniu do samego programu. xD
Kevin Cruijssen
5

Haskell, 73 bajty

import Data.List
f n=filter((n==).length.nub.scanl1 max).nub.permutations

Wypróbuj online!

nimi
źródło
5

Galaretka , 12 10 bajtów

Œ!Q»\QL=ʋƇ

Wypróbuj online!

-2 bajty autorstwa @Erik the Outgolfer

Jest to funkcja dyadyczna, przyjmująca wysokości budynków kw tej kolejności.

Œ!                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.
lirtosiast
źródło
1
Witaj nowy ʋ! (jest dość starszy niż Ƈw rzeczywistości: P)
Erik the Outgolfer
4

Pyth, 18 16 bajtów

fqvzl{meSd._T{.p

Wypróbuj tutaj .

Zauważ, że wersja online interpretera Pyth zgłasza błąd pamięci w największym przypadku testowym.

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)
lirtosiast
źródło
Witamy spowrotem! :-)
Luis Mendo
2

Perl 6 , 81 63 bajtów

-18 bajtów dzięki nwellnhof!

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera dane wejściowe curry, np f(n)(list). To .unique(:with(*eqv*))irytująco długo:(

Wyjaśnienie:

{;                                                            }  # Anonymous code block
  *.permutations.unique(:with(*eqv*))  # From all distinct permutations
                                     .grep:{                 }  # Filter where
                                                set [\max] @_   # Visible buildings
                                            $_==      # Equals num
Jo King
źródło
1
FWIW, właśnie zgłosiłem problem z Rakudo , abyśmy mogli w ;końcu pozbyć się tego irytującego ;)
nwellnhof
2

Japt , 11 bajtów

á f_åÔâ Ê¥V

Wypróbuj online!

W przypadku dłuższych wyjść dodanie } ldo końca spowoduje wyświetlenie długości. Limit czasu interpretera online dla [1,2,3,4,5,6,7,8,9],4przypadku testowego jest niezależny od wyświetlania długości lub listy.

Wyjaśnienie:

á              :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
Kamil Drakari
źródło
1

JavaScript (ES6), 108 107 bajtów

Pobiera dane wejściowe jako (k)(array). Drukuje wyniki za pomocą 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)

Wypróbuj online!

Skomentował

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
Arnauld
źródło
0

Python 2 , 114 113 bajtów

lambda a,n:{p for p in permutations(a)if-~sum(p[i]>max(p[:i])for i in range(1,len(p)))==n}
from itertools import*

Wypróbuj online!

-1 bajt, dzięki ovs


Python 3 , 113 bajtów

lambda a,n:{p for p in permutations(a)if sum(v>max(p[:p.index(v)]+(v-1,))for v in{*p})==n}
from itertools import*

Wypróbuj online!

TFeld
źródło
0

J, 43 38 bajtów

-5 bajtów po uwzględnieniu optymalizacji z odpowiedzi Kevina na O5AB13

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

Wypróbuj online!

bez golfa

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

wyjaśnienie

po prostu wymieniamy wszystkie możliwe perms i.@!@#@] A. ], biorąc pod uwagę ich unikalne elementy ~., a następnie filtrujemy je według liczby widocznych budynków, które muszą być równe lewemu wejściowi.

kluczowa logika znajduje się w czasowniku nawiasowym, który oblicza liczbę widocznych budynków:

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

Tutaj używamy maksymalnego skanu, >./\aby zachować sumę najwyższego budynku do tej pory widzianego. Następnie po prostu bierzemy unikalne elementy maksymalnego skanu i jest to liczba widocznych budynków.

Jonasz
źródło