6
votes

Créer un modèle Hour Glass sur Java ou Python en utilisant Simple Code?

Alors je veux savoir, y a-t-il un code simple pour créer un motif Hour Glass avec une entrée impaire ou paire en utilisant Java ou Python? Parce que mon code n'est pas simple (j'utilise Python).

Voici l'exemple de sortie:

Sortie attendue

Et puis, voici mon code:

 Input : 6
 @@@@@@
  @@@@
   @@
  @@@@
 @@@@@@

 Input : 7
 @@@@@@@
  @@@@@
   @@@
    @
   @@@
  @@@@@
 @@@@@@@

Et voici le résultat de mon code:

def evenGlassHour(target):
 jsp=1
 jtop=target
 jbot=2
 jbotspace=int(target/2)
 eventarget=int(target/2)
 temp=""
 for i in range(eventarget):
     for j in range(i):
         temp+=" "
     for jsp in range(jtop):
         temp+="@"
     jtop-=2
     temp+="\n"
 for i in range(eventarget-1):
     for j in range(jbotspace-2):
         temp+=" "
     for j in range(jbot+2):
         temp+="@"
     jbot+=2
     jbotspace-=1
     temp+="\n"

 print(temp)

def oddGlassHour(target):
 jsp=1
 jtop=target
 jbot=1
 jbotspace=int(target/2)
 oddtarget=int(target/2)
 temp=""
 for i in range(oddtarget):
     for j in range(i):
         temp+=" "
     for jsp in range(jtop):
         temp+="@"
     jtop-=2
     temp+="\n"
 for i in range(oddtarget+1):
     for j in range(jbotspace):
         temp+=" "
     for j in range(jbot):
         temp+="@"
     jbot+=2
     jbotspace-=1
     temp+="\n"

 print(temp)

target=int(input("Input : "))

if(target%2==0):
 evenGlassHour(target)
else:
 oddGlassHour(target)


4 commentaires

Veuillez publier le code et les résultats directement au lieu de captures d'écran.


d'accord, attendez, je vais le modifier


N'oubliez pas que votre question nécessite le code inclus dans la question elle-même si vous la déplacez vers Révision du code . De plus, ce que votre programme est censé faire n'est pas évident, il vaut donc mieux ajouter un exemple.


Merci beaucoup pour l'information


4 Réponses :


0
votes

En Python, vous pouvez profiter du fait que vous pouvez multiplier une chaîne par x et obtenir la chaîne concaténée avec elle-même x fois, comme:

from itertools import chain
def glassHour(t, s = "@"):
    for i in chain(range(t, 1, -2), range((4 if t % 2 == 0 else 1), t+1, 2)): 
        print((" " * (int((t - i) / 2)*len(s)) + s * i + " " * (int((t - i) / 2)*len(s))))

target=int(input("Input : "))
glassHour(target, "$$")

De plus, vous pouvez utiliser la même fonction pour le haut et le bas du sablier, en utilisant des valeurs différentes pour range:

def evenGlassHour(target, symbol = "@"):
    for i in chain(range(target, 1, -2), range(4, target+1, 2)):
        pad = int((target - i) / 2) * len(symbol)
        print((" " * pad) + symbol * i + " " * pad)

EDIT: Vous pouvez même supprimer l'appel récursif, et il suffit de chaîner les deux plages ensemble, rendant la fonction encore plus petite:

from itertools import chain

def evenGlassHour(target):
    for i in chain(range(target, 1, -2), range(4, target+1, 2)):
        pad = int((target - i) / 2)
        print((" " * pad) + "@" * i + " " * pad)

Enfin, vous pouvez faire en sorte que les fonctions acceptent le symbole souhaité à imprimer (de n'importe quelle longueur), comme ceci:

def evenGlassHour(target, direction = 1):
    for i in range(target, 1, -2) if direction == 1 else range(4, target+1, 2):
        pad = int((target - i) / 2)
        print((" " * pad) + "@" * i + " " * pad)
    if direction == 1:
        evenGlassHour(target, -1)

def oddGlassHour(target, direction = 1):
    for i in range(target, 1, -2) if direction == 1 else range(1, target+1, 2):
        pad = int((target - i) / 2)
        print((" " * pad) + "@" * i + " " * pad)
    if direction == 1:
        oddGlassHour(target, -1)

target=int(input("Input : "))

if target % 2 == 0:
    evenGlassHour(target)
else:
    oddGlassHour(target)

Vous pouvez également combiner les deux fonctions, pour le rendre encore plus ridicule:

"test" * 3 # becomes testtesttest


0 commentaires

1
votes

En java, vous pouvez écrire quelque chose comme ci-dessous:

public static void printPattern(int size) {
    int n = size; 
    boolean upper = true;
    for(int i = 0; size%2 == 0? i< size-1 : i<size; i++){            
        String str = String.join("", Collections.nCopies(n, "@"));
        String pad = String.join("", Collections.nCopies((size-n)/2 , " "));
        System.out.println(pad+str+pad);
        if(n-2>0 && upper){
            n-=2;
        }
        else {
            n+=2;
            upper = false;
        }           
    }
}


0 commentaires

1
votes

Vous pouvez utiliser le formatage de chaîne avec str.zfill et la récursivité:

000
 0 
000
--------------------
0000
 00 
0000
--------------------
00000
 000 
  0  
 000 
00000
--------------------
000000
 0000 
  00  
 0000 
000000
--------------------
0000000
 00000 
  000  
   0   
  000  
 00000 
0000000
--------------------

for i in range(3, 8):
  print_glasses(i)
  print('-'*20)

Sortie:

def _glass(_input, _original, flag=True):
  if _input in {1, 2}:
    return ('00' if _input == 2 else '0').center(_original) if flag else ''
  if flag:
    return ('0'*(_input)).center(_original)+'\n'+_glass(_input-2, _original, flag=flag)
  return _glass(_input-2, _original, flag=flag)+'\n'+('0'*(_input)).center(_original)

def print_glasses(_input):
  print(_glass(_input, _input)+_glass(_input, _input, False))


0 commentaires

1
votes

Utilisez la mise en forme de chaîne de justification centrale

inspiration: https://stackoverflow.com/a/44781576 p >

size:3:

***
 *
***

size:5:

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

size:12:

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

sorties:

def render(size):
    char = "*"
    #build a center-justified format mask
    mask = '{:^%ds}' % (size)

    print("size:%s:\n" % (size))

    #count down your shrinking
    for i in range(size, 0, -2):
        print(mask.format(char * i))

    #trickier:  you've already printed the narrowest
    #and your next line is different depending on odd/even input 
    if size % 2:
        start = 3
    else:
        start = 4

    for i in range(start, size+1, 2):
        print(mask.format(char * i))
    print()


render(3)
render(5)
render(12)

0 commentaires