Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
1.1k kez görüntülendi

Soru: $0<n<10$ bir rakam olmak üzere $n$ girdisi için palindromik sayılardan oluşan

$1$

$121$

$12321$

$\vdots$

$12\dots (n-1) n (n-1) \dots 2 1$

çıktısını oluşturacak programı yazınız.

Açıklama: İlk satıra n = int(input) yazarak başlayabilirsiniz. Ayrıca bir örnek verecek olarak, $n=4$ tam sayı girdisi için çıktı şu şekilde olmalıdır:

1
121
12321
1234321

 

Veri Bilimi kategorisinde (2.6k puan) tarafından  | 1.1k kez görüntülendi

3 Cevaplar

1 beğenilme 0 beğenilmeme
En İyi Cevap
def hesapla(n):
     a = [[i for i in range(1,k)] for k in range(2,n+2)]
     b = [x[:-1] + x[::-1] for x in a]
     return "\n".join("".join(str(i) for i in sira) for sira in b)

print(hesapla(6))

 

Duzenleme sonrasi : Asagidaki cozum python 3.9.4 de calisiyor. @lokman,gokce nin uyarisi uzerine farkettik.

 

Soyle bir cozumum var

def hesapla(n):
     a = [[i for i in range(1,k)] for k in range(2,n+2)]
     b = [(y:=x + x[::-1],y.pop(len(x)))[0] for x in a]
     return "\n".join("".join(str(i) for i in sira) for sira in b)

print(hesapla(6)) 

######SONUC
#1
#121
#12321
#1234321
#123454321
#12345654321

Burada x[::-1] , y:=x  ve .pop ifadelerini kullandik.

x[::-1] bir listenin tersini geri dondurur (pythonda negatif indexlerin kullanilabilmesi ve indeks olarak aralik verilebildigini unutmayalim)

y:=x sayesinde bir expressionda (mesela tuple), y yi tanimlayip daha sonra ayni expresson icinde kendisine referans gosterebiliyorum. Bu operatorun adi walrus operatoru

list.pop methodu ise bir listenin verilen indeksini siliyor

muhtemelen listeleri birlestirmek icin + yerine list.extend methodunun kullanilmasi gerekir

(1.6k puan) tarafından 
tarafından seçilmiş

Google Colab'da (şu anki sürüm Python 3.9) çalıştırdığımda b'nin tanımlanması ile ilgili SyntaxError: invalid syntax şeklinde hata veriyor. Kodu gözden geçilebilir miyiz

evet colab de calismadi. Benim bilgisayarimda python 3.9.4 icin calisiyor kod. eski python da calisan versiyonunu ekleyecegim simdi. Tesekurler
1 beğenilme 0 beğenilmeme

2. Çözüm: Pür matematik kullanarak

for i in range(1,int(input())+1):
    print(int((10**i-1)/9)**2)

yazmak yeterlidir. Matematiksel açıklaması şu şekildedir:

$1^2= 1$

$11^2 =121$

$111^2 = 12321$

$\vdots$

$111111111^2 = 12345678987654321$ olduğundan $n$ tane $1$ rakamından oluşan sayıya $S_n = 11\cdots 1$ diyelim. Sonlu geometrik toplam ile

$$S_n = 1 + 10 + 10^2 + \cdots + 10^{n-1} = \dfrac{10^n - 1}{9}$$

olduğundan istenen değer $$ S_n^2 = \left( \dfrac{10^n - 1}{9} \right)^2 $$

olur.

(2.6k puan) tarafından 
tarafından düzenlendi
bence en guzel cozum bu
Başka çözümler verildiğinde, kendi çözümümü en iyi olarak seçmek istemiyorum :) Elinize emeğinize sağlık
0 beğenilme 0 beğenilmeme

3. Çözüm: Listeleri birleştirme (uç uca ekleme) yapalım:

for i in range(1, int(input())+1):
    print(*(list(range(1, i)) + list(range(i, 0, -1))), sep="")

Burada * (asteriks) sembolünün görevi, listelerin birleşiminden köşeli parantezi kaldırıyor. sep = "" kodu ise listenin terimleri arasındaki boşlukları kaldırıyor.

Örneğin girdi olarak $3$ yazılınca $i\in [1,4)$ aralığındaki tam sayılarda değer alarak for döngüsü çalışmaya başlıyor.

$i=1$ için ilk liste $1$ verir, ikinci liste birşey vermez. Birleşimleri $1$ olur.

 $i=2$ için ilk liste $12$ verir, ikinci liste $1$ verir. Birleşimleri $121$ olur.

 $i=3$ için ilk liste $123$ verir, ikinci liste $21$ verir. Birleşimleri $12321$ olur.

(2.6k puan) tarafından 
20,281 soru
21,818 cevap
73,492 yorum
2,495,632 kullanıcı