EDIT J'ai modifié le libellé des règles pour rendre certaines choses implicites plus explicites. J'ai également ajouté une certaine emphase pour dissiper certains points de confusion apparente et défini explicitement l'option de créer un programme autonome au lieu d'une fonction.
Le but ici est de créer une fonction qui prend un fichier texte (ou une chaîne) et le transpose pour que les lignes deviennent des colonnes et vice versa.
Exemple:
Je suis un texte. Transpose-moi. Pouvez-vous le faire?
Résulte en:
ITC ra aan mn sy apo ou ts eed xo tm .ei .t ?
Les règles:
- Vous pouvez supposer que les seuls caractères d'espacement utilisés sont
" "
et"\n"
et qu'il n'y a aucun espace de fin sur aucune ligne. - Vous pouvez supposer que le fichier est ASCII. Le marqueur de fin que vous souhaitez utiliser dépend de vous (CRLF ou LF). Il doit fonctionner correctement sur l'exemple, mais il doit également fonctionner sur toute entrée qui satisfait aux hypothèses ci-dessus.
- Vous devrez peut-être insérer des espaces (comme dans l'exemple) là où il n'y en avait pas afin de maintenir les colonnes en ligne.
- Votre résultat ne doit avoir aucun espace de fin sur aucune ligne .
- Le dernier caractère de nouvelle ligne (pour la dernière ligne) est facultatif.
- Il doit s'agir soit d'une fonction, soit d'un programme complet. Si votre fonction accepte une chaîne, elle doit renvoyer les résultats sous forme de chaîne. S'il accepte un nom de fichier, vous retournez le nom du fichier dans lequel vous avez enregistré le résultat. Vous êtes également autorisé à écrire un programme complet qui accepte les entrées de STDIN et renvoie le résultat correct à STDOUT; si vous procédez ainsi, vous ne devez rien envoyer à STDERR.
- La procédure la plus courte l'emporte, mais je voterai pour toutes les réponses que j'aime.
Selon les règles, la sortie de l'exemple est longue de 53 ou 52 octets (pour les sauts de ligne LF) selon que le saut de ligne final est inclus ou non.
Remarque: Ce n'est pas une exigence spécifique, mais si votre fonction, lorsqu'elle est exécutée deux fois de suite, n'est pas identique à l'original (la nouvelle ligne finale peut être différente et toutes les lignes vides à la fin du fichier seront supprimées), alors vous êtes enfreignant probablement l' une des règles.
Réponses:
Japt , 6 octets
Essayez-le
Exécutez-le deux fois - renvoie la chaîne d'origine
Explication
Transposer l'entrée
Carte sur chaque ligne
Couper à droite
la source
J (
3140)Il s'agit d'une fonction qui prend une chaîne et renvoie une chaîne (c'est-à-dire un vecteur de caractères avec des sauts de ligne insérés aux bons endroits, et non une matrice.)
Modifier: aucun espace de fin sur aucune ligne.
Tester:
la source
?\n
.cut
ni l' autredlb
par défaut et les écrire moi-même prend un tas de caractères même dans APL.Ruby 111
Golfé:
Non golfé:
Ruby a une fonction de transposition de tableau, donc cela remplit simplement les lignes, les transforme en un tableau de caractères, utilise la fonction de transposition Array # de Ruby, puis transforme le tableau de caractères en lignes.
Pour jouer au golf, il s'agissait simplement d'utiliser des identificateurs à un seul caractère, de supprimer des espaces, d'utiliser un temporaire pour text.lines et de placer le calcul pour max_length en ligne (il n'y a pas de points pour l'efficacité).
la source
"\n"
par?\n
..to_a
est superflu. Vous pouvez y gagner 5 autres personnages.R, 171
Exemple d'utilisation:
L'espace de fin est supprimé.
la source
Python 2.7 (
97799490)EDIT: Omission de l'exigence de fonction;
Je suis assez sûr que cela sera amélioré puisque je suis en quelque sorte un débutant ici, mais pour commencer;
Le code utilise un simple
split
pour diviser la chaîne en un vecteur de lignes. Il utilise ensuitemap
avec une valeur de fonction asNone
(la fonction d'unité) et l'opérateur splat pour transposer et remplir le vecteur (fonctionnalité similaire àzip_longest
Python3)Le reste du code mappe simplement
None
vers l'espace, ajuste et réassemble la matrice en une seule chaîne à nouveau.la source
map
. Je continue de chercher un endroit pour utiliser ça ... et vous me battez. ;)Bash + coreutils + sed, 83
fold
etpaste
faire le travail important. Le reste n'est que du formatage.Accepte les entrées de stdin et les sorties vers stdout:
la source
C (278 octets)
Edit: Cela enfreint les règles, car il prend un nom de fichier comme argument mais écrit dans stdout. Je vais le modifier plus tard pour écrire dans un fichier, puis imprimer le nom de fichier sur stdout.
Ceci est mon premier golf de code jamais, alors ayez pitié. Un peu de vieux C. Placez l'entrée
test.txt
et laissez-la fonctionner!clang transpose.c -o transpose && ./transpose test.txt
En utilisant des noms de variables courts, en supprimant le formatage gratuit, en autorisant les fuites de descripteurs de fichiers et en désactivant tous les avertissements, cela est réduit à 278 octets. (Puisqu'il utilise des importations implicites, il peut ne pas se lier correctement sur tous les systèmes. Fonctionne sur ma machine!)
la source
int
pour raccourcir certaines de vos déclarations, ou est-ce illégal maintenant?A,B,D,I,J,*F
tant que variables globales, afin d'éviter lesint
mots-clés. De même, vous pouvez supprimerint
de lamain
déclaration et de l'C
argument. DansC
,int
est facultatif dans de nombreux endroits.AutoHotkey 210
Tester
la source
Rubis: 88 caractères
(Publié parce qu'il est plus court que les autres solutions Ruby. Non vérifié si mon code introduit quelque chose de nouveau par rapport à ceux-ci. Si vous avez déjà publié une solution Ruby et que vous pensez que c'est principalement une copie de la vôtre, veuillez commenter et je retirerai ma réponse. )
Exemple d'exécution:
la source
Bash, 124 octets
Il lit l'entrée standard et écrit la sortie standard. Essayez-le:
Comment ça marche:
split
entrée sur des lignes simples (fichiers dans un répertoire temporaire$D
)grep
(fichiers * +)paste
(colonnes séparées par des tabulations)sed
Modifier:
;rm -r $D
(merci Tim)+
au lieu de_
comme suffixe et raccourcissez${F}_
à$F+
L
des fichiers de résultats fractionnésla source
rm
nombre de vos personnages.Ruby - 144 caractères
Voici ma première tentative, golfée:
Pour la sortie, exécutez
puts f text
oùtext
est une chaîne multi-lignes respectant les règles ci-dessus. La version non golfée est ci-dessous:Pour une solution similaire, mais finalement meilleure dans Ruby, consultez le code de Wayne Conrad ci-dessus.
la source
transpose
dans votre réponse avant d'écrire la mienne. Il ne me semble pas tout à fait casher d'avoir essentiellement réécrit votre réponse, mais un peu mieux. :(transpose
, il est possible qu'une meilleure solution Ruby n'aurait pas fait surface. L'une des choses que j'aime le plus dans la programmation est la volonté de collaborer et de polliniser les idées. Jusqu'à ce que nous nous revoyions, gentil monsieur. À votre santé!PHP 194
Non-golfé:
C'est ma première tentative de golf, alors soyez gentil! De plus, des conseils / suggestions seraient grandement appréciés!
la source
"
s autour"trim"
. php donnera un avertissement, mais cela fonctionne très bien.@
pour supprimer les avertissements.MATHEMATICA 117 caractères
la source
f
! .. tksPerl (92 + 1)
lit stdin et écrit sur stdout. ajouter 1 au score de
say
la source
CJam,
3225 octetsCJam est plus récent que ce défi, donc cette réponse ne peut pas être acceptée.
Considérablement raccourci par user23013.
Testez-le ici.
la source
Javascript, 103
Moins golfé
Tester
la source
Rétine , 40 octets
Essayez-le en ligne!
Basé sur ce programme que j'ai créé pour transposer n'importe quelle taille de rectangle, qui utilise la suggestion de Leo pour transposer un rectangle d'une taille connue.
Edit: Golfé plus et n'a plus d'espaces de fin sur les lignes.
la source
Perl 5 , 25 octets
Notez que cela utilise des séquences d'échappement ANSI et en tant que tel ne fonctionne pas sur TIO, vous pouvez cependant le voir en action ici .
Explication
Ce code modifie d'abord la valeur du séparateur de liste (
$"
) en un onglet vertical, suivi de la séquence d'échappement ANSI pour «revenir en arrière 1 colonne» (\x1b[1D
), puis nous définissons la variable imprimée implicitement$_
comme une chaîne qui commence par la séquence d'échappement ANSI pour 'commencer l'impression à la colonne de la ligne 1$.
(où se$.
trouve la ligne de texte actuelle)' (\x1b1;$.H
) et interpole la liste@F
(qui est une liste de tous les caractères de cette ligne, remplie par autosplit (-a
) avec un motif de fractionnement vide (-F
)) qui place le contenu de$"
entre chaque élément, en déplaçant le curseur verticalement vers le bas au lieu de continuer la sortie après le caractère précédent.Essayez-le en ligne!
la source
C ++ (243 caractères)
Voici une fonction qui prend et renvoie une chaîne.
J'aurais pu raser quelques dizaines de caractères, mais j'ai décidé de le garder en tant que code non stupide (fonctionne rapidement, se lit bien). Peut-être que j'ai décidé de le faire parce que c'est mon premier golf de code ... Je ne suis pas encore assez hardcore :)
Avec formatage:
la source
using namespace std;
.using namespace std;
devrait être ajouté au nombre de caractères.Python 2.7 - 115 caractères :
bon mot:
et dans une impression plus propre:
en 115 caractères:
la source
\n
est considérélen
comme un seul caractère, mais il en est de deux :)\n
est un. Je dis donc que l'un va bien.len("\n")
affichera 1, bien qu'il s'agisse certainement de 2 caractères distincts dans le code source. L'enregistrement de la source dans un fichierls
affichera 116. Il suffit de dire que celen
n'est pas la meilleure façon de mesurer la taille du code en raison du traitement des caractères d'échappement avant la mesure :)GolfScript, 51 caractères
Ceci est une première tentative; Je soupçonne que cela peut être amélioré. La majeure partie du code est de se conformer aux exigences de suppression de l'espace de remplissage et de fin - sans elles,
n%zip n*
cela suffirait.Ps. La version suivante à 46 caractères fera le travail pour l'exemple d'entrée donné, mais se bloquera si une colonne d'entrée est entièrement composée d'espaces:
Je suppose que cela suffit pour le disqualifier, même si le défi ne le dit pas explicitement.
la source
Schéma / Raquette 113
Le texte:
Sans nouvelles lignes et espaces blancs supplémentaires:
La version conviviale
la source
Haskell
C'était si court, j'avais besoin d'ajouter un espace blanc ...
la source
I am a text..?
Transpose met
Can you do i
.Python
89103 caractèresJe me sens sale.
90104 caractères pour la version industrielle. : ^)la source
Mathematica, 95 caractères
la source
K, 56
Cela devrait répondre aux spécifications maintenant.
Accepte une chaîne, renvoie une chaîne.
.
la source
{`/:x@'/:!max@#:'x:`\:x}
pour 26.Groovy, 98 caractères
en ligne
non golfé:
la source
Pyth , 11 octets
Essayez-le en ligne!
Prend l'entrée sous forme de chaîne, génère une liste de listes
Pyth , 25 octets
Prend l'entrée sous forme de chaîne, produit une chaîne.
Essayez-le en ligne!
la source
J,
2826 octetsSauvegardé 2 octets grâce à frownyfrog
Prend une chaîne, renvoie une chaîne. Je ne sais pas s'il existe une version plus courte du verbe de la
fonction'cutopen' que je pourrais utiliser.Il y a aussi le plus court
Mais je ne suis pas sûr qu'il relève des directives de l'OP, car il renvoie un tableau de caractères.
Comment ça marche:
L'autre version fonctionne de la même façon, mais ne convertit pas le tableau transposé en une chaîne correctement formatée.
Exemples:
la source
cutLF
.0|:>@cutLF
Lua ,
203189 octetsEssayez-le en ligne!
J'ai vu une autre solution Lua ici, mais je ne pense pas qu'il y ait un problème avec la publication de 2 solutions dans la même langue. S'il y en a, dites-le moi :)
la source