Mettre en place un golfeur d'espaces blancs

15

Certains esolangs bidimensionnels, tels que Forked , et certains non-esolangs, tels que Python , peuvent parfois nécessiter des espaces avant les lignes de code. Ce n'est pas très golfique. De plus, je suis paresseux et j'écris un langage 2D qui a besoin de beaucoup d'espace avant le code. Votre tâche est d'écrire un outil qui rend ces langues plus golfiques.

Bien sûr, ce ne sera pas parfait; il ne peut pas être utilisé, par exemple, lorsqu'un nombre est le premier caractère d'une ligne de source. Cependant, cela sera généralement utile.

Défi

Vous écrirez un programme ou une fonction qui soit ...

  • ... prend un argument, un nom de fichier ou une chaîne, ou ...
  • ... lit à partir de l'entrée standard.

Votre programme agira comme cat, sauf:

  • Si le premier caractère d'une ligne est un nombre, votre code affichera x espaces, où x est ce nombre.
  • Sinon, il sera simplement imprimé.
  • Comme tous les autres caractères de l'entrée.

Cas de test

Contribution:

foo bar foo bar
1foo bar foo bar foo bar
2foo bar foo bar foo bar foo bar

Production:

foo bar foo bar
 foo bar foo bar foo bar
  foo bar foo bar foo bar foo bar

Contribution:

--------v
8|
8|
80
8,
7&

Production:

--------v
        |
        |
        0
        ,
       &

Contribution:

foo bar
bar foo
foo bar

Production:

foo bar
bar foo
foo bar

Contribution:

0123456789
1234567890
2345678901
3456789012
4567890123

Production:

123456789
 234567890
  345678901
   456789012
    567890123

Règles

  • La sortie doit être exactement comme l'entrée, sauf pour les lignes où le premier caractère est un nombre.
  • Votre programme ne peut rien ajouter / ajouter au début du fichier, sauf un saut de ligne si vous le souhaitez.
  • Votre programme peut ne faire aucune hypothèse sur l'entrée. Il peut contenir des lignes vides, pas de chiffres, des caractères Unicode, peu importe.
  • Si un nombre avec plus d'un chiffre commence une ligne (par exemple 523abcdefg), seul le premier chiffre (dans l'exemple, 5) doit se transformer en espaces.

Gagnant

Le code le plus court dans chaque langue gagne. Amuse-toi bien et bonne chance!

MD XF
la source
6
Of course, this will not be perfect; it cannot be used, for instance, when a number is the first character on a line of source.Ce n'est pas vrai, il suffit de mettre le premier caractère à 0 (ahem, votre dernier cas de test)
HyperNeutrino
Pouvons-nous lire une liste de chaînes de stdin ( est-ce valide )?
Riley

Réponses:

10

Cubiquement , 69 octets

R1B1R3B1~(+50<7?6{+54>7?6{-002+7~?6{(@5*1-1/1)6}}}(-6>7?6&@7+70-4~)6)

Essayez-le en ligne!

Explication:

Nous faisons d'abord cette initialisation:

R1B1R3B1

Pour configurer ce cube:

   533
   004
   000
411223455441
311222331440
311222331440
   555
   555
   200

La chose la plus importante à propos de ce cube est que la 5somme des faces est de 32, qui est la valeur requise pour imprimer les espaces. Par coïncidence, il se trouve également être assez court pour tous les autres calculs. Après cela est fait:

~( . . . )                                    Takes the first input, then loops indefinitely

  +50<7?6{+54>7?6{-002+7~?6{(@5*1-1/1)6}}}    Handle leading digit:
  +50<7?6{                               }    If input is greater than 47 ('0' is 48)
          +54>7?6{                      }     And input is less than 58 ('9' is 57)
                                              Then input is a digit
                  -002+7                      Set notepad equal to value of input digit
                        ~                     Take next input (only convenient place for it)
                         ?6{           }      If the notepad isn't 0
                            (        )6       While the notepad isn't 0:
                             @5                 Print a space
                               *1-1/1           Decrement the notepad by one
                                              Leading digit handled

     (-6>7?6&@7+70-4~)6                       Handle rest of line:
     (               )6                       While the notepad isn't 0:
      -6>7?6&                                   Exit if End of Input
             @7                                 Print the next character
               +70-4                            Set notepad to 0 if it was a newline
                    ~                           Take the next character
