Artan / alçalan sayıların kemerini yazdır


28

Bu sayı desenini tanımlamanın en iyi yolunun "kemer" olduğunu düşündüm:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

Resmen tanımlanmış, her satır 1 - sayılardan 9-n, (n-1)*2boşluklardan ve 9-n1 - sayılardan ( ngeçerli satır nerede ) oluşur.

Göreviniz, mümkün olan en kısa kodu kullanarak, yukarıdaki deseni aşağıdaki kısıtlamalara tabi olarak basan küçük bir komut dosyası / program yazmaktır:

  1. Tüm kalıbı zorlayamayabilirsiniz. En fazla yalnızca en fazla desenin tek bir satırını kodlayabilirsiniz.
  2. Programınız her satırın sonuna yeni bir satır ( \nveya herhangi bir kombinasyonu \r) basmalıdır.

Hazır ... hazır .... git!


1
Ek küçük numara, ;-) 'e 123456787654321eşit olduğu için üst çizgide mevcut olacak11111111^2
Egor Skriptunoff

3
@EgorSkriptunoff 11111111^2 == 123465787654321 != 1234567887654321(tekrarlananlara dikkat edin 8)
Bob,


6
Bir perdeye benziyor .
Volatilite

Yanıtlar:


22

Python 2, 65 55 53 51

s=12345678
while s:r='%-8d'%s;print r+r[::-1];s/=10

Ugoren'in bazı fikirlerini kullanarak kısaltıldı .


Heh, iyileştirme için yer olduğunu biliyordum: P
Nathan Osman

2
s=s[1:]Döngü başına çok tasarruf edebilirsiniz vewhile s:
ugoren


9

APL (18)

k,⌽k←↑↑∘(1↓⎕D)¨⌽⍳8

Açıklama:

  • 1↓⎕D: rakam dizesi ("0123456789") eksi ilk elemanı
  • ↑∘(1↓⎕D)¨⌽⍳8: ilk [8..1] karakteri seç ('12345678', '1234567' ...)
  • : matris biçiminde (kullanılmayan karakterleri boşluklarla doldurma)
  • k,⌽k←: saklayın kve ekranın kdikey yansıtmasını izleyink

4

Yakut: 61 50 karakter

s="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}

Örnek çalışma:

bash-4.2$ ruby -e 's="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}'
1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

4

Befunge - 3 x 18 = 54

Baş belancıyla bir şeyler yapmam gerektiğini hissettim, en son kullandığımdan bu yana çok uzun zaman geçti. Bu problem dil için en uygun olanı.

Karakter başına yaklaşık 8 işlem yapan yazdırma döngüsünden dolayı korkunç derecede yavaştır (sayma stilleri farklıdır).

80v >#v"12345678"<
>5 *^ >,#$:_$:1-:v
^2< 0p0+7\*48\_@#<

4

JavaScript, 71

s='1234567887654321',i=10;while(--i)console.log(s=s.split(i).join(' '))

s="1234567887654321";for(i=10;--i;)console.log(s=s.split(i).join(" "))70 karakter için, @SteveWorley
WallyWest

3

C, 83 karakter

main(a,b,n){
    for(a=12345678,n=1e8,b=n-a-1;a;a/=10)
        printf("%-8d%8d\n",a,b),
        b%=n/=10;
}

3

Python 2, 75 62

Volatility'nin cevabını geçmeyecek, ancak işte python'un değişken dizgilerini ( bytearray) kullanan başka bir yaklaşım :

s=bytearray('1234567887654321')
for i in range(8):s[8-i:8+i]=i*'  ';print s

Düzenle

Kullanarak daha kısa bir sürüm buldum str.replace:

s='1234567887654321'
for c in s[8:]:print s;s=s.replace(c,' ')

3

Perl, 41

artı -Eanahtarı. Komut satırındaki toplam karakter sayısı: 50

en az perl5, sürüm 10 gerektirir.

perl -E'say@!=1..8-$_,$"x(2*$_),reverse@!for-0..7'

Standart bakışı -Eprograma bir baytlık bir ek olduğu için bu 42 olduğunu söyleyebilirim .
Timtech

3

Mathematica 92 85 67 54 51

Yöntem # 1 : (54 karakter) Satır #, col # ve sol-sağ kenardan olan mesafeyi kullanarak dizi yapar.

Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]

