Descomprime algunos números


21

Su tarea es crear un programa o función que genere una cremallera con una longitud de 10 líneas. Cada línea de la cremallera está representada por dos guiones --:

--
--
--
--
--
--
--
--
--
--

El programa / función tomará un porcentaje (divisible por 10) como entrada, y la salida será la cremallera "descomprimida" (guiones separados) de la parte superior por el porcentaje, revelando el nivel inferior indexado 1 repetido 2 veces, con todos los niveles anteriores se repiten 4, 6, 8, ... etc. veces, manteniendo la parte inferior de la cremallera centrada.

Ejemplos

>>10%
-11-
 --
 --
 --
 --
 --
 --
 --
 --
 --

>>50%
-1111111111-
 -22222222-
  -333333-
   -4444-
    -55-
     --
     --
     --
     --
     --

>>100%
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-

La entrada (porcentaje) puede formatearse como desee (50%, .5, 50, 5 [cero implícito], etc.), y siempre estará en el rango de 0 a 100 y divisible por 10. El espacio en el los ejemplos deben conservarse en su salida.


¿Puede ser la entrada alguna vez 0%? ¿Se nos permite tomar la entrada dividida por 10? por ejemplo, en lugar de 50%, obtener 5?
DJMcMayhem

1
La entrada (porcentaje) se puede formatear como desee (50%, .5, 50), ¿puede ser justa 5?
Luis Mendo

@DrGreenEggsandIronMan la entrada puede ser 0%, y puede tomar la entrada en el formato más conveniente.
atlasólogo

@LuisMendo, sí, lo editaré en la pregunta, gracias.
atlasólogo

¿Se acepta un salto de línea inicial en lugar de uno posterior? ¿Se acepta el relleno absoluto?
Titus

Respuestas:


10

Python 2 - 184 151 146 bytes

def r(n):
  n/=10
  for i in range(1,11):
    if n<0:print"%s--"%p
    elif i>9:print" %s-10-"%p
    else:p=" "*~-i;print"%s-%s-"%(p,`i`*2*n);n-=1

El último número me molestó un poco. Es posible que pueda eliminar la segunda declaración if si la miro más tarde.

EDITAR: Thx a mbomb007 para eliminar 3 bytes. ¡Gracias a charredgrass por los consejos de formato para ayudar a eliminar muchos bytes! :-D ¡Gracias a TheBikingViking por ayudarme con otros dos bytes!


1
Use en i>9lugar de i==10y elimine el espacio en range(1, 11).
mbomb007

1
Pequeño consejo para jugar al golf en python: reduce muchos bytes del espacio en blanco al comprimir sus declaraciones en una línea. Por ejemplo, las últimas 3 líneas pueden convertirse p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
charredgrass

Gracias ! Eso ayuda mucho con este y definitivamente lo tendré en cuenta en el futuro del golf
Jeremy

1
Puede eliminar 2 bytes reemplazando (i-1)en la última línea con ~-i. Esto aprovecha la precedencia del operador y el hecho de que un cambio de bit seguido de una negación es lo mismo que restar 1.
TheBikingViking

¿Cuál es el punto de usar range(1,11)y luego (i-1)?
Leaky Nun

10

Python 2, 74 bytes

n=input()
x=0
exec"print' '*x+'-'+`x+1`*(n-x<<1-x/9)+'-';x=min(x+1,n);"*10

execAhorró dos bytes al unificar un bucle, gracias a Dennis.

EDITAR: adopté un enfoque ligeramente diferente y guardé dos bytes más.


1
Puede guardar 2 bytes usando el formato de cadena reemplazando '-'+`x+1`*(n-x<<1-x/9)+'-'en el execbucle con '-%s-'%`x+1`*(n-x<<1-x/9).
R. Kap

No, necesitaría padres alrededor del `x+1`*(n-x<<1-x/9).
Lynn

4

PowerShell v2 +, 130 120 116 110 bytes

param($n)$i=0;10..1|%{" "*$i+(("-"+("$($i+1)"*([math]::Max($n-10+$_,0))*2)),"-10")[$n-$_-eq9]+"-";$i+=$i-ne$n}

Edición 1: Golfó 10 bytes eliminando $xvariables y rehaciendo ligeramente la forma en que se formula la cadena.
Edición 2: Golfó otros 4 bytes rehaciendo cómo ocurre la entrada y rehaciendo cómo $ise calcula cada ciclo.
Edición 3: guardado 6 bytes mediante OP que permite la entrada como 0..10, por lo que no es necesario dividir por 10.

Sorprendentemente difícil!

