Descompacte alguns números

21

Sua tarefa é criar um programa ou função que gere um zíper com um comprimento de 10 linhas. Cada linha do zíper é representada por dois traços --:

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

O programa / função terá uma porcentagem (divisível por 10) como entrada e a saída será o zíper "descompactado" (traços separados) do topo pela porcentagem, revelando o nível mais baixo indexado em 1 repetido 2 vezes, com todos os níveis anteriores repetidos 4, 6, 8, ... etc. vezes, mantendo a parte inferior do zíper centralizada.

Exemplos

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

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

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

A entrada (porcentagem) pode ser formatada como você desejar (50%, 0,5, 50, 5 [zero implícito], etc), e sempre estará no intervalo de 0 a 100 e divisível por 10. O espaçamento no exemplos devem ser preservados em sua saída.

atlasologist
fonte
Pode a entrada ser alguma vez 0%? Podemos pegar a entrada dividida por 10? por exemplo, em vez de 50%, entendeu 5?
DJMcMayhem
11
A entrada (porcentagem) pode ser formatada da maneira que você desejar (50%, 0,5, 50). Pode ser justo 5?
Luis Mendo
@DrGreenEggsandIronMan a entrada pode ser 0% e você pode pegar a entrada no formato mais conveniente.
Atlasologist
@LuisMendo, sim, vou editar isso na pergunta, obrigado.
Atlasologist
Uma quebra de linha principal é aceita em vez de uma à direita? O preenchimento absoluto é aceito?
Titus

Respostas:

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

O último número meio que mexeu comigo um pouco. Talvez eu consiga remover a segunda declaração if, se eu olhar para ela mais tarde.

EDIT: Thx para mbomb007 para remover 3 bytes. Agradecemos ao charredgrass pelas dicas de formatação para ajudar a remover muitos e muitos bytes! :-D Obrigado a TheBikingViking por ajudar com mais dois bytes!

Jeremy
fonte
11
Use em i>9vez de i==10e remova o espaço range(1, 11).
mbomb007
11
Pequena dica para jogar golfe em python: você reduz muitos bytes do espaço em branco compactando suas instruções em uma linha. Por exemplo, as três últimas linhas podem se tornar p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
Charredgrass
obrigado ! Isso ajuda muito com um presente e eu definitivamente vou manter isso em mente no futuro golfe
Jeremy
11
Você pode cortar 2 bytes substituindo (i-1)na última linha por ~-i. Isso tira proveito da precedência do operador e o fato de que um pequeno giro seguido por uma negação é o mesmo que subtrair 1.
TheBikingViking
Qual é o sentido de usar range(1,11)e então (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

Economizou dois bytes ao execmodificar um loop, graças a Dennis.

Edição: Adotei uma abordagem um pouco diferente e salvei mais dois bytes.

Lynn
fonte
11
Você pode salvar 2 bytes usando a formatação de string substituindo '-'+`x+1`*(n-x<<1-x/9)+'-'no execloop por '-%s-'%`x+1`*(n-x<<1-x/9).
R. Kap 12/07
Não, eu precisaria de parênteses em torno do `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}

Edit 1 - Golfed 10 bytes, eliminando $xvariável e refazendo ligeiramente como a seqüência de caracteres é formulada.
Edit 2 - Golfed more 4 bytes refazendo como a entrada acontece e refazendo como $ié calculado cada loop.
Editar 3 - salvou 6 bytes pelo OP, permitindo a entrada como 0..10, portanto, não é necessário dividir por 10.

Surpreendentemente difícil!

Leva a entrada como 1, 5etc., armazenada em $n. Define a $ivariável auxiliar (um dos momentos muito raros em que uma variável precisa ser inicializada 0no PowerShell) e inicia um loop de 10para 1.

A cada iteração, definimos start nossa string com um número de espaços igual a $i, seguido por um pseudo-ternário (... , ...)[]. Dentro do pseudo-ternário, selecionamos uma sequência de caracteres -com um número de dígitos (o maior de $n-10+$_ou 0, multiplicado por 2) ou a sequência de caracteres -10- a seleção baseia-se se estamos na 10ª iteração e se nossa entrada foi 100. Concatenamos isso com uma final -. Essa sequência resultante é colocada no pipeline.

Finalmente, incrementamos $i, e isso foi realmente complicado. Acabamos usando um truque de conversão binária para int para incrementar apenas $iaté atingir $ne, depois, mantendo-o no mesmo valor. Isso garante que alcançamos o "final" da indentação do zíper no nível apropriado.

Depois que o loop termina, as seqüências resultantes são todas acumuladas no pipeline e a saída é implícita.

Exemplos

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-
AdmBorkBork
fonte
3

Pitão, 37 34 bytes

= h / QTjm + *; thS, dQj <* `d20eS, 0a-Qd" - "ST
= h / QTjm + *; thS, dQj * `d / a-Qdl`d" - "ST

Suíte de teste.

Freira Furada
fonte
3

Python, 95 84 bytes

Eu não sabia que as lambdas eram legais, graças a @Dr Green Eggs e Iron Man

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))
maniexx
fonte
11
Ei, ótima primeira resposta! Você pode movê-lo para fora de uma lista de compreensão para economizar 2 bytes, joinpode usar um gerador diretamente.
Morgan Thrapp
2
Você pode fazer uma lambda em vez de imprimir. Com a sugestão 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
2