Yöntem # 2 : (67 karakter) Ped sürekli kısaltma aralıkları.

Print@@@Table[Join[k = PadRight[Range@i, 8, " "], Reverse@k], {i, 8, 1, -1}];

Yöntem 3 : (85 karakter) Bir dizinin her satırını seçmeli olarak doldurun.

8 boşluk karakter listesinden başlayın. 1 ve 16 pozisyonlarını "1" ile değiştirin; "2" yerine 2 ve 15 pozisyonlarında, vs.

p = 0; q = 16;
Print @@@Reverse@Rest@NestList[ReplacePart[#, {++p -> p, q-- -> p}]&,Array[" "&,q], 8];

Yöntem # 4 : (86 karakter) Bir dizinin her satırını seçmeli olarak boşaltın.

p=8;q=9;
Print@@@NestList[ReplacePart[#,{p---> " ",q++-> " "}]&,Join[k=Range@8,Reverse@k],7];

Yöntem 5 : Dizeleri kullanma (92 karakter)

p=8;s="12345678";
Print[#,StringReverse@#]&/@NestList[StringReplace[#,ToString@p-- ->  " "]&,s,7];

Bu yeni olan kaygan! Yapabilseydim tekrar + 1'irdim. :-) Btw, bırakın ()ve değiştirmek #1ile #:Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]
Mr.Wizard

İpuçları için teşekkürler. Evet, Arraybazen yineleyiciler eklemek zorunda kalmadan güzel masalar oluşturabilirsiniz.
DavidC

3

PHP, 68

(HamZa'nın cevabından ilham aldı)

for($n=8;$n;$r[]=$n--)echo str_replace($r," ","1234567887654321\n");

PHP'nin str_replace işlevinin arama için bir dizi ve değiştirilecek bir dize kabul edebileceği gerçeğini oynar, dizideki her öğeyi verilen dizeyle değiştirir. Her yinelemeden sonra, geçerli sayı bir sonraki döngüden çıkarılarak arama dizisine eklenir.

İşlemdeki kod örneği: http://ideone.com/9wVr0X


güzel hehe +1
HamZa

Yine de ortada doğru sayıda boşluk bırakmıyor gibi görünüyor
nathan hayfield

@nathanhayfield: Nasıl yani? İlk satırda 0 boşluk var, ikincisi 2, sonra 4, 6, 8, vb.
Bay Llama

i ile idare değilken writecodeonline.com/php
Nathan HayField

Çünkü çıktı <pre>etiketlere sarılmamış . Html metni olarak yorumlandığında, boşluklar daraltılır ve yeni satırlar yoksayılır, ancak kaynağı kontrol ederseniz aksi halde görürsünüz.
Bay Llama,

3

Mermer 165

@0
08
>0
LN
--
@0
:LN
}0}0}0}0
..SAPSSD0A
{0
:PS
}0
~~09
..//
<<@0
\\>0
&0//
--@1
@020
&0/\&0
@1
:SA
@0
}0
>0!!
--00@1
@0++//
+O/\@1
+O
:SD
}0@0
\\>0\/
--/\+O
@0..+O

pseudocode:

MB():
    for x in 8..1:
        LN(x)
LN(x):
    SA(x)
    PS(x)
    SD(x)
    print "\n"
PS(x):
    print " "*(8-x)*2
SA(x):
    for n in 1..x:
        print n
SD(x):
    for n in x..1:
        print n

2

Python 2.x - 73 65 63 61 karakter

c=1;s='87654321'
while c<9:print s[::-1]+s;s=' '*c+s[c:];c+=1

2

PHP, 76

for($i=9;$i>1;){$r[]=$i--;echo str_replace($r,' ','1234567887654321')."\r";}

2

K, 28

-1_a,'|:'a:8$'{-1_x}\,/$1+!8

.

k)-1_a,'|:'a:8$'{-1_x}\,/$1+!8
"1234567887654321"
"1234567  7654321"
"123456    654321"
"12345      54321"
"1234        4321"
"123          321"
"12            21"
"1              1"

36 için genelleştirebilirsin: {-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x}

