Знову Хеллоуїн!


10

опис проблеми

Всі ми любимо Twix (тому що це найкраща цукерка), але це перший Хеллоуїн для дітей --- ми повинні захопити принаймні один із них для кожного типу цукерок. Кожного Хеллоуїна всі мешканці проспекту Numberline надсилають електронний лист із повідомленням, які види цукерок вони будуть дарувати цього року.

Ой! І ми живемо в 1D світі.

Будучи надзвичайно ледачим в деяких аспектах, а не в інших, ми склали карту будинків, надаючи їх положення вздовж вулиці. Ми також відзначили види цукерок, які вони мають. Ось карта, яку ми зробили за цей рік:

 [(-2, {"Kisses", "KitKats"}),
 (1, {"KitKats", "Peanut Butter Cups"}),
 (6, {"Kisses", "Twix"}),
 (9, {"Skittles"}),
 (10, {"Twix"})]

Для маленьких ніжок дітей нам потрібно знайти найкоротшу прогулянку, починаючи з будь-якого будинку в околицях, щоб зібрати хоча б одну з усіх цукерок.

Приклади

На прохання декількох користувачів (включаючи Shaggy) я розкажу кілька прикладних прикладів Сподіваємось, це все прояснить. :) Вхід:

 [(-2, {"Kisses", "KitKats"}),
 (1, {"KitKats", "Peanut Butter Cups"}),
 (6, {"Kisses", "Twix"}),
 (9, {"Skittles"}),
 (10, {"Twix"})]

Вихід:

[1, 2, 3]

Ще одна карта та рішення ...

Вхід:

[(-3, {"KitKats", "Twix"}),
(-1, {"Hundred Grands"}),
(3, {"Kisses"}),
(12, {"Hundred Grands", "Twix", "KitKats"})]

Вихід :

[0, 1, 2]

Ми могли б почати в координатному 9 будинку збирати цукерки до будинків 6 та 1. Це заповнює квоту цукерок, пройшовши 8 одиниць, але чи це найкоротше рішення?

Правила

Записи повинні взяти аналогічно структурований єдиний аргумент до прикладу та вивести індекси будинків для відвідування у найкоротшому рішенні.

Застосовуються типові правила гольфу: найкоротше правильне рішення в байтах!

PS Це питання про інтерв'ю, яке мені дала одна з найбільших світових технологічних компаній. Якщо вам не подобається гольф, спробуйте знайти рішення часу (O * k)), де k - кількість типів цукерок, а n - кількість будинків.

Редагувати

Як зазначав Джонатан Аллан, існує певна плутанина навколо того, що означає "індекси" в даному випадку. Ми хочемо вивести позиції будинків у списку аргументів, а не їх координати на смузі.


6
Для цього потрібен відпрацьований приклад та деякі тестові приклади.
Кошлатий

2
Чи можемо ми взяти два аргументи; перелік домашніх номерів та відповідний перелік видів цукерок?
Адам

1
@KevinCruijssen Ні: виведіть індекси будинків для відвідування в найкоротшому рішенні
Adám

2
Я припускав, що "індекси" та "позиції" були синонімами (тобто, що адреси, що нам слід повернути, на Авеню Нумелійн), це не так?
Джонатан Аллан

1
@KevinCruijssen Чудові питання! Цифри гарантовано впорядковані на вводі. І я допущу припущення, що на струнах не міститься цифр, оскільки всі цукерки, які я знаю, з цифрами прописують їх (Сто грандів і три мушкетери). :)
Qfwfq

Відповіді:


3

Желе , 16 байт

ŒPṪ€ẎQLƲÐṀẎISƊÞḢ

Монадична посилання, що приймає вхід, як описано у списку, відсортованому від найнижчих до найвищих будинків авеню Numberline (якщо нам потрібно прийняти будь-яке замовлення, ми можемо передбачити ), що дає найкоротший шлях, починаючи від будинку з найменшим номером і просуваючись по Авеню.

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

Якщо ми хочемо знайти всі такі найкоротші шляхи, то замінимо байти,, ÞḢна ÐṂ; це також 16 байт.

Як?

ŒPṪ€ẎQLƲÐṀẎISƊÞḢ - Link: list of [index, candies]
ŒP               - power-set
        ÐṀ       - keep those for which this is maximal:
       Ʋ         -   last four links as a monad:
  Ṫ€             -     tail €ach -- this removes the candies lists from the current list
                 -                  and yields them for use now
    Ẏ            -     tighten (to a flat list of candies offered by these hoses)
     Q           -     de-duplicate (get the distinct candies offered)
      L          -     length (how many distinct candies are on offer)
              Þ  - sort (now just the indexes of remaining sets due to Ṫ) by:
             Ɗ   -   last three links as a monad:
          Ẏ      -     tighten (to a flat list of indexes since Ṫ leaves a list behind)
           I     -     incremental differences (distances between houses)
            S    -     sum
               Ḣ - head (get the first)

