Décompressez quelques chiffres

21

Votre tâche consiste à créer un programme ou une fonction qui génère une fermeture éclair d'une longueur de 10 lignes. Chaque ligne de la fermeture éclair est représentée par deux tirets --:

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

Le programme / fonction prendra un pourcentage (divisible par 10) en entrée, et la sortie sera la fermeture éclair "décompressée" (tirets séparés) du haut par le pourcentage, révélant le niveau le plus bas indexé 1 répété 2 fois, avec tous les niveaux précédents répétés 4, 6, 8, ... etc. fois, tout en gardant le bas de la fermeture éclair centré.

Exemples

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

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

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

L'entrée (pourcentage) peut être formatée comme vous le souhaitez (50%, 0,5, 50, 5 [zéro implicite], etc.), et elle sera toujours dans la plage de 0 à 100 et divisible par 10. L'espacement dans le les exemples doivent être conservés dans votre sortie.

atlasologue
la source
L'entrée peut-elle jamais être 0%? Sommes-nous autorisés à prendre l'entrée divisée par 10? par exemple au lieu de 50%, obtenir 5?
DJMcMayhem
1
L'entrée (pourcentage) peut être formatée comme vous le souhaitez (50%, 0,5, 50), peut-il être juste 5?
Luis Mendo
@DrGreenEggsandIronMan, l'entrée peut être 0%, et vous pouvez prendre l'entrée dans le format le plus pratique.
atlasologue
@LuisMendo, oui, je vais modifier cela dans la question, merci.
atlasologist
Un saut de ligne au lieu d'un signe de fin est-il accepté? Le rembourrage absolu est-il accepté?
Titus

Réponses:

10

Python 2 - 184 151 146 octets

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

Le dernier numéro m'a un peu dérangé. Je pourrais peut-être supprimer la deuxième instruction if si je la regarde plus tard.

EDIT: Thx à mbomb007 pour supprimer 3 octets. Merci à charredgrass pour les conseils de mise en forme pour aider à supprimer des tas d'octets! :-D Merci à TheBikingViking d'avoir aidé avec encore deux octets!

Jeremy
la source
1
Utilisez i>9au lieu de i==10et supprimez l'espace range(1, 11).
mbomb007
1
Petit conseil pour jouer au golf en python: vous réduisez beaucoup d'octets de l'espace blanc en compressant vos déclarations sur une seule ligne. Par exemple, les 3 dernières lignes peuvent devenir p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
charredgrass
Merci ! Cela aide beaucoup avec celui-ci et je garderai certainement cela à l'esprit dans le futur golf
Jeremy
1
Vous pouvez raser 2 octets en remplaçant (i-1)dans la dernière ligne par ~-i. Cela profite de la priorité de l'opérateur et du fait qu'un retournement de bit suivi d'une négation équivaut à la soustraction 1.
TheBikingViking
Quel est l'intérêt d'utiliser range(1,11)ensuite (i-1)?
Leaky Nun
10

Python 2, 74 octets

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

Enregistré deux octets en exec-ification d'une boucle, grâce à Dennis.

EDIT: J'ai adopté une approche légèrement différente et enregistré deux octets supplémentaires.

Lynn
la source
1
Vous pouvez enregistrer 2 octets en utilisant le formatage de chaîne en remplaçant '-'+`x+1`*(n-x<<1-x/9)+'-'dans la execboucle par '-%s-'%`x+1`*(n-x<<1-x/9).
R. Kap
Non, j'aurais besoin de parens autour du `x+1`*(n-x<<1-x/9).
Lynn
4

PowerShell v2 +, 130 120 116 110 octets

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 octets en éliminant les $xvariables et en refaisant légèrement la façon dont la chaîne est formulée.
Edit 2 - Golfed encore 4 octets en refaisant comment l'entrée se produit et en refaisant comment $iest calculé chaque boucle.
Edit 3 - 6 octets enregistrés par OP permettant l'entrée comme 0..10, donc pas besoin de diviser par 10.

Étonnamment difficile!

Prend entrée comme 1, 5, etc., stockés dans $n. Définit la $ivariable d' assistance (l'une des rares fois où une variable doit être initialisée 0dans PowerShell), puis démarre une boucle de 10à 1.

À chaque itération, nous définissons start notre chaîne avec un nombre d'espaces égal à $i, suivi d'un pseudo-ternaire (... , ...)[]. À l'intérieur du pseudo-ternaire, nous sélectionnons une chaîne de soit -avec un nombre de chiffres (le plus élevé de $n-10+$_ou 0, multiplié par 2), soit la chaîne -10- la sélection est basée sur le fait que nous sommes à la 10e itération et notre entrée était 100. Nous concaténons cela avec une finale -. Cette chaîne résultante est placée sur le pipeline.

Enfin, nous incrémentons $i, et c'était vraiment délicat. Nous avons fini par utiliser une astuce de conversion binaire en entier pour incrémenter uniquement $ijusqu'à ce qu'il atteigne $n, puis le maintenir à la même valeur par la suite. Cela garantit que nous avons atteint la «fin» de l'empreinte de la fermeture éclair au niveau approprié.

