Implementar un golfista de espacios en blanco

15

Algunos esolangs bidimensionales, como Forked , y algunos no esolangs, como Python , a veces pueden requerir espacios antes de las líneas de código. Esto no es muy golfoso. Además, soy flojo y escribo un lenguaje 2D que necesita muchos espacios antes del código. Su tarea es escribir una herramienta que haga que estos idiomas sean más golfistas.

Por supuesto, esto no será perfecto; no se puede usar, por ejemplo, cuando un número es el primer carácter en una línea de origen. Sin embargo, generalmente será útil.

Desafío

Escribirás un programa o función que ...

  • ... toma un argumento, un nombre de archivo o una cadena, o ...
  • ... lee de la entrada estándar.

Su programa actuará como cat, excepto:

  • Si el primer carácter en cualquier línea es un número, su código imprimirá x espacios, donde x es ese número.
  • De lo contrario, simplemente se imprimirá.
  • Como lo hará cualquier otro personaje en la entrada.

Casos de prueba

Entrada:

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

Salida:

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

Entrada:

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

Salida:

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

Entrada:

foo bar
bar foo
foo bar

Salida:

foo bar
bar foo
foo bar

Entrada:

0123456789
1234567890
2345678901
3456789012
4567890123

Salida:

123456789
 234567890
  345678901
   456789012
    567890123

Reglas

  • La salida debe ser exactamente como entrada, excepto para las líneas donde el primer carácter es un número.
  • Su programa no puede agregar / anteponer nada al archivo, excepto una nueva línea final si lo desea.
  • Su programa puede no hacer suposiciones sobre la entrada. Puede contener líneas vacías, sin números, caracteres Unicode, lo que sea.
  • Si un número con más de un dígito comienza una línea (por ejemplo 523abcdefg), solo el primer dígito (en el ejemplo, 5) debe convertirse en espacios.

Ganador

El código más corto en cada idioma gana. ¡Diviértete y buena suerte!

MD XF
fuente
66
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.No es cierto, simplemente ponga el primer personaje en 0 (ejem, su último caso de prueba)
HyperNeutrino
¿Podemos leer una lista de cadenas de stdin ( es esto válido )?
Riley

Respuestas:

10

Cúbicamente , 69 bytes

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

Pruébalo en línea!

Explicación:

Primero hacemos esta inicialización:

R1B1R3B1

Para configurar este cubo:

   533
   004
   000
411223455441
311222331440
311222331440
   555
   555
   200

Lo más importante de este cubo es que las 5sumas de la cara son 32, que es el valor requerido para imprimir espacios. Casualmente, también resulta ser bastante corto para todos los demás cálculos. Después de eso se hace:

~( . . . )                                    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
fuente
1
Wow, eso es un buen uso de anidado ... todo. +1
MD XF
6

Casco , 15 13 bytes

-2 bytes gracias a @Zgarb

mΓo+?oR' i;±¶

Pruébalo en línea!

Utiliza la misma técnica que @Jonathan Allan

Explicación

             ¶  -- 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
fuente
2
13 bytes con el uso de Γ.
Zgarb
5

JavaScript (ES8), 38 37 bytes

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

No creo que se pueda mejorar mucho más.
Guardado 1 byte gracias a Shaggy : utilice las funciones de ES8.


fuente
" No creo que se pueda mejorar mucho más " . - Podría guardar un byte utilizando ES8 de esta padEndmanera:s=>s.replace(/^\d/gm,m=>"".padEnd(m))
Shaggy
@Lanudo. No sabía que ES8 ya está permitido. Gracias.
1
Si hay un solo intérprete (es decir, navegador) que admite una función, entonces esa función es un juego justo aquí :)
Shaggy
4

Python 2 , 98 74 67 65 bytes

-24 bytes gracias a Jonathan Allan. -7 bytes gracias al Sr. Xcoder.

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

Pruébalo en línea!

Toma entrada en el archivo nombrado f.