Kamil Drakari
la source
1
Wow, c'est une bonne utilisation de tout imbriqué ... +1
MD XF
6

Husk , 15 13 octets

-2 octets grâce à @Zgarb

mΓo+?oR' i;±¶

Essayez-le en ligne!

Utilise la même technique que @Jonathan Allan

Explication

             ¶  -- split input into a list of lines
m               -- apply the following function to each line
 Γ              --   deconstruct the string into a head and a tail
  o+            --   prepend to the tail of the string ...
    ?      ±    --     if the head is a digit (n)
     oR' i      --       the string of n spaces
                --     else
          ;     --       the head of the string
                -- implicitly print list of strings line-by-line
H.PWiz
la source
2
13 octets avec l'utilisation de Γ.
Zgarb
5

JavaScript (ES8), 38 37 octets

a=>a.replace(/^\d/gm,a=>''.padEnd(a))

Je ne pense pas que cela puisse être amélioré beaucoup plus.
1 octet enregistré grâce à Shaggy - Utilisez les fonctionnalités ES8.


la source
" Je ne pense pas que cela puisse être amélioré beaucoup plus. " - Vous pouvez enregistrer un octet en utilisant les ES8 padEndcomme ceci:s=>s.replace(/^\d/gm,m=>"".padEnd(m))
Shaggy
@Hirsute. Je ne savais pas que ES8 était déjà autorisé. Merci.
1
S'il y a un seul interprète (c'est-à-dire un navigateur) qui prend en charge une fonctionnalité, cette fonctionnalité est juste ici :)
Shaggy
4

Python 2 , 98 74 67 65 octets

-24 octets grâce à Jonathan Allan. -7 octets grâce à M. Xcoder.

for i in open('f'):print' '*int(i[0])+i[1:]if'/'<i[:1]<':'else i,

Essayez-le en ligne!

Prend l'entrée dans le fichier nommé f.

totalement humain
la source
Erreurs également quand aucun chiffre dans le premier caractère d'une ligne (lors de l'utilisation d'une liste comme moyen de choisir des éléments tous les éléments sont évalués)
Jonathan Allan
retour à 89
Jonathan Allan
87 octets - L'en-tête du lien TIO se moque open; le code attend un fichier nommé «f». Je pense que ça va?
Jonathan Allan
Ah, c'est vrai, ' '*0c'est falsey. L'utilisation [:1]reste cependant une sauvegarde. Inutile de le readcroire (et ce le serait readlines) puisque le comportement par défaut de openest de parcourir les lignes. Il n'y a pas non plus besoin du mode car 'r'c'est le mode par défaut. Si j'ai raison, c'est 73 !
Jonathan Allan
Continuons cette discussion dans le chat .
Jonathan Allan
4

Rubis , 24 21 + 1 = 25 22 octets

Utilise le -pdrapeau. -3 octets de Go.

sub(/^\d/){"%#$&s"%p}

Essayez-le en ligne!

Encre de valeur
la source
{"% # $ & s"% ""} enregistre 1 octet
GB
Et un autre octet si vous utilisez sub au lieu de gsub
GB
@GB et un autre octet en mettant %pà la fin au lieu de %"". Merci de votre aide!
Value Ink
3

05AB1E , 10 octets

v0y¬dićú},

Essayez-le en ligne!