k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 5
"1234554321"
"1234  4321"
"123    321"
"12      21"
"1        1"
q)k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 15
"123456789101112131415514131211101987654321"
"12345678910111213141  14131211101987654321"
"1234567891011121314    4131211101987654321"
"123456789101112131      131211101987654321"
"12345678910111213        31211101987654321"
"1234567891011121          1211101987654321"
"123456789101112            211101987654321"
"12345678910111              11101987654321"
"1234567891011                1101987654321"
"123456789101                  101987654321"
"12345678910                    01987654321"
"1234567891                      1987654321"
"123456789                        987654321"
"12345678                          87654321"
"1234567                            7654321"
"123456                              654321"
"12345                                54321"
"1234                                  4321"
"123                                    321"
"12                                      21"
"1                                        1"

2

Javascript, 67 karakter

Steveworley'nin cevabından ilham aldı (yapabilseydim yorum yapardım):

Kod pasajı

a='1234567887654321\n',b='',c=10;while(--c)b+=a=a.split(c).join(' ')
<a href="#" onclick="javascript:document.getElementById('output').innerHTML = b;">Display</a>
<pre id="output">...</pre>

Son satırın varlığı kurallara uyuyor.

güncelleme: parantezleri kaldırarak 2 karakter kesin (operatör önceliği) ve gereksiz bir alanı kaldırarak 1

Beni trolling gibi görünüyordu, çünkü bir kod parçasını kodunu çözerek kaç tane kısaltmaya veya basitleştirmeye çalıştığım farketmeksizin, aşağıda yazılı "Ben sayımı düşünüyorum" kuralının uygulanmasına izin verene kadar uzunluk aynı kaldı.

(Yazdırma, krom konsolda yürütüldüğünde geri döndüğü gibi sayılıyorsa)


Diğer cevaba benzemiyor, sayılar sağ sütunda değil.
AL

@AL Üstelik ünsüzün btw çıkışından çıkan çıktıyı okursanız, uyarı gerekli değildir.
Sophiα2329

Sağ sütunu hizalamak için, join'in string argümanında 2 yerine 1 boşluk olmalıdır. 2 boşlukla, krom tabanlı tarayıcı uyarısında doğru şekilde hizalanır.
Qwertiy

Sonucunu JS uyarısı olmayan bir snippet'te görüntülemek için gönderinizi güncelledim (düzenleme kabul edilmeli), bu durumda yalnızca bir boşluk gerekir.
AL,

2

Brainfuck: 542 Bayt

-[----->+<]>--.+.+.+.+.+.+.+..-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.+.+[-->+<]>++++..----[->++<]>-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.[-->+<]>+++++....-----[->++<]>.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.--[--->++<]>--......-----[->++<]>-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.-[--->++<]>--........++[-->+++<]>+.-.-.-.>++++++++++.[->+++++
<]>-.+.+.[--->++<]>--..........++[-->+++<]>.-.-.>++++++++++.[->+++++
<]>-.+.--[--->++<]>............[-->+++<]>++.-.>++++++++++.[->+++++
<]>-.-[--->++<]>..............[-->+++<]>+.

1

Mathematica , 59

61 kendi fikirlerimi kullanarak:

