Flèches d'impression simples

23

Pour la pratique du golf, j'ai fait les devoirs dans le cours d'introduction à Python de ma petite amie. J'ai trouvé que pour cette mission, il y avait plusieurs stratégies qui se sont rapprochées du nombre de personnages, et je suis sûr que les gens ici peuvent trouver des moyens encore meilleurs. Bien que je sois plus intéressé par les moyens de le faire en Python, je voudrais savoir le plus de golf que ce programme peut obtenir, c'est donc le golf de code et les réponses les plus courtes.

Les règles:

La mission est décrite ci-dessous. L'utilisateur doit être invité à entrer deux fois, bien que les invites n'aient rien à dire et puissent être dans un ordre différent.

Des échappatoires standard s'appliquent.


Affectation 3: flèches

Écrivez un programme qui invite l'utilisateur à entrer un certain nombre de colonnes et imprime le modèle comme indiqué ci-dessous. Vous pouvez supposer que l'utilisateur fournira des nombres positifs. Votre programme doit gérer les flèches gauche et droite. Voici quelques exemples d'exécutions:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *
aks.
la source
23
Cela ressemble à homewo ... oh, peu importe.
TessellatingHeckler
Les espaces de fin sur chaque ligne sont-ils autorisés?
lirtosiast
@ThomasKwa oui.
aks.
Pouvons-nous utiliser des caractères de contrôle pour déplacer le curseur, comme dans cette question ?
lirtosiast
@ThomasKwa Bien sûr ... même si je ne suis honnêtement pas sûr de ce que cela signifie et je suis intéressé à le voir en action.
aks.

Réponses:

8

Pyth, 23 octets

Peut être valide ou non, selon la réponse à ce commentaire . Quoi qu'il en soit, j'ai trouvé cela soigné et, s'il n'est pas valide, les autres réponses Pyth sont également invalides. ;) Eh bien, c'est valable , car j'ai apparemment manqué l'évidence flagrante. : /

EDIT: J'AI GAGNÉ !!!! OUI !!!! Première fois! :RÉ

j+_J_Wqz\r.e+*dkb*\*QtJ

Démo en direct.

kirbyfan64sos
la source
1
m+*\ d\*Qau lieu de cette chose énumérée. Enregistre 2 octets.
Jakube du
7

Pyth, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

Essayez-le en ligne

L'idée de base ici est de construire une chaîne qui, par exemple 5, ressemble à ceci:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

Et puis retournez-le à l'envers si nous obtenons lcomme entrée. Ensuite, nous prenons toutes les input-1lignes de cette chaîne, sauf les dernières , et nous l'imprimons.

FryAmTheEggman
la source
7

Python 2, 81 79 octets

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Peut-être encore jouable au golf, mais nous verrons :)

Sp3000
la source
2
Belle idée d'avoir des entrées variables let r. Je n'avais pas réalisé que l'entrée est evaldans le même environnement que le code.
xnor
4

Pyth, 30 28 27 octets

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

Essayez-le en ligne.

Apparemment, je suis actuellement à égalité avec FryAmTheEggman avec une approche complètement différente. (Je pense que l'on est ingénieux.)

Exemple

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

Explication

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print
PurkkaKoodari
la source
@ Pietu1998 Je suis toujours intéressé par une description de base de ce que vous faites. Je vois que vous n'avez qu'une boucle et aucune carte ou lambda ...
aks.
@aks. J'ai ajouté une explication.
PurkkaKoodari
4

PowerShell, 91 85 102 octets

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Obtient les colonnes, les stocke $c. Nous soustrayons un car chaque colonne a également un *et nous ne sommes intéressés que par le nombre d'espaces requis.
  • Si la valeur entrée était a 1, print *et exit - le reste du script ne fait aucune différence. +
  • La section suivante obtient d'abord la direction et teste si elle est -equal l, puis crée un tableau basé sur l'indexation dans un tableau de tableaux générés dynamiquement en fonction de la valeur de $c. La magie. Essentiellement, c'est le nombre d'espaces par ligne dont nous avons besoin.
  • Par exemple, pour 5 rcette collection tiendrait (0,1,2,3,4,3,2,1,0).
  • Prend le tableau et le canalise dans une %boucle Foreach-Object , où nous générons une chaîne de X espaces, puis le*

Exemple d'utilisation:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Édition - variable supprimée $een canalisant directement la collection
Édition2 - représente correctement 1 colonne, maintenant

+ S'il est toujours obligatoire de prendre une entrée pour la direction pour les flèches à 1 colonne (je soutiens que ce n'est pas le cas), nous pouvons échanger le positionnement du Read-Hostet perdre quelques octets supplémentaires en réintroduisant la $dvariable, pour 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}
AdmBorkBork
la source
Essayez de mettre 1 colonne et à gauche - vous obtenez une flèche droite à 2 colonnes. Essayez de mettre 1 colonne à droite - vous obtenez une erreur «Argument spécifié hors de la plage de valeurs valides». Je pensais que votre 85 serait possible de battre en évitant les gammes doublées. Mais je ne peux même pas m'approcher. Comptant pour une flèche d'une colonne, je suis actuellement à 112 caractères. > _ <
TessellatingHeckler
1
@TessellatingHeckler Merci - corrigé.
AdmBorkBork
1
Cela a poussé le vôtre à 102 et le mien est à 102. Je ne peux plus supporter de regarder cela plus longtemps, mais il doit y en avoir un de plus que je peux supprimer ...: D
TessellatingHeckler
4