Oliver Ni
la source
1
Comment entre-t-on avec des lignes vides?
Jonathan Allan
Aucune idée lol ... je vais y jeter un œil
Oliver Ni
|vy¬dićú},fonctionne pour 10 octets.
Riley
OK, ce n'est pas on ne peut pas entrer une ligne vide, c'est que le code ne fonctionne pas pour une ligne vide : si on utilise un seul zéro ça marche, donc ça doit être quelque chose sur la tête qui n'existe pas (il en va de même pour @ Riley's suggéré 10 au fait).
Jonathan Allan
@JonathanAllan Cela a quelque chose à voir avec le |fonctionnement. Il est censé le faire push the rest of input as an array with strings, mais il s'arrête aux lignes vides ( TIO ). J'ai soulevé cette question dans le salon de discussion 05AB1E si vous voulez en savoir plus.
Riley
2

Python 3 , 95 octets

lambda y:'\n'.join(re.sub('^\d',lambda x:' '*int(x.group()),z)for z in y.split('\n'))
import re

Essayez-le en ligne!

-4 octets en volant l'idée regex de ThePirateBay

HyperNeutrino
la source
4
Vous avez volé à ThePirateBay , comment les tables ont tourné
joH1
@Moonstroke HAH lol Je n'ai même pas remarqué que: P
HyperNeutrino
2

Gelée , 19 octets

V⁶ẋ
Ḣǹe?ØD;
ỴÇ€Yḟ0

Un lien monadique prenant et renvoyant des listes de personnages, ou un programme complet imprimant le résultat.

Essayez-le en ligne!

Comment?

V⁶ẋ - Link 1, make spaces: character (a digit)
V   - evaluate as Jelly code (get the number the character represents)
 ⁶  - a space character
  ẋ - repeat

Ḣǹe?ØD; - Link 2, process a line: list of characters
Ḣ        - head (get the first character and modify the line)
         -   Note: yields zero for empty lines
     ØD  - digit characters = "0123456789"
    ?    - if:
   e     - ...condition: exists in? (is the head a digit?)
 Ç       - ...then: call the last link as a monad (with the head as an argument)
  ¹      - ...else: identity (do nothing; yields the head)
       ; - concatenate with the beheaded line

ỴÇ€Yḟ0 - Main link: list of characters
Ỵ      - split at newlines
 Ç€    - call the last link (1) as a monad for €ach
   Y   - join with newlines
    ḟ0 - filter out any zeros (the results of empty lines)
Jonathan Allan
la source
beheaded lineEst-ce le terme réel? xD
HyperNeutrino
1
Eh bien, c'est maintenant :)
Jonathan Allan
Ahahaha j'ai essayé de vous faire du golf et je me suis retrouvé avec une solution essentiellement identique à la vôtre xD
HyperNeutrino
2

Haskell , 63 octets

unlines.map g.lines
g(x:r)|x<';',x>'/'=(' '<$['1'..x])++r
g s=s

Essayez-le en ligne! La première ligne est une fonction anonyme qui divise une chaîne donnée en lignes, applique la fonction gà chaque ligne et joint les lignes résultantes avec des retours à la ligne. Il gest vérifié si le premier caractère xd'une ligne est un chiffre. Si tel est le cas, ['1'..x]renvoie alors une chaîne de longueur égale à la valeur du chiffre xet ' '<$convertit la chaîne en autant d'espaces. Enfin, le reste de la ligne rest ajouté. Si xn'est pas un chiffre, nous sommes dans la deuxième équation g s=set renvoyons la ligne non modifiée.

Laikoni
la source
2

Python 2 , 76 72 68 octets

-4 octets grâce à @ovs !

@DeadPossum a suggéré de passer à Python 2, ce qui a également permis d'économiser 4 octets.

Je pensais juste que c'était agréable d'avoir un programme complet compétitif en Python 2 qui ne vérifie pas explicitement si le premier caractère est un chiffre. Ce lit l'entrée d'un fichier, f.

for i in open('f'):
 try:r=int(i[0])*" "+i[1:]
 except:r=i
 print r,