totalmente humano
fuente
También errores cuando no hay dígitos en el primer carácter de una línea (cuando se usa una lista como una forma de elegir elementos, se evalúan todos los elementos)
Jonathan Allan
volver a 89
Jonathan Allan
87 bytes : el encabezado del enlace TIO es burlón open; el código espera un archivo llamado 'f'. ¿Creo que está bien?
Jonathan Allan
Ah, cierto, ' '*0es Falsey. Sin [:1]embargo, el uso sigue siendo un ahorro. No readcreo que sea necesario (y lo sería readlines) ya que el comportamiento predeterminado de openes iterar a través de las líneas. Además, no hay necesidad del modo ya que 'r'es el predeterminado. Si estoy en lo cierto, ¡son 73 !
Jonathan Allan
Continuemos esta discusión en el chat .
Jonathan Allan
4

rubí , 24 21 + 1 = 25 22 bytes

Utiliza el -p bandera. -3 bytes de GB.

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

Pruébalo en línea!

Tinta de valor
fuente
{"% # $ & s"% ""} ahorra 1 byte
GB
Y otro byte si usa sub en lugar de gsub
GB
@GB y otro byte poniendo %pal final en lugar de %"". ¡Gracias por tu ayuda!
Value Ink
3

05AB1E , 10 bytes

v0y¬dićú},

Pruébalo en línea!

Oliver Ni
fuente
1
¿Cómo se ingresa con líneas vacías?
Jonathan Allan
No tengo idea jajaja ... Lo investigaré
Oliver Ni
|vy¬dićú},Funciona para 10 bytes.
Riley
OK, no se puede ingresar una línea vacía, es que el código no funciona para una línea vacía : si se usa un solo cero, funciona, por lo que debe ser algo sobre la cabeza no existente (lo mismo ocurre con 10 sugeridos por @ Riley byter por cierto).
Jonathan Allan
@ JonathanAllan Tiene algo que ver con la forma en que |funciona. Se supone que debe hacerlo push the rest of input as an array with strings, pero se detiene en líneas vacías ( TIO ). Mencioné esto en la sala de chat 05AB1E si quieres saber más.
Riley
2

Python 3 , 95 bytes

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

Pruébalo en línea!

-4 bytes al robar la idea regex de ThePirateBay

Hiperneutrino
fuente
44
Usted robó a ThePirateBay , cómo han cambiado las tornas
joH1
@Moonstroke HAH lol Ni siquiera me di cuenta de eso: P
HyperNeutrino
2

Jalea , 19 bytes

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

Un enlace monádico que toma y devuelve listas de caracteres, o un programa completo que imprime el resultado.

Pruébalo en línea!

¿Cómo?

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
fuente
beheaded line¿Es ese el término real? xD
HyperNeutrino
1
Bueno, ahora es :)
Jonathan Allan
Jajaja Intenté superarlo y terminé con una solución esencialmente idéntica a la suya xD
HyperNeutrino
2

Haskell , 63 bytes

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

Pruébalo en línea! La primera línea es una función anónima que divide una cadena dada en líneas, aplica la función ga cada línea y une las líneas resultantes con nuevas líneas. En gella se verifica si el primer carácter xde una línea es un dígito. Si este es el caso, ['1'..x]produce una cadena con una longitud igual al valor del dígito xy ' '<$convierte la cadena en tantos espacios. Finalmente rse agrega el resto de la línea . Si xno es un dígito, estamos en la segunda ecuación g s=sy devolvemos la línea sin modificar.

Laikoni
fuente
2

Python 2 , 76 72 68 bytes

-4 bytes gracias a @ovs !

@DeadPossum sugirió cambiar a Python 2, que también ahorró 4 bytes.

Solo pensé que es bueno tener un programa completo competitivo en Python 2 que no verifique explícitamente si el primer carácter es un dígito. Esto lee la entrada desde un archivo, f.

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

Pruébalo en línea! (cortesía de @ovs )

