Ce sont des gouttes de pluie:
! | . " :
Ce sont des particules de nuages:
( ) _ @ $ &
Je veux que vous vérifiiez, quand on vous donne un bloc de texte, s'il pleut ou non. Il pleut si, pour chaque goutte de pluie, il y a une particule de nuage quelque part au-dessus. Il doit y avoir une particule de nuage pour chaque goutte de pluie. Produisez une valeur vraie ou fausse indiquant vos conclusions.
Exemples valides
(@@@@@@)
( $ & )
Q ( )
.. . !
: .
|" !
.
()()()
......
@_$ &
errrr
h_r-5
.:. .
"
Exemples non valides
!
()
$$$$$
( )
:::::
.....
C'est un code-golf donc le programme le plus court en caractères gagne.
Réponses:
APL (30)
Il s'agit d'une fonction qui prend une matrice de caractères en entrée et donne une sortie booléenne.
Tester:
Explication:
⍵∘∊¨'!|.":' '()_@$&'
: pour les deux ensembles de caractères (pluie et nuages), et pour chaque caractère en ⍵, voyez si le personnage est membre de l'ensemble.+⍀¨
: obtenir une somme cumulée pour chaque colonne et chaque ensemble≤/
: pour chaque position en ⍵, vérifiez que la quantité de gouttes de pluie ne dépasse pas la quantité de particules de nuage dans la somme cumulée∧/∊
: retourne le booléen ET de tous les éléments du résultatla source
C ++ 11,
186184 octetsNon golfé
Approche de base, stockant les positions des particules de nuage dans une rangée et si des particules de pluie sont rencontrées, il vérifie si la particule de nuage est au-dessus et diminue le compteur de particules de nuage dans cette colonne. Le programme renvoie 0 s'il est valide et 1 sinon.
la source
c-m?0:p[i]++
parp[i]+=c==m
? Ou cela ne fonctionne plus en C ++ 11?Escargots , 125
Le programme affiche la zone de la grille (ou 1 si sa zone est 0) s'il pleut; sinon 0. Si seulement j'avais implémenté des classes de caractères de style regex.
Version non golfée Elle contient de fausses instructions pour les nuages ou les gouttes de pluie au lieu d'écrire tout le charabia.
\whatever
(remplacé par.
dans le vrai programme) signifie une chose qui devrait être une goutte de pluie, mais qui peut en fait être n'importe quoi, car cela n'a pas d'importance si nous associons une non-goutte de pluie à un nuage.la source
Python 2, 121 octets
S'attend à ce que l'entrée à remplir soit rectangulaire.
la source
JavaScript ES6, 112
Testez l'exécution de l'extrait ci-dessous dans un navigateur compatible EcmaScript 6 implémentant des fonctions fléchées, un opérateur de diffusion et des chaînes de modèle (j'utilise Firefox)
la source
Perl 5, 80
79, plus un pour
-E
au lieu de-e
la source
Julia, 90 caractères
Contrairement à la solution d'origine (ci-dessous), celle-ci utilise les mathématiques pour déterminer la solution.
mapfoldl(collect,hcat,split(s,"\n"))
(écrit ci-dessus avec\n
remplacé par une nouvelle ligne réelle pour enregistrer les caractères) convertit la chaîne en un tableau 2D de caractères.map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
crée un tableau de nombres, avec 1 si le personnage est un nuage, -1 si le personnage est pluie et 0 sinon.cumsum(...')
calcule les sommes cumulées des lignes (serait normalement écritcumsum(...,2)
, mais comme nous ne nous soucions plus de l'orientation à partir de ce moment, la transposition ne coûte qu'un caractère), puisall(... .>-1)
vérifie un nombre négatif - les négatifs ne se produiront que si un caractère pluie apparaît sans être précédé d'un caractère de nuage.Julia,
139136 caractèresCette fonction transpose d'abord le texte pour que les lignes deviennent des colonnes et vice-versa. Notez que les sauts de ligne sont présents dans le code sous la forme de sauts de ligne réels, pour enregistrer un caractère par instance.
La fonction remplace ensuite de manière itérative les paires nuage / gouttelette par des espaces, et une fois que toutes ces paires sont supprimées, elle renvoie true s'il reste des gouttelettes et false sinon.
r"[()_@$&](.*?)[!|.\":]"
- il s'agit d'une expression régulière qui associera les paires nuage / gouttelette de manière paresseuse, le groupe 1 contenant tout entre le nuage et la gouttelette. Puis luis"\g<1>"
dit de supprimer le nuage et les gouttelettes correspondants, mais gardez les choses entre les deux (nécessaire car il peut contenir des nuages) -\g<1>
c'est tout ce qui a été mis en correspondance dans le groupe 1 de l'expression régulière.∩("!|.\":",t)==[]
générera l'intersection des caractères de gouttelette avec la chaîne finale, et si elle est vide, alors aucun des caractères de goutte n'est présent et il pleut.la source
h
dans l'utilisation par la fonction anonyme réelle. Comme ceci:g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))
- l'appelerh
facilite simplement l'invocation.