Essayez-le en ligne! (avec l'aimable autorisation de @ovs )

M. Xcoder
la source
@ovs Merci pour cela
M. Xcoder
@ovs Qu'avez-vous changé (je le ferai à la main)? Il me dit que le permalien ne peut pas être décodé
M. Xcoder
Au lieu d'imprimer à chaque itération, j'ai affecté la sortie à une variable et l'ai imprimée à la fin.
2017
@ovs J'ai réussi à obtenir 72 octets en imprimant chaque itération, merci pour l'idée de variable!
M. Xcoder
La version Python 2 de printvous donnera 68 octets
Dead Possum
2

Java 8 , 105 99 97 93 octets

Enregistré quelques octets supplémentaires grâce à la suggestion de Nevay,

s->{int i=s.charAt(0);if(i>47&i<58)s=s.substring(1);while(i-->48)s=" "+s;System.out.print(s);}
CoderCroc
la source
1
Vous avez deux bogues dans votre version golfée: la vérification des chiffres doit utiliser et au lieu de ou; Les crochets après la vérification des chiffres sont manquants. En plus de cela, vous pouvez enregistrer quelques octets en utilisant s->{int i=s.charAt(0);if(i>47&i<58)for(s=s.substring(1);i-->48;s=" "+s);System.out.print(s);}(93 octets).
Nevay
@Nevay Vous avez raison. Merci. Je mettrai à jour ma réponse.
CoderCroc
2

R , 138 128 octets

-9 octets grâce à CriminallyVulgar

n=readLines();for(d in grep("^[0-9]",n))n[d]=gsub('^.?',paste0(rep(' ',eval(substr(n[d],1,1))),collapse=''),n[d]);cat(n,sep='
')

C'est assez mauvais, mais c'est un peu mieux maintenant ... R est, encore une fois, terrible aux cordes.

Essayez-le en ligne!

Giuseppe
la source
2
Je commente au nom de CriminallyVulgar , qui suggère une version de 129 octets , mais n'a pas assez de réputation pour commenter.
M. Xcoder
@ Mr.Xcoder Merci et @CriminallyVulgar!
Giuseppe
123 octets Apparemment, le représentant peut prendre une chaîne de caractères int pour le deuxième argument ???
CriminallyVulgar
@CriminallyVulgar hein. il est juste là dans la documentation pour le représentant , maintenant que je les vérifie à nouveau: "d'autres entrées étant forcées à un vecteur entier ou double".
Giuseppe
2

Japt (v2.0a0), 11 10 octets

Japt bat Jelly et 05AB1E? Cela ne semble pas correct!

r/^\d/m_°ç

Essaye-le


Explication

Saisie implicite de chaîne U

r/^\d/m

Utilisez Regex replace ( r) toutes les occurrences d'un chiffre au début d'une ligne ( mest l'indicateur multiligne - l' gindicateur est activé par défaut dans Japt).

_

Passez chaque correspondance à travers une fonction, où Zest l'élément actuel.

°

L'opérateur d'incrémentation postfix ( ++). Cela se convertit Zen un entier sans l'augmenter pour l'opération suivante.

ç

Répétez un caractère espace Zfois.

Sortie implicite de la chaîne résultante.

Hirsute
la source
Peut m@être raccourci?
Oliver
Pas dans ce cas, @Oliver; l' mest ici le drapeau à plusieurs lignes pour la regex, pas la méthode de la carte.
Shaggy
1
@Oliver: r/^\d/m_î(ou r/^\d/m_ç) serait de 2 octets plus court mais Zest une chaîne donc, malheureusement, cela ne fonctionnerait pas. r/^\d/m_°ç, pour une économie de 1 octet, ça marche quand même :)
Shaggy
°çest une astuce incroyable :-) J'aurais suggéré juste \dpour l'expression régulière, mais cela laisse de côté le drapeau ... peut-être que je devrais ajouter un support pour les drapeaux sur les expressions régulières de classe unique, comme \dm(oh oui, et cela laisse de côté le ^trop ...)
ETHproductions
@ETHproductions, serait-il possible / possible de rendre l'ouverture /facultative dans RegExes?
Shaggy
1

Gelée , 19 octets

Ḣ⁶ẋ;µ¹µḣ1ẇØDµ?
ỴÇ€Y

Essayez-le en ligne!