Sr. Xcoder
fuente
@ovs Gracias por eso
Sr. Xcoder
@ovs ¿Qué cambiaste (lo haré a mano)? Me dice que el enlace permanente no se puede decodificar
Sr. Xcoder
En lugar de imprimir en cada iteración, asigné el resultado a una variable y lo imprimí todo al final.
Ovs
@ovs Logré obtener 72 bytes imprimiendo cada iteración, ¡gracias por la idea variable!
Sr. Xcoder
La versión de Python 2 printle dará 68 bytes
Dead Possum
2

Java 8 , 105 99 97 93 bytes

Ahorré algunos bytes más gracias a la sugerencia 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
fuente
1
Tiene dos errores en su versión de golf: la verificación de dígitos debe usarse y en lugar de o; Faltan los corchetes después de la verificación de dígitos. Además de eso, puede guardar algunos bytes utilizando 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 bytes).
Nevay
@Nevay Tienes razón. Gracias. Actualizaré mi respuesta.
CoderCroc
2

R , 138 128 bytes

-9 bytes gracias a 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='
')

Esto es bastante malo, pero ahora es un poco mejor ... R es, una vez más, terrible en las cuerdas.

Pruébalo en línea!

Giuseppe
fuente
2
Estoy comentando en nombre de CriminallyVulgar , quien sugiere una versión de 129 bytes , pero no tiene suficiente reputación para comentar.
Sr. Xcoder
@ Mr.Xcoder ¡Gracias y @CriminallyVulgar!
Giuseppe
123 Bytes Aparentemente, el representante puede tomar una cadena de int para el segundo argumento ???
CriminallyVulgar
@CriminallyVulgar eh. está justo allí en los documentos para el representante , ahora que los reviso de nuevo: "otras entradas están siendo coaccionadas a un entero o doble vector".
Giuseppe
2

Japt (v2.0a0), 11 10 bytes

¿Japt venció a Jelly y 05AB1E? Eso no parece correcto!

r/^\d/m_°ç

Pruébalo


Explicación

Entrada implícita de cadena U

r/^\d/m

Use Regex replace ( r) todas las apariciones de un dígito al comienzo de una línea ( mes la bandera multilínea; la gbandera está habilitada de forma predeterminada en Japt).

_

Pase cada partido a través de una función, donde Zestá el elemento actual.

°

El operador de incremento de postfix ( ++). Esto se convierte Zen un entero sin aumentarlo para la siguiente operación.

ç

Repetir un espacio de caracteres Zveces.

Salida implícita de la cadena resultante.

Lanudo
fuente
Se m@puede acortar?
Oliver
No en este caso, @Oliver; el maquí es la bandera de varias líneas de la expresión regular, no el método de mapa.
Shaggy
1
@Oliver: r/^\d/m_î(o r/^\d/m_ç) sería 2 bytes más corto pero Zes una cadena así que, desafortunadamente, no funcionaría. r/^\d/m_°ç, Para un ahorro de 1 byte, hace el trabajo, aunque :)
Shaggy
°çes un truco increíble :-) Hubiera sugerido solo \dpara la expresión regular, pero eso deja fuera la bandera ... tal vez debería agregar soporte para banderas en expresiones regulares de una sola clase, como \dm(oh sí, y eso ^también deja fuera la bandera) ...)
ETHproductions
@ETHproductions, ¿sería factible / posible hacer que la apertura sea /opcional en RegExes?
Shaggy
1

Jalea , 19 bytes

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

Pruébalo en línea!

-5 bytes en total gracias a los comentarios de Jonathan Allan y al mirar su publicación

Explicación