Une fois la boucle terminée, les chaînes résultantes sont toutes accumulées sur le pipeline et la sortie est implicite.

Exemples

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
la source
3

Pyth, 37 34 octets

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

Suite de tests.

Leaky Nun
la source
3

Python, 95 84 octets

Je ne savais pas que les lambdas étaient légaux, merci @Dr Green Eggs et Iron Man

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))
maniexx
la source
1
Hé, bonne première réponse! Vous pouvez le sortir d'une liste de compréhension pour économiser 2 octets, joinprendre directement un générateur.
Morgan Thrapp
2
Vous pouvez faire un lambda au lieu d'imprimer. Avec la suggestion de Morgan: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 octets)
DJMcMayhem
1

Rubis, 74 octets

Utilise le format implicite zéro spécifié dans la question, donc 40%est f[4]si la fonction anonyme est attribué à f. Si un pourcentage complet est nécessaire, +6 octets pourn/=10;

Essayez-le en ligne!

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

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

Prend le nombre déjà divisé par 10. Je peux probablement supprimer certaines des parens, mais c'est assez fermé pour jouer au golf.

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

Haskell, 83 octets

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

Javascript es7, 105 octets

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

appeler avec

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
la source
The program/function ...- not snippet
Titus
1
Si vous remplacez le \npar une nouvelle ligne réelle, vous pouvez enregistrer un octet.
Mama Fun Roll
1
@Titus De quoi parlez-vous? Cet "extrait" est une fonction.
NiCk Newman
1
ah oui. ES7, j'ai oublié.
Titus
@MamaFunRoll J'avais ça, mais je ne pouvais pas envelopper "" et faire .longueur donc je n'étais pas sûr à 100% que j'étais en clair - je l'ajouterai :)
Charlie Wynn
1

Python 2.7, 113 108 77 octets

n = entrée ()
pour x dans la plage (0,10):
v = str (x + 1) * (nx) 2
si x
n> 89: v = '10 '
print' '* min (x, n) + «-» + v + «-»

Jouer au golf pour la première fois. Je vais continuer, essayez d'obtenir <100.
Suppose que l'entrée est 1-10.

Edit: J'ai utilisé quelques astuces de la réponse de @LeakyNun (merci), puis je l'ai croisé un peu plus et j'ai obtenu ... essentiellement la même réponse: / Je ne connaissais pas la conversion de chaîne `int`, et 2 - booléen, laissez-moi se débarrasser de l'instruction if, ce qui m'a permis de me débarrasser de toute la variable v. Très sympa.

Ma version:

n=input()
for x in range(10):print' '*min(x,n)+'-'+`x+1`*(n-x)*(2-(x>8))+'-'
greyShift
la source
Belle réponse, et bienvenue sur le site! Vous pouvez retirer 9 octets en changeant le niveau d'indentation à 1 espace, au lieu de 4.
DJMcMayhem
En fait, vous pouvez rendre cela encore plus court avec ceci: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 octets

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

Ideone it!

Leaky Nun
la source
0

Python 2.7, 110 99 95 91 octets:

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 programme complet qui prend l'entrée par un entier dans la plage inclusive [1,10], où 10signifie 100%et 1signifie 10%. Peut probablement être joué un peu plus.

Essayez-le en ligne! (Ideone)

R. Kap
la source
0

PHP 5.3, 92 91 octets

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • pour PHP 5.3 avec register_globals=1et short_open_tags=1(et error_reporting=0)
    appelez en cli avecphp-cgi -f <filename> n=<number>
  • nombre de 0 à 10

  • appeler dans le navigateur Web avec <scriptpath>?n=<number>: pré-ajouter<pre>
  • pour 4.0.1 <PHP <5.3: remplacer ?:par ?1:(+1)
  • pour PHP> = 5.4: remplacez le premier $npar ($n=$_GET[n])(+11)

non golfé en tant que fonction (tout 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;
}

suite de tests

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

Maintenant, c'est nouveau pour moi: PHP bat JavaScript.
Cette approche est golfée au minimum, je pense.

Titus
la source
STR_PAD_BOTHQu'est-ce que c'est, K&R C? Avons-nous aussi des #definechoses en PHP? :-)
cat
@cat: yup, il existe de véritables définitions en PHP. mais seulement statique; pas comme en C.
Titus
0

Julia, 73 octets

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

Première réponse de Julia! Les pourboires sont appréciés.

Essayez-le en ligne!

Mama Fun Roll
la source
oh droite lol: P
Mama Fun Roll
0

Perl, 122 octets

$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}
quelqu'un avec pc
la source
0

Lisp commun (Lispworks), 314 octets

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

non doré:

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

Usage:

    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
la source
0

APL, 46 octets

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

L'argument doit être donné sous la forme d'un pourcentage divisé par 10 (c'est-à-dire: un entier simple, dans la plage [0,10]).

lstefano
la source