-5 octets au total grâce aux commentaires de Jonathan Allan et en regardant son post

Explication

Ḣ⁶ẋ;µ¹µḣ1ẇØDµ?  Main link
             ?  Ternary if
                if:
       ḣ1       the first 1 element(s) (`Head` would modify the list which is not wanted)
         ẇ      is a sublist of (essentially "is an element of")
          ØD    "0123456789"
                then:
  ẋ             repeat
 ⁶              ' '
Ḣ               n times where n is the first character of the line (head)
   ;            concatenate the "beheaded" string (wording choice credited to Jonathan Allan)
                else:
     ¹          Identity (do nothing)
    µ µ     µ   Link separators
ỴÇ€Y            Executed Link
Ỵ               Split by newlines
  €             For each element,
 Ç              call the last link on it
   Y            Join by newlines
HyperNeutrino
la source
pas besoin d'échanger d'arguments:Ḣ⁶ẋ;
Jonathan Allan
L'astuce pop puis head ne fonctionnera pas s'il y a une ligne contenant uniquement un caractère à un seul chiffre :( - ;0Ḣfonctionnerait pour un octet, peut-être qu'il y a un seul atome, j'ai également essayé ¹, pas de joie là
Jonathan Allan
1
@JonathanAllan Ah oui. Merci. ḣ1ẇØDfonctionne pour le même bytecount \ o /
HyperNeutrino
ṚṪfonctionnera :)
Jonathan Allan
@JonathanAllan Ça marche aussi :) Mais j'ai déjà fait une explication pour ma méthode donc je suis trop paresseux pour la changer: P Mais merci quand même :)
HyperNeutrino
1

Pyth ,  16  15 octets

jm.x+*;shdtdd.z

Essayez-le en ligne!


Explication

jm.x + *; shdtdd.z - Programme complet qui fonctionne en lisant tout depuis STDIN.

             .z - Lisez tous les STDIN et divisez-les par sauts de ligne.
 m - Carte avec une variable d.
  .x - Essayez:
     *; shd - Pour convertir le premier caractère en entier et le multiplier par un espace.
    + td - Et ajoutez tout sauf le premier caractère
            d - Si ce qui précède échoue, ajoutez simplement la chaîne entière.
j - Rejoignez par des nouvelles lignes.

Prenons un exemple qui devrait être plus facile à traiter. Disons que notre contribution est:

foo bar foo bar
1foo bar foo bar foo bar
2foo bar foo bar foo bar foo bar

Le programme ci-dessus fera ce qui suit:

  • .z- Lit tout et le divise par des nouvelles lignes, donc nous obtenons ['foo bar foo bar', '1foo bar foo bar foo bar', '2foo bar foo bar foo bar foo bar'].

  • Nous obtenons le premier caractère de chaque: ['f', '1', '2'].

  • S'il est convertible en un entier, nous répétons un espace qui multiplie les temps et ajoutons le reste de la chaîne. Sinon, nous plaçons simplement la chaîne entière. Par conséquent, nous avons ['foo bar foo bar', ' foo bar foo bar foo bar', ' foo bar foo bar foo bar foo bar'].

  • Enfin, nous nous joignons par des nouvelles lignes, donc notre résultat est:

    foo bar foo bar
     foo bar foo bar foo bar
      foo bar foo bar foo bar foo bar
    
M. Xcoder
la source
1
Haha, nous avons battu Jelly :)
M. Xcoder
1

Cubiquement , 82 octets

R3D1R1D1+0(?6{?7@7~:1+2<7?6{+35>7?6{:7-120?6{(B3@5B1-0)6}:0}}}?6!@7~-60=7&6+4-3=7)

Remarque: cela ne fonctionnera pas sur TIO . Pour tester cela, utilisez l' interpréteur Lua avec l'indicateur expérimental défini sur true (pour activer les conditions). Il y a actuellement un bogue avec des blocs conditionnels sur l'interpréteur TIO. Lorsque vous utilisez l'interpréteur TIO, vous devez remplacer ?6!par !6et &6par ?6&, ce qui maintient le nombre d'octets le même.