Ḣ⁶ẋ;µ¹µḣ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
Hiperneutrino
fuente
no es necesario intercambiar argumentos:Ḣ⁶ẋ;
Jonathan Allan
El truco de la cabeza del pop no funcionará si hay una línea que contiene solo un carácter de un solo dígito :( - ;0Ḣfuncionaría para un byte, tal vez haya un solo átomo, también lo intenté ¹, no hay alegría allí
Jonathan Allan
1
@ JonathanAllan Ah, cierto. Gracias. ḣ1ẇØDfunciona para el mismo bytecount \ o /
HyperNeutrino
ṚṪfuncionará :)
Jonathan Allan
@JonathanAllan Eso también funciona :) Pero ya hice una explicación para mi método, así que soy demasiado vago para cambiarlo: P Pero gracias de todos modos :)
HyperNeutrino
1

Pyth ,  16  15 bytes

jm.x+*;shdtdd.z

Pruébalo en línea!


Explicación

jm.x + *; shdtdd.z: programa completo que funciona leyendo todo desde STDIN.

             .z: lea todo STDIN y divídalo por avances de línea.
 m - Mapa con una variable d.
  .x - Prueba:
     *; shd: para convertir el primer carácter en un entero y multiplicarlo por un espacio.
    + td - Y agrega todo excepto el primer personaje
            d - Si lo anterior falla, simplemente agregue la cadena completa.
j - Únete por nuevas líneas.

Tomemos un ejemplo que debería ser más fácil de procesar. Digamos que nuestra entrada es:

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

El programa anterior hará lo siguiente:

  • .z- Lo lee todo y lo divide por nuevas líneas, así que lo tenemos ['foo bar foo bar', '1foo bar foo bar foo bar', '2foo bar foo bar foo bar foo bar'].

  • Obtenemos el primer carácter de cada uno: ['f', '1', '2'].

  • Si es convertible a un entero, repetimos un espacio que es entero y suma el resto de la cadena. De lo contrario, simplemente colocamos toda la cadena. Por lo tanto, tenemos ['foo bar foo bar', ' foo bar foo bar foo bar', ' foo bar foo bar foo bar foo bar'].

  • Finalmente, nos unimos por nuevas líneas, por lo que nuestro resultado es:

    foo bar foo bar
     foo bar foo bar foo bar
      foo bar foo bar foo bar foo bar
    
Sr. Xcoder
fuente
1
Jaja,
vencimos
1

Cúbicamente , 82 bytes

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)

Nota: Esto no funcionará en TIO . Para probar esto, use el intérprete de Lua con el indicador experimental establecido en verdadero (para habilitar condicionales). Actualmente hay un error con bloques condicionales en el intérprete TIO. Cuando use el intérprete TIO, debe reemplazar ?6!con !6y &6con ?6&, lo que mantiene el recuento de bytes igual.

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

Esto no es tan corto como la otra respuesta cúbica, pero pensé en intentarlo de todos modos: D

TehPers
fuente
¿Qué pasa con los bucles en el intérprete TIO?
MD XF
@MDXF )salta al más reciente en (lugar del correspondiente, creo. EDITAR: estoy en el chat.
TehPers
@MDXF Tal vez fueron los bloques condicionales, en realidad. Olvidé, actualizaré la respuesta. De todos modos, no estaban haciendo juego.
TehPers
1
Está bien, lo veré más tarde. Actualmente estoy terminando Cubically 2.
MD XF
@MDXF Eso es ... realmente emocionante escucharlo realmente o_O
TehPers
1

> <> , 60 bytes

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

Pruébalo en línea!

Cómo funciona:

..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
fuente
0

V , 9 bytes

ç^ä/x@"é 

Pruébalo en línea!

Explicación

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

Gema, 21 personajes

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

Ejecución de muestra:

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
        ,
       &
hombre trabajando
fuente
0

PHP, 83 caracteres

preg_replace_callback('/^\d/m',function($m){return str_repeat(' ',$m[0]);},$argv);
Petah
fuente
Creo que su código no cumple con las reglas de entrada de este desafío, debe encerrar esto en una función con un $s argumento o completarlo con la entrada. Y no imprime nada
LP154
@ LP154 está utilizando argvaceptable?
Petah
@Petah Si estoy en lo cierto al suponer que argves la línea de comando args, entonces sí.
totalmente humano