TI-BASIC, 75 65 57 54 50 47 octets

Merci à @ThomasKwa pour le calcul correct des octets et le golf de 10 octets .

Testé sur ma TI-84 + Silver Edition.

Première soumission TI-BASIC, suggestions de golf bienvenues (je ne connais pas encore beaucoup de trucs). Si le nom joue un facteur dans la mémoire affiché, celui-ci était de 3 caractères au lieu de 1 (j'ai regardé le nombre d'octets sur ma calculatrice elle-même). Ce programme est limité par les outputrestrictions de la fonction (je pense aux flèches de longueur 4), mais je pourrais probablement passer à text, qui s'affiche graphiquement si c'est trop faible.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Notez que cela n'efface pas non plus l'écran ni ne le met en pause.

J'ai vraiment l'impression que l'équation que j'utilise peut être jouée davantage. Il est également très mal d'exclure le guillemet final.

cole
la source
@ThomasKwa Merci! Je vais le faire maintenant.
cole
2
Deuxièmement: Ansest gratuit, car vous ne l'utilisez pas pour la saisie et Output(ne le modifiez pas Ans. Utilisez-le et supprimez la variable A. Vous pouvez attribuer en utilisant -2(Str1="R; pas besoin d'un conditionnel.
lirtosiast
1
@ThomasKwa merci pour les conseils, on dirait que j'ai du chemin à faire dans TI-BASIC.
cole
3
Troisièmement: il n'est vraiment pas nécessaire de multiplier la valeur par -2. Faites juste Str1="Rpour la deuxième ligne. Cela fait la quatrième ligne Output(I,(1-2Ans)abs(I-L)+AL+1,"*, qui vous donne 4 octets de plus. Mais attendez, il y a un idiome pour (1-2Ans)—it's cos(πAns), qui enregistre un octet, plus un de plus car nous obtenons la parenthèse ouverte gratuitement!
lirtosiast
1
Devenir compétent dans le golf dans n'importe quelle langue ne nécessite que de la pratique; Vous y arriverez.
lirtosiast
2

Python 2, 89 octets

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Fonctionne presque de manière identique à ma réponse Pyth, calculant simplement le nombre correct d'espaces à la volée.

PurkkaKoodari
la source
2

PowerShell, 104 102 97 octets

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB. si vous souhaitez l'exécuter à nouveau, ouvrez un nouveau PowerShell ou rv oréinitialisez l'état de la variable.

Comparé à la lacune des autres, cela fait mal. [Fait moins mal à 97 qu'à 122]. Deux parties, ni très surprenantes; lit un certain nombre de colonnes, utilise un substitut d'opérateur ternaire tableau-index pour obtenir un décalage, et exécute une fonction d'onde à partir du décalage (et un ajustement afin qu'il ne tombe pas dessus mod 0).

(Et aïe ai-je passé des siècles sur cette fonction d'onde, incapable de repérer mon malentendu et de taper tous les parens honnêtes, ce n'est pas LISP).

TessellatingHeckler
la source
2
C'est vraiment génial.
AdmBorkBork
2

Python 2, 98 89 octets

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Un peu plus long.


Usage

$ python2 test.py
3
"l"
  *
 *
*
 *
  *