Toma entrada como 1 , 5, etc., almacenada en $n. Establece la $ivariable auxiliar (uno de los muy raros momentos en que una variable debe inicializarse 0en PowerShell) y luego inicia un ciclo desde 10a 1.

Cada iteración, establecemos comenzar nuestra cadena con un número de espacios igual a $i , seguido de un pseudoternario (... , ...)[]. Dentro del pseudoternario, seleccionamos una cadena de cualquiera -con un número de dígitos (el mayor de $n-10+$_o 0, multiplicado por 2), o la cadena -10: la selección se basa en si estamos en la décima iteración y nuestra entrada fue 100. Concatenamos eso con una final -. Esa cadena resultante se coloca en la tubería.

Finalmente, incrementamos $i, y esto fue realmente complicado. Terminamos usando un truco binary-cast-to-int para $iaumentar solo hasta que alcanza $n, y luego mantenerlo en el mismo valor. Esto asegura que hemos llegado al "final" de la sangría de la cremallera en el nivel apropiado.

Una vez que el ciclo ha terminado, todas las cadenas resultantes se acumulan en la tubería y la salida es implícita.

Ejemplos

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 70
-11111111111111-
 -222222222222-
  -3333333333-
   -44444444-
    -555555-
     -6666-
      -77-
       --
       --
       --

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 100
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-


3

Pitón, 95 84 bytes

No sabía que las lambdas eran legales, gracias @Dr Green Eggs y Iron Man

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))

1
¡Hola, excelente primera respuesta! Puede sacarlo de una lista de comprensión para guardar 2 bytes, joinpuede tomar un generador directamente.
Morgan Thrapp

2
Puedes hacer una lambda en lugar de imprimir. Con la sugerencia de Morgan: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 bytes)
DJMcMayhem


1

Ruby, 74 bytes

Utiliza el formato implícito cero especificado en la pregunta, por lo que 40%es así f[4]si se asigna la función anónima f. Si se necesita un porcentaje completo, +6 bytes paran/=10;

Pruébalo en línea!

->n{10.times{|i|puts' '*[i,n].min+"-#{i>8?10:(i+1).to_s*2*(n-i)if i<n}-"}}

1

Python 3, 98, 90, 87 , 85 bytes.

Toma el número ya dividido entre 10. Probablemente pueda eliminar algunos de los padres, pero esto está bastante cerrado para jugar al golf.

lambda n:'\n'.join(' '*min(i,n)+'-%s-'%(str(i+1)*(n>i>8or(n-i)*2))for i in range(10))

1

Haskell, 83 bytes

f n=unlines[[[1..y]>>" ",take(2*(n-y))$cycle$show$y+1]>>=(++"-")|y<-min n<$>[0..9]]

¿Qué es ++"-"?
someonewithpc

1

Javascript es7, 105 bytes

A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`

llamar con

f=A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`


f(10)
f(5)
f(0)

The program/function ...- not snippet
Titus

1
Si reemplaza el \ncon una nueva línea real, puede guardar un byte.
Mama Fun Roll

1
@Titus ¿De qué estás hablando? Este "fragmento" es una función.
NiCk Newman

1
Ah bien. ES7, lo olvidé.
Titus

@MamaFunRoll tuve eso, pero no podía ser envuelta en "" y hago .length así que no estaba 100% seguro de que estaba en el claro - Voy a añadir que en :)
Charlie Wynn

1

Python 2.7, 113 108 77 bytes

n = input ()
para x en el rango (0,10):
v = str (x + 1) * (nx) 2
si x
n> 89: v = '10 '
print' '* min (x, n) + '-' + v + '-'

Primera vez jugando al golf. Voy a seguir, intenta obtenerlo <100.
Asume que la entrada es 1-10.

Editar: Usé algunos trucos de la respuesta de @LeakyNun (gracias), luego lo analicé un poco más y obtuve ... básicamente la misma respuesta: / No sabía sobre la conversión de cadena `int`, y 2 - boolean déjame deshacerme de la declaración if, que me permite deshacerme de toda la variable v. Muy genial.

Mi version:

n=input()
for x in range(10):print' '*min(x,n)+'-'+`x+1`*(n-x)*(2-(x>8))+'-'

Buena respuesta, y bienvenido al sitio! Puede quitar 9 bytes cambiando el nivel de sangría a 1 espacio, en lugar de 4.
DJMcMayhem

En realidad, podrías hacer esto aún más corto con esto:n=input(); for x in range(0,10):print' '*min(x,n)+'-'+('10'if x*n>89 else str(x+1)*(n-x)*2)+'-'
DJMcMayhem


