Vous êtes un jeune geek de la programmation vivant avec vos 2 autres meilleurs amis. Chaque semaine, l'un de vous doit faire toutes les tâches de la maison et vous décidez à qui il revient en choisissant un bâton. Celui qui choisit le bâton le plus court perd et fait toutes les tâches.
Comme vous êtes tous programmeurs et adorez créer des puzzles, vous avez modifié le "Choisissez le bâton le plus court" en un puzzle informatique.
Voici les règles du puzzle.
- Vous recevrez une matrice 2D, où chaque colonne représente un bâton.
- Dans chaque colonne, 1 représente une partie du stick et 0 est un espace vide
- Lorsque vous allez de haut en bas dans chaque colonne, vous en avez au départ
0
et dès que vous appuyez sur un1
, le bâton a commencé et le reste de la colonne sera rempli de1
seulement - Vous pouvez écrire votre programme pour choisir une colonne. La taille du bâton dans cette colonne détermine le gagnant / perdant. Taille du bâton == nombre de 1 dans cette colonne.
- Cependant, ce programme ne peut avoir qu'une complexité temporelle linéaire dans le pire des cas.
Comme vous êtes tous programmeurs, vous saurez si le programme de quelqu'un d'autre tire sur la limite de complexité temporelle.
Votre travail consiste à:
- Écrivez un programme ou une fonction qui accepte une entrée au format 2D ou dans un tableau de chaînes.
- L'entrée peut être prise à partir de STDIN / prompt / console ou d'un argument de fonction.
- Si vous lisez l'entrée de STDIN / prompt, vous pouvez supposer que la lecture de l'entrée et sa conversion en un tableau prend 0 fois (même si le code pour le faire doit être là dans votre réponse)
- Déterminez la colonne avec le bâton le plus long.
- La sortie peut être la valeur de retour de la fonction ou STDOUT / console / alert.
- Le programme / fonction doit avoir une complexité temporelle linéaire dans le pire des cas,
O(m+n)
oùm
est le nombre de lignes etn
le nombre de colonnes.
L'entrée peut être l'un des formats suivants:
Tableau 2D:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Tableau de cordes:
[ "0000", "1000", "1101", "1111" ]
L'entrée aura les propriétés suivantes:
- La taille du tableau est inconnue, supposez un rectangle de n'importe quelle taille
- Dans n'importe quelle colonne, venant de haut en bas, si vous voyez un 1, alors tout ce qui suit sera un
- Les colonnes vides (c'est-à-dire de longueur 0) sont autorisées.
Ceci est un code-golf donc le code le plus court gagne ! *
Veuillez expliquer votre code ou donner la version non golfée (pour vérifier la complexité temporelle) ainsi que le format d'entrée que vous attendez.
MISE À JOUR La complexité temporelle linéaire signifie ici O (n + m) où n est la taille de la colonne et m est la taille de la ligne. (Pour ceux qui n'étaient pas clairs)
MISE À JOUR 2 Cela peut certainement être fait en temps linéaire. Et si vous postez une réponse, n'hésitez pas à retarder la publication de la logique / algorithme de quelques jours pour un combat équitable :)
MISE À JOUR 3 Je vais passer en revue toutes les réponses dans quelques heures pour valider la complexité du temps et le programme :)
la source
1
entrée est la toute dernière cellule, puis il est nécessaire de lire l'intégralité de l'entrée. Même si la bibliothèque standard d'une langue simule un accès aléatoire à stdin, sous les scènes, elle la met en mémoire tampon et donc le temps pris est Omega (n * m).Réponses:
GolfScript, 45 caractères
Prend l'entrée comme un tableau de chaînes, retourne l'index (basé sur 0) de la colonne la plus haute. Il s'exécute en O ( lignes + colonnes ), et chaque itération doit prendre un temps essentiellement constant (au moins en supposant une arithmétique à temps constant). Les seules opérations de tableau / chaîne effectuées dans la boucle sont les recherches d'élément (
=
) et la longueur d'une chaîne (,
), qui prennent toutes deux un temps constant dans GolfScript.Essayez-le en ligne.
Explication:
Comme la plupart des solutions ici, ce code fonctionne en commençant dans le coin inférieur gauche de la matrice, en remontant ou à droite selon que l'élément actuel de la matrice est 1 ou 0, et en gardant une trace de la colonne où il s'est déplacé pour la dernière fois. .
Au début du programme, j'affecte le tableau d'entrée à la variable
^
, sa longueur (c'est-à-dire le nombre de lignes) ày
, et 0 àx
. La valeur 0 est également laissée sur la pile; lors de la boucle suivante, il sera remplacé par l'index de la colonne la plus haute.Dans la boucle principale,
^y(=x=
extrait lex
-ème caractère de lay-1
-ème ligne de^
. Cela renvoie en fait le code ASCII du caractère, il2%
est donc nécessaire de supprimer tout sauf le dernier bit. Dans un cas particulier, siy
égal à 0 (ce qui peut arriver si la colonne la plus haute trouvée jusqu'à présent atteint la ligne supérieure), le bit recherché proviendra en fait de la dernière ligne de la matrice (indice -1), mais ce qui suit ley*
force à zéro, créant ainsi efficacement une ligne de zéros virtuels en haut de la matrice.Ce qui suit
if
exécutera ensuite l'un des deux blocs de code qui le précèdent, selon que le bit recherché est non nul (vrai) ou zéro (faux). Si différent de zéro, ily
est décrémenté de un et la valeur actuelle dex
remplace l'index de colonne le plus haut de la pile (l'ancienne valeur étant temporairement laissée au-dessus). Si zéro, ilx
est simplement incrémenté de un (et temporairement laissé sur la pile, au-dessus de l'index de colonne le plus haut).Enfin,
^0=
extrait la première ligne de la matrice,,
retourne sa longueur et la<
compare à l'index de colonne temporairement laissé sur la pile (qui sera égalx
s'il vient d'être incrémenté). Si l'index est inférieur à la longueur de la ligne, la boucle répète.Ps. Sur la base de mes tests, il devrait être possible de raccourcir ce programme d'un caractère en remplaçant le test de longueur de chaîne
,<
à la fin de la boucle par>
, qui coupe la chaîne à l'index donné et renvoie la partie de fin (qui sera vide, et donc faux, en fin de boucle). Cependant, alors que couper une chaîne comme celle-ci semble être implémenté comme une opération à temps constant dans GolfScript (ou, plutôt, dans Ruby, sur lequel GolfScript s'exécute), je n'ai trouvé aucune documentation officielle le disant. Juste pour être sûr, j'ai choisi de proposer la version légèrement plus longue, mais certainement O (1) ci-dessus.la source
Rubis,
8375686663 octetsDéfinit une fonction
f
qui prend la forme du tableau 2D en entrée.la source
Python 2 -
71, 69, 73, 7581la source
i
sortira pas des limites si un bâton occupe une colonne entière?j
pour compter les0
ruptures de la bouclei*j
.C, 64 octets
Edit: j'ai appris que la question demande l'emplacement de la colonne la plus longue et non sa longueur.
La première ligne est le code joué et le reste est l'exemple d'invocation.
la source
int
s dans la signature de fonction par hasard ou cela ne fonctionne-t-il pas en raison des pointeurs là-dedans?C #: 236 caractères
non golfé:
la source
PHP 5,4 - 108 octets
(113 si vous incluez le
<?php
)Format d'entrée: le tableau sera lu comme une chaîne JSON.
Espace blanc ajouté pour plus de lisibilité - tous les retours à la ligne et les espaces de tête peuvent être supprimés.
Version réduite:
Un peu de voler l'algorithme de Martin ici, mais c'est agréable de jouer avec des langages qui ne sont pas aussi souvent vus ici XD
la source
$s=json_decode($argv[1]);$t=count($s)-1;
par$t=count($s=json_decode($argv[1]))-1;
(-3 octets).$t--
ne doit se produire que si la condition est remplie.Cobra - 98
la source
C ++ :: 78
Contrairement à l'autre solution C, il s'agit de l'ensemble du programme. (aucune invocation nécessaire, pas besoin d'indiquer à la fonction la taille du tableau). Malheureusement, cela signifie qu'il est plus long car il
main
doit être utilisé à la place d'un nom de fonction à un seul caractère, je dois interpréter l'entrée et ensuite sortir la réponse, où l'autre solution gère cela "ailleurs". Aussi mon premier golf de code.compilé avec
g++ file.cpp -include iostream
, exécuté avec./a 000 010 110 111
(par exemple) == tableau de chaînes (je crois que cela est autorisé dans la spécification de la question)La version ci-dessus affiche le meilleur courant trouvé jusqu'à présent à chaque itération. Le dernier chiffre de sortie est la réponse. Le passage du traitement du bas à gauche au lieu du bas à droite et l'
0
indexation ont réduit cette solution de 10 (!) Caractères.le passage à c ++ supprime la soumission d'un caractère de plus car il
std::cout<<
est plus court queputchar(-48)
et il devrait également prendre en charge explicitement plus de 9 sticks avec une sortie appropriée (bien qu'il puisse être plus difficile de différencier chaque sortie). Il ne produit désormais le meilleur courant que lorsqu'il monte, ce qui coupe au moins une sortie.
La taille du fichier entier n'est plus que de 78 octets - approche de la seule solution de fonction que l'autre
C
utilisations de la soumission. (avec beaucoup de code supplémentaire pour supporter ladite fonction).Comme la description ci-dessous est obsolète:
Puis-je même jouer au golf plus loin?
Code non golfé (avec sortie supplémentaire):
la source
OCaml - 144 caractères
Prend une
int array array
entrée et commence en bas à gauche, en se déplaçant vers le haut ou vers la droite s'il voit un1
ou un0
. Le nombre de colonnes commence à0
.Usage
Non golfé
la source
T-SQL -
7164Prend la table A comme entrée
Et la requête est
SQLFiddle
Cela renvoie la première ligne de la table a ordonnée par r où il y a un 1 dans la chaîne a.
TOP(1)
limite le résultat à la première ligne renvoyée.CHARINDEX('1',A)
renvoie la position du premier 1 de la chaîne ou zéro s'il n'est pas trouvé.WHERE A LIKE'%1%'
filtre les lignes où A contient un 1ORDER BY R
assure la lecture du tableau de haut en basla source
Delphi 122 caractères
Soupir ... c'est une langue tellement volumineuse.
Mise à jour: a dû ajouter 6 caractères en changeant de fonction le type de retour de I en entier. La fonction était toujours compilée car le programme de test avait un "type I = entier;" laissée par une version antérieure du programme.
la source
"0000", "0010", "1111"
deuxièmement, votre réponse ne répond pas à l'exigence de complexité de temps linéaireschéma - 236 caractères
Encore plus longtemps que la version delphi ... il y a probablement un moyen de le faire beaucoup plus efficacement avec le schéma. Et pire encore - je viens de remarquer que c'est l'ordre m * n.
l est une liste de la forme '((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1)). Je pense que c'est une représentation juste d'une entrée de tableau 2D pour le schéma.
(sl) additionne les n-èmes éléments de chacune des sous-listes d'une liste de listes de nuimbres, donc (s '((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1))) reviendrait (3 2 1 2).
(ul) renvoie l''index 'de la plus grande entrée d'une liste de nombres (en utilisant la fonction d'assistance t), donc (u' (3 2 1 2)) renverra 1 (comme le plus grand élément '3 de la liste' (3 2 1 2) est en position 1).
la source
Raquette 70
Golfé:
Suppose que l'entrée est un tableau à deux dimensions, qui dans Racket serait une liste de listes:
Non golfé:
Renvoie l'index de colonne avec le bâton le plus long.
la source
1
's ?1
in the matrix, or only in the bottom row).JavaScript, ES6, 76 characters
Takes array of array input.
la source
JavaScript ES6, 65 bytes
Takes both input formats
Explained:
Iterates from bottom to top. Uses
String.prototype.indexOf()
orArray.prototype.indexOf()
depending on the input on each value. Finds the first index of each row with a 1 from the previous offset, if it finds none then it sets thet
variable to the last offset and doesn't perform anymoreindexOf
calls.la source
indexOf
works in eitherO(log n)
orO(n)
, so the overall algorithm will never be inO(m + n)
O(m+n)