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:
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 Réponses :
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
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;
}
}
}
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))
inspiration: https://stackoverflow.com/a/44781576 p >
size:3:
***
*
***
size:5:
*****
***
*
***
*****
size:12:
************
**********
********
******
****
**
****
******
********
**********
************
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)
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