Simuler la rotation d'une planche


14

introduction

Vous jouez à un jeu d'association, dans lequel des pièces sont insérées en haut et tombent vers le bas (sur la pièce du haut) en raison de la gravité.

Donc ça

O <- inserting this coin

OO O
OOOOO

deviendra ceci

O
OO O
OOOOO

Imaginez maintenant que quelqu'un tourne le plateau dans le sens des aiguilles d'une montre. Les événements suivants se produiront:

1. La planche est tournée

OOO
OO
O
OO
O

2. Les pièces tombent à cause de la gravité

O
O
OO
OO
OOO

Ta tâche

Votre tâche consiste à simuler la rotation de la carte en écrivant un programme ou une fonction. Par souci de simplicité, nous n'avons affaire qu'à un seul type de pièce (ce n'est pas un jeu d'association trop excitant, n'est-ce pas…). Vous pouvez supposer que la gravité n'est appliquée qu'une fois la rotation terminée. La planche est tournée dans le sens horaire.

Contribution

L'entrée va être une chaîne qui contient 3 types de caractères:

  • O (o majuscule) OU 0 (zéro) - une pièce (vous décidez laquelle prend en charge votre solution)
  • (espace) - un champ vide
  • \ n (nouvelle ligne) - fin de ligne

L'entrée représente l'état de la carte. Vous pouvez supposer que l'entrée est bien formée et contient un état valide de la carte (aucune pièce ne flotte). L'entrée peut être un paramètre de fonction, ou peut être lue à partir de l'entrée standard ou d'un fichier.

Production

La sortie est le nouvel état de la carte après rotation. La sortie contient les 3 mêmes types de caractères que l'entrée. La sortie peut être renvoyée par votre fonction ou peut être écrite dans la sortie standard ou dans un fichier.

Échantillon

Input1:

O
OO O
OOOOO

Sortie1:

O
O
OO
OO
OOO

Input2:

O O
O O

Sortie2:

OO
OO

Vous pouvez utiliser n'importe quelle langue et la bibliothèque standard de la langue choisie. Le programme le plus court en octets gagne.


Les lignes plus courtes sont-elles remplies d'espaces de fuite?
Ventero

Si vous en avez besoin, alors oui.
David Frank

Quelles sont les exigences pour la taille de la carte? Puis-je choisir une taille maximale raisonnable ou l'application / la fonction doit-elle fonctionner pour toutes les tailles possibles?
Fors

2
Si la gravité est appliquée après la rotation, comment Input2 devient-il Output2? J'aurais pensé que ça laisserait tomber les pièces supérieures mais pas horizontalement?
Matt

2
@Matt Notez qu'il n'y a pas de lignes vides dans Input2, ni dans Output2 (SE affiche une marge entre les lignes).
David Frank

Réponses:


16

GolfScript, 14 12 caractères

' '-n%zip$n*

L'entrée doit être donnée sur STDIN, le caractère pour les pièces peut être n'importe quel caractère non blanc. Essayez ici . Merci à Peter d'avoir signalé une réduction de deux caractères.


Oh, ce que je ne donnerais pas pour un transposeRuby qui peut gérer des tableaux de différentes longueurs ...
Ventero

@Ventero La plupart du temps j'utiliser cette version aki: ([nil]*a.map(&:size).max).zip(*a). Pas bon pour le golf.
Howard

Vous pouvez enregistrer 2 caractères: puisque les lignes les plus longues se retrouvent toujours en bas, vous pouvez les remplacer -1%par $.
Peter Taylor

@PeterTaylor Vous avez raison - nous pouvons enregistrer dans les caractères. Je vous remercie.
Howard

1
@PeterTaylor Eh bien, j'ai inclus un alias à un caractère pour " ".
aditsu quitte car SE est EVIL le

6

Javascript (E6) 103

Essayez d'abord les opérations matricielles. Chaque ligne de la chaîne d'entrée doit être complétée.
Assez verbeux.

R=t=>(x=t.split('\n').reverse().map(x=>[...x].sort()),x.map((c,i)=>x.map(r=>r[i]).join('')).join('\n'))

Pseudo code

  1. chaîne -> tableau de lignes
  2. tableau inversé haut / bas
  3. chaque ligne -> tableau char
  4. trier chaque ligne (les pièces «tombent» à droite)
  5. transposer
  6. chaque tableau de caractères dans une ligne -> une chaîne
  7. rejoindre le tableau -> chaîne unique

Oh wow, le tri est intelligent (+1)! Ça te dérange si je le vole?
seequ

Je n'ai jamais vu la syntaxe [...x]auparavant. Comment appelle-t-on ceci?
ComFreek


2
@ edc65 Vous avez rompu votre propre lien avec des crochets. Voici le lien correct
Chris Cirefice

6

Ruby 2.0, 59 caractères

puts$<.map(&:chars).reverse.transpose.sort[1,50].map &:join

Entrée via stdin, suppose que les lignes ont toutes la même longueur. C'est probablement beaucoup plus long que nécessaire. Mais au moins c'est lisible ...


Je pense que vous pouvez utiliser à la $<.mapplace.
Howard

@Howard C'est une chose que j'oublie toujours . Merci!
Ventero

1
que fait [1,50] là-bas?
Pas que Charles

1
@Charles Il saute la première ligne, qui contient toutes les nouvelles lignes de l'entrée. David a mentionné dans un commentaire que 50x50 est la taille maximale possible, donc au lieu de sélectionner tout sauf la première ligne ( 1..-1), je sélectionne simplement 50 lignes en commençant par la seconde ( 1,50).
Ventero

@Ventero l'a compris. cool. Merci!
Pas que Charles

3

J - 49 31 24 octets

Je pense qu'il pourrait y avoir des rotations inutiles, mais sinon cela fonctionne bien. C'est une fonction qui prend l'entrée comme spécifié, les pièces étantO . Aucun espace de fin n'est requis dans l'entrée.

Nouvelle version, inspirée de la réponse Javascript d' edc65 :

f=:[:|."1@|:[:/:~"1,;._2

Explication:

f=:[:|."1@|:[:/:~"1,;._2
                   ,;._2 Split the string at every fret, which is the last character in the string (newline).
              /:~"1      Sort every row separately.
     |."1@|:             Rotate the array clockwise.

Ancienne version:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)

Explication:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)
                                          (,;._2) Split the string at every fret, which is the last character in the string (newline).
                                (|."1@|:)@        Rotate the array clockwise.
                             |:@                  Reverse the axes (columns become rows and vice-versa).
       ((#~=&' '),=&'O'#])"1                      Function that applies the "gravity"
                          "1                       Apply to every row separately:
                  =&'O'#]                           Get the O's in the row.
       (#~=&' ')                                    Get the spaces in the row.
                ,                                   Join them, spaces come first.
  [:|:                                            Reverse axes again.

Exemples (notez que les chaînes multilignes commencent par 0 : 0et se terminent par un crochet):

   f 0 : 0
O
OO O
OOOOO
) NB. output starts now
O  
O  
OO 
OO 
OOO
   f 0 : 0
O O
O O
) NB. Output starts now.

OO
OO

Si vous le pouvez, triez avant la rotation
edc65

@ edc65 Vous êtes un homme intelligent.
seequ

2

Haskell - 86

J'apprends juste, donc je suis sûr que cela peut être amélioré.

import Data.List
c=putStr.unlines.filter(/="").sort.map(filter(/=' ')).transpose.lines

Exemple d'entrée:

let a = "O    \nOO O \nOOOOO"
let b = " O O \n O O "
c a
c b

Exemple de sortie:

O
O
OO
OO
OOO

OO
OO

2

Python 2 (69) (79)

for c in sorted(zip(*raw_input().split("\\n"))):print''.join(c[::-1])

Prend l'entrée remplie d'espaces afin que toutes les lignes aient une longueur égale. Le splitcrée un arrat de chaque ligne. Le ziptranspose efficacement le tableau. Ensuite, sortedtrie les tuples dans l'ordre lexicographique, ce qui fait tomber toutes les pièces au fond. Enfin, nous imprimons chaque ligne, la transformant en chaîne, bien que nous devions d'abord l'inverser. Faire print'O'*c.count('O')est équivalent et utilise le même nombre de caractères.

Exemple d'exécution:

>> O    \nOO O \nOOOOO
O
O
OO
OO
OOO

1

C, 167 119 octets

Cette version plus courte est (malheureusement?) Beaucoup plus claire que l'original également.

m;j;b[99];r;main(){while(j=getchar()+1)j-11?m+=j-33&&++b[r]>m:++r;for(j=r;m+1;putchar(j--?m<b[j]?79:32:(j=r,m--,10)));}

0

Raquette: 130

(let l((a'()))(let((b(sort(string->list(read-line))char<?)))(if
(null? b)(apply map(λ x(map display x)(newline))a)(l(cons b a)))))

Il vous faut remplir avec des espaces pour que les lignes soient égales en longueur.


0

C # - 209 174 octets

Bon, je dois essayer ce golf Code à un moment donné, je pense. Création d'une fonction (r) qui fait pivoter la carte et l'imprime. Je suppose que je triche un peu quand j'imprime mon tableau de caractères, mais si vous ne pouvez pas comprendre pourquoi vous ne devriez pas être fou :)

Merci à ProgramFOX pour les conseils :)

void r(string s){int x=s.IndexOf('\n'),j,i=-1,k,z=x+1;var y=new char[x*x+x];for(;++i<x;y[z*(i+1)-1]='\n')for(k=j=x;j>0;)if(s[i*z+--j]=='0')y[k--*z-i-2]='0';Console.Write(y);}

Tricher

new char[x*x+x]remplit le tableau avec '\0'et non' '


1
La suppression des sauts de ligne et la suppression de l'espace entre char[]et yréduira le nombre de caractères à 192 caractères. De plus, il n'est pas vraiment nécessaire de fournir le mot-clé staticlors de la publication d'une réponse ici. Le supprimer réduira votre nombre de personnages à 185 caractères.
ProgramFOX

J'ai également pu supprimer «ref» qui y avait été oublié depuis un essai précédent.
WozzeC
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.