Zach Gates
la source
Également apparemment cassé. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler
Vérifiez l'utilisation. @TessellatingHeckler
Zach Gates
Ahh, intelligent. Mais vos flèches à 1 colonne ont deux têtes de flèche. (Je pense que vous pouvez jouer au golf plus loin en ne stockant pas iet den utilisant simplement range(P())et if P()=='l'...)
TessellatingHeckler
Merci pour les suggestions! J'ai également fixé les têtes de double flèche. @TessellatingHeckler
Zach Gates
Impossible de tester atm, mais vous pourriez probablement faire quelque chose comme en f=[...][::2*('r'>input())-1]fait
Sp3000
2

Perl, 85 octets

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Usage:

perl 59874.pl <<< '6
r'
Dom Hastings
la source
4
J'aime la façon dont vous nommez vos scripts, vous les reconnaîtrez plus tard ...
mbomb007
@ mbomb007 haha! Vous savez, je ne nomme pas vraiment mes scripts comme ça, mais j'ai pensé qu'il valait mieux nommer quelque chose de simple pour les instructions d'utilisation ... simplearrows2.plça ne semble pas aussi bon! : P
Dom Hastings
2

PHP, 156 octets

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Crée deux tableaux, comme ceci:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

utilise ensuite l'union de tableau $s+$tou $t+$spour les combiner et array_splicepour supprimer l'élément au milieu. Enfin sortie en utilisant<?=join()

Fabian Schmengler
la source
avec des arguments CLI au lieu de STDIN mon code serait 8 octets plus court;)
Fabian Schmengler
2

Python 2, 111 109 104 octets

Solution assez simple. Je suis sûr qu'il peut être joué plus au golf. Pour ceux qui ne savent pas, ~x+nc'est la même chose que n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

Essayez-le en ligne

Edit : Cela a été joué dans la dernière ligne:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")
mbomb007
la source
2

Matlab, 109 105 96 octets

Merci à @beaker de m'avoir sauvé 9 octets .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))
Luis Mendo
la source
Vous pouvez économiser 9 octets si vous remplacez les deux lignes en insérant les codes ascii parx=x*10+32;
bécher
@beaker Très intelligent, merci!
Luis Mendo
1

Rubis, 118 octets

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - deux fois, bien sûr ...

l,d=gets.split; - obtenir l'entrée

l=l.to_i; - changer la longueur en un entier

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - créer un tableau de la plage de 0 à la longueur

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - itérer, transformer en cordes pour faire les flèches

Pas exactement le plus grand golf de tous les temps, mais bon.

Pomme De TerreOmeletteSandwich
la source
1

PowerShell, 98 94 octets

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Si je pouvais trouver un moyen de mettre le Read-Host pour la direction à l'intérieur de la boucle foreach-object, mais seulement l'inviter une fois que je serais en mesure d'économiser quelques octets.

Modifier: 94 octets. Au lieu de tester pour gauche, testez pour droite (simplifie la boucle).

98 octets d'origine:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}
Jonathan Leech-Pepin
la source
Réinitialisation de la $_variable - Hobbit astucieux. Très intelligent, et j'ai appris quelque chose aujourd'hui.
AdmBorkBork
@TimmyD Très délicat. Et puis basculez l'instruction if pour économiser encore plus.
Jonathan Leech-Pepin
0

> <> , 60 octets

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

2 octets perdus en fin de compte, comme c'est irritant!

En raison du fonctionnement de l'entrée dans> <>, il n'est pas possible d '«attendre» l'entrée - la icommande vérifie si un caractère d'entrée est disponible sur STDIN. S'il y en a un, il pousse la valeur ASCII de ce caractère et pousse -1 sinon.

Cela signifie que, pour utiliser ce programme, le nombre et la direction doivent déjà être prêts sur STDIN, par exemple 3rpour une flèche de taille 3 pointant vers la droite. Je ne sais pas si cela disqualifie cette entrée, faites-moi part de vos réflexions: o)

Je rédigerai également une description si quelqu'un en veut.

Sok
la source
Dans un sens, il attend l'entrée si vous essayez de l'exécuter dans un shell, donc je pense que ça va. Je suis plus préoccupé par le fait que cela s'attend à ce que l'entrée soit à un seul chiffre (sauf si je suis censé entrer :pour 10?)
Sp3000
Un excellent point, je n'avais pas pensé à entrer plus de 9. Retour à la planche à dessin!
Sok
1
J'ai laissé un commentaire sur la question principale pour une clarification, juste au cas où
Sp3000
0

PHP, 154 octets

Cela a l'air vraiment répétitif, mais il fait ce que l'on souhaite:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

S'exécute à partir de la ligne de commande comme:

php arrow.php 5 l
php arrow.php 5 r
insertusernamehere
la source
-1

Python, 88 octets

Édité

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
orgesleka
la source