R3D1R1D1          Set the cube so that face 0 has value 1 and the rest of the values are easy to calculate

+0                Set the notepad to 1 so that it enters the conditional below
(                 Do
  ?6{               If the notepad is 1 (last character was \n or start of input)
    ?7@7              Output the current character if it's \n
    ~                 Get the next character
    :1+2<7?6{         If the input is >= '0'
      +35>7?6{          If the input is <= '9'
        :7-120            Set the notepad to the input - '0'
        ?6{               If the notepad isn't 0
          (                 Do
            B3@5              Output a space
            B1-0              Subtract 1 from notepad
          )6                While notepad > 0
        }                 End if
        :0              Set notepad to 1
      }                 End if
    }                 End if
  }                 End if

  ?6!@7             If the notepad is 0 (did not attempt to print spaces), print current character

  ~                 Get next character
  -60=7&6           If there is no more input, exit the program
  +4-3=7            Check if current character is \n, setting notepad to result
)                 Repeat forever

Ce n'est pas aussi court que l'autre réponse cubique, mais j'ai pensé essayer de toute façon: D

TehPers
la source
Que se passe-t-il avec les boucles dans l'interpréteur TIO?
MD XF
@MDXF )passe à la plus récente (plutôt qu'à celle qui me correspond. EDIT: je suis dans le chat.
TehPers
@MDXF C'était peut-être les blocs conditionnels, en fait. J'ai oublié, je mettrai à jour la réponse. Quoi qu'il en soit, ils ne correspondaient pas.
TehPers
1
Très bien, je regarderai cela plus tard. Je termine actuellement Cubically 2.
MD XF
@MDXF C'est ... vraiment excitant d'entendre réellement o_O
TehPers
1

> <> , 60 octets

!^i:0(?;::"/")$":"(*0$.
v"0"-
>:?!v1-" "o
;>:o>a=&10&?.i:0(?

Essayez-le en ligne!

Comment ça fonctionne:

..i:0(?;... Gets input and ends if it is EOF
...
...
...

.^......::"/")$":"(*0$. If the inputted character is a digit go to the second line
...                     Else go to the fourth
...
...

....        If it was a digit
v"0"-       Subtract the character "0" from it to turn it into the corresponding integer
>:?!v1-" "o And print that many spaces before rejoining the fourth line
...

.^..               On the fourth line,
....               Copy and print the input (skip this if it was a digit)
....v              If the input is a newline, go back to the first line.
;>:o>a=&10&?.i:0(? Else get the input, ending on EOF
Jo King
la source
0

V , 9 octets

ç^ä/x@"é 

Essayez-le en ligne!

Explication

ç  /      ' On lines matching
 ^ä       ' (Start)(digit)
    x     ' Delete the first character
     @"   ' (Copy Register) number of times
       é  ' Insert a space
nmjcman101
la source
0

Gema, 21 personnages

\N<D1>=@repeat{$1;\ }

Exemple d'exécution:

bash-4.4$ gema '\N<D1>=@repeat{$1;\ }' <<< 'foo bar foo bar
> 1foo bar foo bar foo bar
> 2foo bar foo bar foo bar foo bar
> 
> --------v
> 8|
> 8|
> 80
> 8,
> 7&'
foo bar foo bar
 foo bar foo bar foo bar
  foo bar foo bar foo bar foo bar

--------v
        |
        |
        0
        ,
       &
homme au travail
la source
0

PHP, 83 caractères

preg_replace_callback('/^\d/m',function($m){return str_repeat(' ',$m[0]);},$argv);
Petah
la source
Je pense que votre code n'est pas conforme aux règles d'entrée de ce défi, vous devez l'enfermer dans une fonction avec un $s argument ou le remplir avec l'entrée. Et il n'imprime rien
LP154
@ LP154 utilise argvacceptable?
Petah
@Petah Si j'ai raison de supposer que ce argvsont les arguments de la ligne de commande, alors oui.
2017 totalement humain