Le problème
Un scénario de fin du monde est décrit par trois numéros sur une seule ligne, n
, m
et p
. Cette ligne est n
suivie de lignes avec des m
valeurs par ligne. Chaque valeur représente le nombre total d'unités d'eau que chaque cellule peut contenir.
Les p
lignes suivantes décrivent la météo pour les prochains p
jours. 1 unité de pluie tombe sur une seule cellule chaque jour. Si la quantité d'eau dans une cellule dépasse la quantité qu'elle peut contenir, cette cellule est inondée. Si plusieurs cellules adjacentes sont à pleine capacité, elles sont traitées comme une cellule partageant des voisins communs (pensez au dragueur de mines lorsque vous cliquez sur un groupe de blancs).
- Une seule cellule du milieu a 4 voisins
- Deux cellules intermédiaires adjacentes de pleine capacité sont traitées comme une cellule de 6 voisins
- Une cellule d'angle unique a 2 voisins
- Une cellule simple mur a 3 voisins
Lorsqu'une cellule est inondée, un événement d'inondation se produit. Tout excès d’eau est distribué uniformément à ses voisins. Si cela provoque l'inondation d'un ou de plusieurs voisins, un autre événement d'inondation se produit. Cela continue jusqu'à ce que l'eau se soit calmée ou que la ville soit complètement inondée.
Exemple d'entrée
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
0 0
signifie qu'il a plu sur la rangée 1, col 11 2
signifie qu'il a plu sur la rangée 2, col 3 (qui ne contient aucune eau et est immédiatement inondé!)
Après des p
jours de pluie, si la ville est complètement inondée, émettez Sink . Sinon, indiquez Nager .
Exemple de sortie
Nager
Hypothèses
- Les entrées peuvent être fournies via stdin, lues dans "city.txt" ou acceptées en tant qu'argument. Les trois sont autorisés à ne pas invalider les réponses déjà postées.
- Les capacités en eau seront des entiers non négatifs.
Plus de 40 équipes d'étudiants de premier cycle (de A & M, UT, LSU, Rice, Baylor, etc.) en compétition dans un concours de programmation avec une variété de langues disponibles ne pourraient pas résoudre ce problème en 5 heures. À cause de cela, je ne peux m'empêcher de mentionner qu'il y a un piège dans ce puzzle qui rend la solution triviale. Le code le plus court gagne toujours, car je suis convaincu que le code le plus court résoudra également le problème.
n
lignes dem
valeurs ou l'inverse? Votre exemple ne correspond pas à la spécification écrite.0.25
unités à chaque cellule adjacente (en supposant une seule cellule inondée moyenne)?Réponses:
Golfscript,
3730 caractèresNouveau et amélioré, grâce à PeterTaylor pour les conseils:
Explication :
Le programme se termine alors en sortie de la pile.
Ancienne version + explication:
Même approche que Fors , juste Golfscripted =). Peut probablement être rendu plus efficace. L'entrée est de stdin.
Explication :
Le programme affiche ensuite la pile, ce qui n’est que la réponse.
la source
]
sans correspondance[
, la pile entière sera rassemblée dans un tableau, ce qui[~]
permet de simplifier une initiale~]
. Pour obtenir les premiersgrid_size
éléments d’un tableau, utilisez<
, vous<{+}*
pouvez donc très certainement vous faire économiser un peu en ajoutant la capacité totale.0>"Sink""Swim"if
peut être0>"SinkSwim"4/=
~]
? J'ai essayé et cela n'a pas semblé fonctionner. Le dernier hack est bien qu'il doive l'être"SwimSink"
- l'utilisera. et le tableau semble aussi prometteur, il va commencer à travailler là-dessus.ruby golfscript.rb
et ça n'a toujours pas marché ... pouvez-vous vérifier que ça marche de votre côté? Je reçois la même erreur sur les deux:undefined method '+' for nil:NilClass (NoMethodError)
C:
1009695 caractèresCinq heures? Ça m'a pris cinq minutes. :)
Aragaer, merci pour les simplifications! Cependant, j'ai réorganisé les déclarations de variable et les arguments sur main, car Clang génère une erreur si le deuxième argument de main est d'un autre type que
char **
.la source
p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}
. J'ai également joué avec l'idée den-=scanf
, mais pas sûr si le programme sera correct après cela. Le premierscanf
peut être déplacé au début defor
sans changer le nombre de caractères.n-=scanf...
ne fonctionnerait pas, car iln-=1
s'agit en fait d'un pré-incrément de sorte qu'il raterait le coin sud-est. L'autre changement est génial.Python, 4 lignes, 175 caractères
Lol, je me demande si les 40 équipes et plus ont fini par trouver le piège ... après avoir travaillé durement.
la source
#
.input()
etmap()
:n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
Double fonctionnalité J (50 caractères) et K (40)
Comme d'habitude, ces deux solutions ont exactement la même structure et sont donc toutes les deux ici. K est beaucoup plus court, ce qui est une bonne surprise.
Explication:
".1!:1]1
- Lire dans la première ligne et convertir en nombres entiers.(...)/0 2{
- Prenez les éléments aux index 0 et 2 (n
etp
respectivement) et utilisez-les comme arguments de gauche et de droite du verbe(...)
, respectivement.+1!:1@#1:
- Lire dans lesn+p
lignes.[+/@".@$
- Prenez ($
) les premièresn
lignes ([
), en éliminant le reste, puis convertissez-les en nombres entiers (".
) et faites la somme de chaque ligne (+/
).]<[:+/
- Additionner les sommes des lignes, puis comparer cette valeur à l'argument droit,p
. Nous produisons true sip
est inférieur à la somme.>Sink`Swim{~
- SélectionnezSwim
si la compression ci-dessus a pour résultat true ouSink
si false.Usage:
Et maintenant le K:
A expliqué:
. 0:`
- Lire une ligne d'entrée et convertir en un tableau d'entiers.{...}.
- Utilisez ces trois nombresn m p
comme argumentsx y z
de cette fonction.0::'(x+z)#`
- Créez desx+z
copies du descripteur de fichier d'entrée`
, puis indiquez une ligne pour chacune d'elles (0::'
)..:'x#
- Prenez les premiersx
éléments et convertissez-les en un vecteur de nombres.z<+//
- Faites la somme de la matrice entière, puis testez pour voir si elle est supérieure àz
.`Sink`Swim@
- RetourSink
ouSwim
selon que le test est retourné vrai.Usage:
la source
APL, 35
Pas sûr si cela est autorisé, mais il cesse d'accepter les entrées après la "ville"
x←⎕
Prend une entrée et la stocke dans une variablex
(les nombres délimités par des espaces sont interprétés comme un tableau numérique)1⌷
Extrait d'index 1 (les tableaux APL sont à base unique)⍳
Génère un tableau de 1 à l'argument (1⌷x←⎕
dans ce cas)¨
opération "Map"{+/⎕}
Tirer un tableau de entrer et renvoyer la somme+/
Somme du tableau généré par l'opération de mappage4×x[3]>
Tester si la somme <x[3]
(renvoie 1 ou 0), puis multiplier 4'SwimSink'⌽⍨
Rotation de la chaîne'SwimSink'
par cette quantité4↑
Enfin, extrayez les 4 premiers caractères de la chaînela source
⎕IO←0
, puis remplacez4↑'SwimSink'⌽⍨4×
par'Swim' 'Sink'⊃⍨
,x[3]
avecx[2]
et1⌷x
avec⊃x
pour sauvegarder deux octets.AWK, 70
Ceci est une amélioration par laindir sur ma soumission (86):
la source
NR<=h
devrait êtreNR<=h+1
, sinon vous obtiendrez de faux puits lorsque la dernière ligne de capacités sera ignorée. Cela peut aussi être réduit à 70 asn{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
CoffeeScript -
128113Une fonction qui prend la chaîne comme seul argument:
la source
`p>x?"Sink":"Swim"`
au lieu deif p>x then"Sink"else"Swim"
. Les parens pour la troisième déclaration ne sont pas nécessaires non plus.SED, 128
C'était amusant d'écrire une
sed
version de ceci. Il présente les inconvénients suivants:Il suppose que la ville a plus de deux colonnes, pour reconnaître facilement les lignes de pluie.
Cela suppose que la capacité de chaque ville est comprise entre 0 et 9.
C'est ici:
Appel avec le
-n
drapeau.la source
SWI-Prolog 79
Si cela ne vous dérange pas que cette réponse prenne entrée par requête plutôt que via stdin:
La réponse ne valide pas le format de saisie, mais je ne pense pas que ce soit un problème, car le concours de programmation ne vous oblige pas non plus à le faire.
Exemple de requête (en utilisant exemple dans la question):
la source
Python - 152
la source
,
, avant et après'
, après)
…Scala - 128
Il serait peut-être possible d'omettre certaines parenthèses ou quelque chose, mais Scala est vraiment instable sur la ponctuation et le style sans points et () vs {} et tout le reste.
la source
Javascript - 73 Caractères
Suppose que l’entrée est dans la variable
s
et les sortiesSwim
ouSink
.Exemple:
De la question initiale - en entrant ceci dans la console du navigateur:
Les sorties:
la source