MATL , 48 41 35 bytes

0:9"@GhX<Z"45h@QVG@-E@8>-OhX>Y"h45h

Experimente online!

Luis Mendo
fonte
1

Ruby, 74 bytes

Usa o formato de zero implícito especificado na pergunta, assim 40%como f[4]se a função anônima estiver atribuída f. Se for necessária uma porcentagem completa, +6 bytes paran/=10;

Experimente online!

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

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

Pega o número já dividido por 10. Eu provavelmente posso remover algumas das parênteses, mas isso é bastante fechado para jogar golfe.

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

Haskell, 83 bytes

f n=unlines[[[1..y]>>" ",take(2*(n-y))$cycle$show$y+1]>>=(++"-")|y<-min n<$>[0..9]]
Lynn
fonte
O que é ++"-"?
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`
`

ligue com

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)
Charlie Wynn
fonte
The program/function ...- não snippet
Titus
11
Se você substituir \npor uma nova linha real, poderá salvar um byte.
Mama Fun Roll
11
@Titus Do que você está falando? Este "trecho" é uma função.
NiCk Newman
11
Ah, certo. ES7, eu esqueci.
Titus
@MamaFunRoll Eu tinha isso, mas não conseguia "" entender e fazer o .length, então não estava 100% confiante de que estava claro - vou adicioná-lo :) #
Charlie Wynn
1

Python 2.7, 113 108 77 bytes

n = entrada ()
para x no intervalo (0,10):
v = str (x + 1) * (nx) 2
se x
n> 89: v = '10 '
impressão' '* min (x, n) + '-' + v + '-'

Primeira vez jogando golfe. Continuando, tente obter <100.
Assume que a entrada é 1-10.

Edit: Usamos alguns truques da resposta de @LeakyNun (obrigado), depois analisamos um pouco mais e obtivemos ... basicamente a mesma resposta: / Não sabia sobre a conversão de string `int` e 2 - booleano, deixe-me me livre da instrução if, que me permite me livrar de toda a variável v. Muito legal.

Minha versão:

n=input()
for x in range(10):print' '*min(x,n)+'-'+`x+1`*(n-x)*(2-(x>8))+'-'
greyShift
fonte
Boa resposta e bem-vindo ao site! Você poderia tirar 9 bytes, alterando o nível de recuo de 1 espaço, em vez de 4.
DJMcMayhem
Na verdade, você poderia tornar isso ainda mais curto com esta: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, 81 bytes

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

Ideone it!

Freira Furada
fonte
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

Um programa completo que recebe a entrada de um número inteiro no intervalo inclusivo [1,10], onde 10significa 100%e 1significa 10%. Provavelmente pode ser jogado um pouco mais.

Experimente Online! (Ideona)

R. Kap
fonte
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 com register_globals=1e short_open_tags=1(eerror_reporting=0 )
    chame em CLI comphp-cgi -f <filename> n=<number>
  • número de 0 a 10

  • chamar o navegador da web com <scriptpath>?n=<number> : prepend<pre>
  • para 4.0.1 <PHP <5.3: substituir ?: por ?1:(+1)
  • para PHP> = 5.4: substitua o primeiro $npor($n=$_GET[n]) (+11)

ungolfed como uma função (qualquer 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;
}

suíte de teste

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>';

Agora isso é novo para mim: o PHP supera o JavaScript.
Essa abordagem é minuciosa, eu acho.

Titus
fonte
STR_PAD_BOTHO que é isso, K&R C? #defineTambém fazemos coisas em PHP? :-)
cat
@cat: sim, existem definições reais em PHP. mas apenas estático; não como em C.
Titus
0

Julia, 73 bytes

x->join([" "^min(x,a)*"-$("$(a+1)"^(x>a?a>8?1:2(x-a):0))-"for a=0:9],'
')

Primeira resposta de Julia! Dicas são apreciadas.

Experimente online!

Mama Fun Roll
fonte
oh certo lol: P
Mama Fun Roll
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}
someonewithpc
fonte
0

Lisp comum (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"--~%")))))))

sem ouro:

    (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
sadfaf
fonte
0

APL, 46 bytes

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

O argumento deve ser dado como a porcentagem dividida por 10 (ou seja, um número inteiro simples, no intervalo [0,10]).

lstefano
fonte