Grid[Clip[#~Join~Reverse@#&@Range@8,{1,9-#},{," "}]&~Array~8]

Veya 59'un David'in cevabını ödünç alması:

Grid@Array[Join[k=PadRight[Range[9-#],8," "],Reverse@k]&,8]

Girişinizden ilham alan Grid'i kullanarak 4 karakter kurtardım.
DavidC,

1

R: 52

for(i in 8:1)cat(1:i,rep(" ",16-2*i),i:1,"\n",sep="")

1

Haskell, 84

Birinin gelişmesi için bir başlangıç ​​noktası:

mapM_ putStrLn[let l=take(8-i)"12345678"++replicate i ' 'in l++reverse l|i<-[0..7]]

Muhtemelen bir kısmı, l++reverse lnoktayı serbest bırakmak, letifadeden kurtulmamıza izin vermek olacaktır, ama bulabilirim apki bu, ithalat gerektirir.


1

PostScript: 105 karakter

Dize kullanımı PS'de kolay değildir, ancak nispeten basit kodlar yapabilir:

0 1 7{(1234567887654321)dup
8 3 index sub(              )0 6 -1 roll 2 mul getinterval putinterval =}for

120 karakterde biraz daha uzun bir sürüm ancak ikinci satırın başlangıcındaki 8'in 1 ila 9 aralığındaki herhangi bir sayı ile değiştirilmesiyle farklı sayı yayları üretebilir:

/D{dup}def/R{repeat}def/P{=print}def
8 D -1 1{1 1 index{D P 1 add}R pop 2 copy sub{(  )P}R D{D P 1 sub}R pop()=}for pop

Orada PostScript'i seven sadece ben değildim.
AJMansfield

1

GoRuby 2.1

36 karakter

8.w(1){|x|a=[*1..x].j.lj 8;s a+a.rv}

Ungolfed

8.downto(1) do |x|
  a = [*1..x].join.ljust(8)
  puts a + a.reverse
end

1

K 20

{x,'|:'x:|x$,\$1+!x}    

q)k){x,'|:'x:|x$,\$1+!x}8    
"1234567887654321"    
"1234567  7654321"    
"123456    654321"    
"12345      54321"    
"1234        4321"      
"123          321"    
"12            21"    
"1              1"    

1

TSQL, 148

Düzenleme: manatwork'ün önerisiyle 148'e düştü ve SİPARİŞ BY seçeneğine ince ayar yapın.

Okunabilir:

WITH t AS(
    SELECT 1n, CAST(1 AS VARCHAR(MAX)) o
 UNION ALL
    SELECT n+1,o+CHAR(n+49)
    FROM t
    WHERE n<8
)
SELECT o  + SPACE(16-2*n) + REVERSE(o)
FROM t
ORDER BY 1 DESC

golfed:

WITH t AS(SELECT 1n,CAST(1AS VARCHAR(MAX))o UNION ALL SELECT 1+n,o+CHAR(n+49)FROM t WHERE n<8)SELECT o+SPACE(16-2*n)+REVERSE(o)FROM t ORDER BY 1DESC

Çıktı:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

1
Güzel bir. Ancak, lütfen 153 karakter saydığınız biçimde de gönderebilir misiniz? Neyse, hemen içine 1girdiğiniz dize yerine nümerik kullanarak 2 karakter ayırabilirsiniz . Bu bana 149 karakter verir: . '1'castvarcharwith t as(select 1n,cast(1as varchar(max))o union all select n+1,o+char(n+49)from t where n<8)select o+space(16-2*n)+reverse(o)from t order by o desc
Manatwork

@ yönetimsel: 153 sayısını yeniden oluşturamadım, çünkü daha düşük olmaya devam ediyordum. Yine de önerinizi yaptınız. Teşekkürler!
comfortablydrei

1

Haskell, 79

r n x|x>n=' '|True=x
t="87654321"
main=mapM(putStrLn.(`map`("12345678"++t)).r)t

Bu ' ', n karakterlerinin "87654321" den kaynaklandığı (n'nin yerine geçecek olan dizenin kuyruğu olur) karakterlerini değiştirerek çalışır .


1

PHP: 61 karakter (veya \ n'yi gerçek bir ASCII newline ile değiştirirseniz 60 karakter)

(GigaWatt ve HamZa'nın cevabından ilham alındı)

for($n=9;$n;$r[$n--]=" ")echo strtr("1234567887654321\n",$r);

http://ideone.com/FV1NXu


1

PowerShell: 38

Golf kodu

8..1|%{-join(1..$_+"  "*(8-$_)+$_..1)}

Bakış

8..1|%{...} 8'den 1'e kadar olan boru tamsayılarını ForEach-Object döngüsüne dönüştürün.
-join(... )iç içe geçmiş kodun çıktısını sınırlayıcı olmadan tek bir dizgiye ekler.
1..$_Döngüdeki 1'den geçerli tam sayıya kadar yükselen tam sayıları çıkarır.
+" "*(8-$_)çıktıya 8 ile geçerli tam sayı arasındaki farkla çarpılan bir çift boşluk ekler.
+$_..1Geçerli tamsayıdan 1'e inerek çıkışa tamsayılar ekler.


1

Lambdas ile Javascript, 147

(s="12345678")[r="replace"](/./g,i=>s[r](RegExp(".{"+(i-1)+"}$"),Array(i*2-1).join(" ")))[r](/\d{1,8} */g,m=>m+(Array(m%10+1).join(m%10+1)-m)+"\n")

Firefox'ta kontrol edilebilir.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.