introduction
La pluie s'est finalement calmée. La plupart de l'humanité s'est noyée en raison d'un bogue dans le code de @ user12345 . Les survivants sont dispersés dans un archipel mondial. La communication radio est en hausse, et l'humanité est prête à prospérer une fois de plus. Pour aucune raison que ce soit, des pirates zombies se sont rassemblés au premier méridien et se dirigent vers l'ouest. La horde dévore tout.
Problème
Notre scénario apocalyptique peut être décrit par 5 entiers sur une seule ligne qui représentent un ensemble de communautés insulaires coopérantes. Ils sont classés de l'ouest (entier le plus à gauche) à l'est (entier le plus à droite).
En commençant par l'île la plus à l'est, les insulaires s'enfuient par paires jusqu'à la prochaine île la plus proche. Curieusement, pour chaque paire qui s'embarque, un seul d'entre eux survit au voyage. Les insulaires voyagent uniquement par paires. Les populations étranges élisent un habitant unique pour rester derrière et fournir les dernières mises à jour radio sur les pitreries de la horde de pirates zombies. Les populations refusent de voyager jusqu'à ce que toutes les îles à l'est d'entre elles aient achevé leurs migrations ou soient mortes. Lorsque la population atteint la dernière île la plus à l'ouest, les voyages cessent.
Le directeur des opérations à la fin du monde a besoin d'un programme capable de produire les chiffres de population finaux de chaque village.
Exemple d'entrée
3 8 6 0 2
Exemple de sortie
8 1 0 1 0
Hypothèses
- L'entrée peut être fournie via stdin, lue à partir d'un fichier nommé arbitrairement ou acceptée comme argument
- Pour chaque île, 0 <= population <= 1024
- Les populations ne sautent jamais une île
La réponse la plus courte gagne!
Réponses:
APL, 16 caractères
L'entrée est fournie sous forme de chaîne à ce bloc:
ou un caractère de moins si l'entrée est fournie en argument à ce bloc:
Il est basé sur l'idée d'Ilmari Karonen dans ce commentaire .
2⊥⍵
effectue une conversion en base 2 de l'entrée.(1e9,4⍴2)⊤
convertit ainsi ce nombre en base 2 (pour les quatre derniers chiffres) et en base 1e9 pour le premier, ce qui est suffisant pour les plages d'entrée données ci-dessus. (1e9,4⍴2
construit la liste1e9 2 2 2 2
.)Notez que la fuite vers l'ouest se fait automatiquement par la conversion de base au cours de ce processus.
la source
APL
devrait être illégal ...GolfScript,
2322 caractèresUne approche itérative. Le tableau est itéré plusieurs fois et à chaque fois un nombre de paires est transféré de droite à gauche. Essayez l'exemple en ligne .
Brève explication du code:
la source
~]{2base}2*' '*
ferait l'affaire ...GolfScript (25 caractères)
Démo en ligne
Solution assez simple: il existe une approche plus intéressante qui définit la valeur de sortie pour chaque îlot en fonction des valeurs d'entrée, mais je ne pense pas qu'il soit possible de jouer autant que de suivre l'algorithme de redistribution décrit dans la question.
la source
Javascript / ES6 (69)
Jouer avec des opérateurs au niveau du bit:
x&=1
conserve le bit le plus bas (1 si impair, 0 si pair)x>>1
est la division par 2 pour les entiersVersion sans ES6:
Exemples:
f("3 8 6 0 2")
retours[8, 1, 0, 1, 0]
f("0 997 998 999 1000")
retours[935, 0, 1, 1, 0]
la source
f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}
qui est de 68 caractères.Python - 96 caractères
Golf pour la première fois! Entrée de stdin.
la source
' '
fractionnement, le ramenant à 96 et battant les autres solutions python2.J (26 caractères)
Voici ma solution en J:
((<.@-:@}.,0:)+{.,2|}.)^:_
Cette solution générale devrait fonctionner avec n'importe quel nombre d'îles.
la source
Rubis,
97907472Version en ligne
Je l'ai joué un peu plus loin, sans inverser le tableau ...
la source
C - 121 caractères
L'entrée provient de stdin.
la source
Python2 - 98 caractères
Entrée de stdin.
Python3 - 79 caractères
Entrée de stdin.
la source
Python 2,
8580 octetsX personnes commençant sur une île équivalent à X * 2 personnes commençant une île à droite. Ce code convertit tout le monde dans la configuration de départ en son équivalent dans les insulaires d'extrême droite, puis utilise la représentation binaire du résultat pour déterminer combien de personnes se retrouvent sur chaque île.
EDIT: raccourci le code en initialisant
b
à 1 au lieu de 0, permettant l'utilisation debin
au lieu d'une chaîne de format.la source
Python (101)
Nous parcourons la liste de l'arrière vers l'avant et déplaçons les populations selon les spécifications, puis imprimons la liste. Voici un test rapide:
la source
Mathematica 105
Cela devrait fonctionner avec n'importe quel nombre d'îles.
Exemples
5 îles
25 îles
la source
270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
pour vos longues données de test. Je pense avoir confirmé que j'ai raison.Java -
647533 mais en espérant quelques points brownie pour Java 8 Streams.La forme non compressée:
Avec l'aide de:
Légèrement préoccupé par le test de @ DavidCarraher:
génère
la source
Java -
196195Je me suis dit que je ne le publierais pas si je ne pouvais pas le faire sous 200 ... Honnêtement, je ne pense pas pouvoir me débarrasser de quoi que ce soit d'autre, c'est assez mince pour Java.
Sauts de ligne:
Exemple de sortie d'entrée:
la source
Java - 179 caractères
Comprimé:
Ordinaire:
Exemple de sortie:
la source
Emacs Lisp 144 caractères
Pas minuscule, mais ça marche
la source
awk - 44 caractères
la source
Java - 116 caractères
Par exemple
int[] i = {2, 33, 16, 5};
(je suppose que ceux-ci ne s'ajoutent pas au nombre, car chaque nombre peut varier) produirait23 0 0 1
la source