Bir park yerinde kamyonlar


10

Bir otoparkta P park yerleri vardır, ancak bazı alanlar sekizgenlerle temsil edilen arabalar tarafından işgal #edilirken, boş alanlar noktalardır .. Yakında her biri tam olarak arka arkaya L alan alacak T kamyonları geliyor. Kamyonların yan yana park edilmesi gerekmez.

Göreviniz, tüm kamyonları park etmek için kaldırılması gereken en az sayıda araba bulacağınız bir program oluşturmaktır. Her zaman tüm kamyonlara sığacak kadar yer olacak, yaniT*L<P

Giriş

İlk satırda boşluklarla ayrılmış P, T ve L olmak üzere üç tamsayı olacaktır. İkinci satırda, başlangıçtaki park yerini temsil eden bir P karakteri dizisi olacaktır.

Çıktı

İlk ve tek satırda, programınız tüm kamyonları park etmek için çıkarılması gereken en az sayıda aracı basmalıdır.

Test senaryoları

Giriş:
6 1 3
#.#.##

Çıktı: 1

Giriş:
9 2 3
.##..#..#

Çıktı: 2

Giriş:
15 2 5
.#.....#.#####.

Çıktı: 3

En kısa kod kazanır. (Not: Mümkünse özellikle bir pire uygulamasıyla ilgileniyorum)

Yanıtlar:


4

Python 2, 154 bayt

I,R=raw_input,range
P,T,L=map(int,I().split())
S=I()
D=R(P+1)
for r in R(P):D[1:r+2]=[min([D[c],D[c-1]+(S[r]<".")][c%L>0:])for c in R(1,r+2)]
print D[T*L]

Basit bir DP yaklaşımı. Programın adil bir parçası sadece girdi okumaktır.

açıklama

Her sıranın ilk npark yerlerine karşılık geldiği ve her bir sütunun şimdiye kadar yerleştirilen kamyon (veya bir kamyonun parçaları) sayısına karşılık geldiği bir 2D dinamik programlama tablosu hesaplıyoruz . Özellikle sütun k, şu k//Lana kadar dolu kamyonları yerleştirdiğimiz ve k%Lyeni bir kamyonun yolunda olduğumuz anlamına geliyor . Her hücre daha sonra devlete ulaşmak için temizlenecek minimum araba sayısıdır (n,k)ve hedef durumumuzdur (P, L*T).

DP nüksünün arkasındaki fikir şudur:

  • Eğer k%L > 0yeni bir kamyon için boşluklarsak, tek seçeneğimiz k%L-1yeni bir kamyon için boşluk olmaktan gelmektir.
  • Aksi takdirde k%L == 0, yeni bir kamyonu bitirdiysek ya da son kamyonu zaten bitirdik ve o zamandan beri birkaç park yerini atladık. İki seçenekten en az birini alıyoruz.

Eğer k > n, park noktalar vardır daha daha kamyon kareler yerleştirdiğiniz yani, o zaman koymak devlet için (n,k). Ancak golf amaçlı olarak, kher arabayı çıkarmanın en kötü örneği olduğu için koyduk ve aynı zamanda bir üst sınır görevi görüyor.

Bu oldukça ağız doluydu, bir örnek verelim:

5 1 3
..##.

Tablonun son iki satırı

[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]

İkinci son sıranın indeks 2'sindeki giriş 2'dir, çünkü yeni bir kamyon için 2//3 = 0yerleştirilmiş ve 2%3 = 2yeni bir kamyon için boşluklar olan tam kamyon durumuna ulaşmak için tek seçenek budur:

  TT
..XX

Ancak ikinci son satırın 3. dizinindeki giriş 1'dir, çünkü yeni bir kamyon için 3//3 = 1yerleştirilmiş ve 3%3 = 0yeni bir kamyon için boşluklar olan tam kamyon durumuna ulaşmak için en uygun olanı

TTT
..X#

Son satırın 3. dizinindeki giriş, yukarıdaki iki hücreye seçenekler olarak bakar - yeni bir kamyon için 2 boşluk olduğumuz vakayı alıp bitirir miyiz yoksa tam kamyonumuzun olduğu vakayı alır mıyız? zaten bitti mi?

  TTT            TTT
..XX.     vs     ..X#.

Açıkçası ikincisi daha iyidir, bu yüzden 1'i indirdik.

Pyth, 70 bayt

JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ

Temelde yukarıdaki kodun bir portu. Henüz çok iyi golf değil. Çevrimiçi deneyin

Expanded

Jmvdczd              J = map(eval, input().split(" "))
Kw                   K = input()
=GUhhJ               G = range(J[0]+1)
VhJ                  for N in range(J[0]):
=HG                    H = G[:]
FTUhN                  for T in range(N+1):
 XHhT                    H[T+1] =
hS                                sorted(                                        )[0]
>                                                                 [            :]
,                                        (      ,                )
@GhT                                      G[T+1]
+@GTq@KN\#                                       G[T]+(K[N]=="#")
>%hT@J2Z                                                           (T+1)%J[2]>0
)=GH                   G = H[:]
)@G*@J1eJ            print(G[J[1]*J[-1]])

Şimdi, sadece Pyth'in> 2 değişkene birden fazla ataması olsaydı ...


Tamamen farklı bir şey yapıyordum, sanırım .. ama zamanın varsa, bana kodu nerede kesebileceğimi söyleyebilirsin (dürüst olmak gerekirse, sadece bir baskı ifadesi ile tek satırlık bir çözümü severdim .. rüyalar rüyalar. ..) P,K,L=map(int,input().split()) Q=list(input()) l=[(L,0)]*K for j in range(len(Q)-L): if Q[j:j+L].count('#')<l[i][0]: l[i]=Q[j:j+L].count('#'),j del Q[l[i][1]:l[i][1]+L] print(sum([x[0]for x in l]))
Etaoin Shrdlu

@EtaoinShrdlu Kodu Pastebin gibi bir yere koyarsanız girintinin doğru olması daha kolay olabilir. Gördüğüm kadarıyla Python 3'e benziyor ve anında tasarrufQ=list(input()) -> *Q,=input()
Sp3000

Evet, bunu işbirliği yapmaya çalıştım, ama istemedi. Gerçekten
macun düşünmüyordu


@EtaoinShrdlu Mantığınızın nasıl çalıştığından emin değilim, ancak yapabileceğiniz bazı şeyler 1) Q[j:j+L].count('#')Değişken olarak x=l[i][1];del Q[x:x+L]
saklayın

3

Haskell, 196 karakter

import Data.List
f=filter
m=map
q[_,t,l]=f((>=t).sum.m((`div`l).length).f(>"-").group).sequence.m(:".")
k[a,p]=minimum.m(sum.m fromEnum.zipWith(/=)p)$q(m read$words a)p
main=interact$show.k.lines

Tüm örnekleri çalıştırır

& (echo 6 1 3 ; echo "#.#.##" )  | runhaskell 44946-Trucks.hs 
1

& (echo 9 2 3 ; echo ".##..#..#" )  | runhaskell 44946-Trucks.hs 
2

& (echo 15 2 5 ; echo ".#.....#.#####." )  | runhaskell 44946-Trucks.hs 
3

Biraz yavaş: O (2 ^ P) P, partinin büyüklüğü idi.

Muhtemelen bol burada golf yaptı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.