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 :)
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).