1
Приємно. Для вашого пояснення, я думаю, ви маєте на увазі максимум для другого швидкого.
Нік Кеннеді

Так, я і зробив.
Джонатан Аллан


2

05AB1E , 22 байти

æʒ€θ˜I€θ˜åP}€€нD€¥OWQÏ

Припускає, що числа в списку введення сортуються від найнижчого до найвищого.
Якщо буде знайдено більше одного рішення, воно виведе всі вони.

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

Пояснення:

æ            # Get the powerset (all possible combinations) of the (implicit) input-list
 ʒ           # Filter this list of combinations by:
  €θ         #  Get the last items of each (the list of strings)
    ˜        #  Flatten the list
  I          #  Get the input-list again
   €θ˜       #  Get the last items of each (the list of strings) flattened as well
      å      #  Check for each if it is in the list of strings of this combination
       P     #  Check if all are present
 }           # Close the filter (we now have all combinations, containing all unique strings)
  €€н        # Only leave the first items of each item in the combination (the integers)
     D       # Duplicate this list
      €¥     # Get the deltas (forward differences) of each
        O    # Sum these deltas
         W   # Get the lowest sum (without popping the list)
          Q  # Check for each if it's equal to this minimum
           Ï # And only leave the list of integers at the truthy indices
             # (which are output implicitly as result)


0

Haskell , 343 372 байт

Завдяки @ ASCII лише для покращень, він також запропонував у коментарях варіант з 271 байтом :)

import Data.List
import Data.Function
f s=subsequences(map(\a@(x,y)->(x,y,[(a`elemIndices`s)!!0]))s)
g f s=if f*s<=0 then f+abs f+abs s else f+abs(f-s)
h=foldl(\(a,b,c)(d,e,f)->(g a d,nub(b++e),c++f))(0,[],[])
i s=map h(filter(not.null)s)
l m=filter(\(_,x,_)->length x==(maximum$map(\(_,x,_)->length x)m))m
m=minimumBy(compare`on`(\(p,_,_)->p))
n s=(\(_,_,l)->l)$m$l$i$f s

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


Безумовно

import Data.List
import Data.Function

allPaths :: [(Integer, [String])] -> [[(Integer, [String], [Int])]]
allPaths xs = subsequences(map (\a@(x,y) -> (x,y,[(a`elemIndices`s) !! 0])) s)

pathLength :: Integer -> Integer -> Integer
pathLength f s = if f*s <= 0 then f + abs f + abs s else f + abs(f - s)

traversePath :: [(Integer, [String], [Int])] -> (Integer, [String], [Int])
traversePath = foldl (\(n1, a1, c1) (n2, a2, c2) -> (pathLength n1 n2, nub (a1 ++ a2), c1 ++ c2)) (0, [], [])

allTraversedPaths :: [[(Integer, [String], [Int])]] -> [(Integer, [String], [Int])]
allTraversedPaths xs = map traversePath (filter (not . null) xs)

getCompletePaths :: [(Integer, [String], [Int])] -> [(Integer, [String], [Int])]
getCompletePaths m = filter (\(_,x,_) -> length x == ( maximum $ map (\(_,x,_) -> length x) m)) m

getFastestPath :: [(Integer, [String], [Int])] -> (Integer, [String], [Int])
getFastestPath = minimumBy (compare `on` (\(p, _, _) -> p))

getPath :: [(Integer, [String])] -> (Integer, [String], [Int])
getPath xs = (\(_,_,l) -> l) getFastestPath $ getCompletePaths $ allTraversedPaths $ allPaths xs

Перша спроба


ви повинні повернути лише третій елемент цього кортежу, і після імпорту у вас з’явиться стороння
лише для ASCII,

315? (все-таки доведеться повернути лише третій елемент)
лише для ASCII


так що так, ви не можете
лише ASCII


0

O (k * n) часове рішення, з пробілом O (k * n)

xii0i<nxicii

i1j1i0<i1i0j0i0j0

Таким чином, наш алгоритм:

// A[k] is the number of each candy we get from the first k houses
A := array of n bags
A[0] := {}
for k := 0 to n - 1
  A[k] := A[k - 1] + c[k - 1]
end
best_distance := ∞
best_i := -1
best_j := -1
// Find the range [i, j] such that we get all candy types
j := n
for i := n - 1 to 0
  while j > i and (A[j - 1] - A[i]) has all candy types
    j := j - 1
  end
  if (A[j] - A[i]) does not have all candy types then continue end
  distance = x[j - 1] - x[i]
  if distance < best_distance then
    best_distance = distance
    best_i = i
    best_j = j
  end
end
return best_i ..^ best_j

AO(k)O(nk)nnnO(n)O(nk)O(k)O(nk)

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