0

Python 2.7, 110 99 95 91 bytes:

G=input();i=1;exec"print' '*[~-i,G][i>G]+'-%s-'%[`i`*(2*-~G-i*2),'10'][(i>9)*G>9];i+=1;"*10

Un programa completo que recibe información de un número entero en el rango inclusivo [1,10], donde 10significa 100%y 1significa 10%. Probablemente se pueda jugar golf un poco más.

¡Pruébelo en línea! (Ideona)


0

PHP 5.3, 92 91 bytes

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • para PHP 5.3 con register_globals=1y short_open_tags=1(y error_reporting=0)
    llame en cli conphp-cgi -f <filename> n=<number>
  • número del 0 al 10

  • para llamar en el navegador web con <scriptpath>?n=<number>: anteponer<pre>
  • para 4.0.1 <PHP <5.3: reemplazar ?:con?1: (+1)
  • para PHP> = 5.4: reemplace el primero $ncon ($n=$_GET[n])(+11)

sin golf como una función (cualquier PHP> = 4.0.1)

function unzip($n) // $n from 0 to 10
{
    for($i=0;$i<10;$i++)                // $i = line number -1
        $s.='
'.str_pad(                              // pad the result of the following on both sides
            '-'.                            // prepend '-'
            str_repeat($i+1,                // print line number
                ($n>9&&$i>8 ? 1             // in tenth line, if $n is 10: once
                : ($n-$i)*2)                    // else  2*($n-$i) times
            ).'-'                           // append '-'
            , 22,' ', STR_PAD_BOTH);    // pad to 22 width with SPC on both sides
    return $s;
}

Banco de pruebas

echo'<table border=1><tr>';
for($i=0;$i<11;$i++)echo'<th>',$i*10,'%</th>';
echo'</tr><tr>';
for($i=0;$i<11;$i++)echo'<td><pre>', unzip($i), '</pre></td>';
echo '</table>';

Ahora esto es nuevo para mí: PHP supera a JavaScript.
Este enfoque se juega al mínimo, creo.


STR_PAD_BOTH¿Qué es esto, K&R C? ¿ #defineTambién hacemos cosas en PHP? :-)
gato

@cat: sí, hay definiciones reales en PHP. pero solo estático; no como en C.
Tito


0

Perl, 122 bytes

$k=<>;for(my $i=0;$i++<10;){$s="-"."$i"x($k/10-$i+1);$p=length $s;$l=$l>$p?$l:$p;printf "%${l}s%s\n",$s,scalar reverse $s}

0

Lisp común (Lispworks), 314 bytes

(defun f()(let((s(string(read))))(let((n(/(parse-integer(subseq s 0(1-(length s))))10)))(if(> n 0)(progn(dotimes(r n)(progn(dotimes(c r)#1=(format t" "))(format t"-")(if(=(1+ r)10)(format t"10")(dotimes(j(* 2(- n r)))(format t"~S"(1+ r))))(format t"-~%")))(dotimes(d(- 10 n))(dotimes(c n)#1#)(format t"--~%")))))))

sin dorar:

    (defun f ()
      (let ((s (string (read))))
        (let ((n (/ (parse-integer (subseq s 0 (1- (length s)))) 10)))
          (if (> n 0)
              (progn
                (dotimes (r n)
                  (progn
                    (dotimes (c r)
                      (format t " "))
                    (format t "-")
                    (if (= (1+ r) 10)
                        (format t "10")
                      (dotimes (j (* 2 (- n r)))
                        (format t "~S" (1+ r))))
                    (format t "-~%")))
                (dotimes (d (- 10 n))
                  (dotimes (c n)
                    (format t " "))
                  (format t "--~%")))))))

Uso:

    CL-USER 2515 > (f)
    10%
    -11-
     --
     --
     --
     --
     --
     --
     --
     --
     --
    NIL

    CL-USER 2516 > (f)
    50%
    -1111111111-
     -22222222-
      -333333-
       -4444-
        -55-
         --
         --
         --
         --
         --
    NIL

    CL-USER 2517 > (f)
    100%
    -11111111111111111111-
     -222222222222222222-
      -3333333333333333-
       -44444444444444-
        -555555555555-
         -6666666666-
          -77777777-
           -888888-
            -9999-
             -10-
    NIL

0

APL, 46 bytes

{↑(⍳10){(''↑⍨1-⍺⌊a+1),1⌽'--',⍵⍴⍕⍺}¨10↑2×⌽⍳a←⍵}

El argumento debe darse como el porcentaje dividido por 10 (es decir: un entero simple, en el rango [0,10]).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.