Magical 8 Trapezyum Çıktısı


41

Görevin Magical 8 Trapezyum üretmek:

        1 × 8 + 1 = 9
       12 × 8 + 2 = 98
      123 × 8 + 3 = 987
     1234 × 8 + 4 = 9876
    12345 × 8 + 5 = 98765
   123456 × 8 + 6 = 987654
  1234567 × 8 + 7 = 9876543
 12345678 × 8 + 8 = 98765432
123456789 × 8 + 9 = 987654321
  • Seçtiğiniz dilde mümkün olan en az bayt cinsinden çıktı alın.
  • Yamuk şeklini korumak için her çizginin başlangıcındaki boşluk sayısını not edin.
  • Sondaki boşluklara izin verilir.
  • ×Hangisini tercih ederseniz kullanın - veya x harfini kullanabilirsiniz .

1
İlgili. (biraz ...)
Martin Ender

Orta boşluklar gerekli, evet?
Value Ink,

@ KevinLau-notKenny öyle, ancak önemliyse her zaman bir alternatif gönderebilirsin.
rybo111

Ortadaki 6 boşluğa karşılık gelen 6 bayt, yani hayır, bunun yeterince önemli olduğunu sanmıyorum.
Value Ink,

Yanıtlar:


15

Python 2, 59 bayt

a=i=1
exec"print'%9d x 8 +'%a,i,'=',a*8+i;i+=1;a=a*10+i;"*9

Sayılar ave idenklem a * 8 + iaritmetik olarak üretilir. Her satır iartar ve bir asonraki basamağa eklenir a=a*10+i. Örneğin, eğer a=12345, i=5o zaman, iolur 6, yeni böylece aDİR 12345*10 + 6olduğunu 123456.

Bunları dizge yerine sayı olarak saklamak, RHS'yi denklemin verdiği gibi a*8+i, dizge ters çevrilmesinden daha kısa olan şekilde hesaplamamızı sağlar .


Bunun ne olduğunu görmek için +1 - üretilebilecek bir miktar
rybo111

7

V , 37 bayt

i¸ 1 X 8 + 1 = 98ñYp|Eylp^Xf+$ylp

Çevrimiçi deneyin!

Bu yazdırılamaz içerir, bu yüzden burada bir hexdump:

00000000: 69c2 b820 3120 5820 3820 2b20 3120 3d20  i.. 1 X 8 + 1 = 
00000010: 391b 38c3 b159 707c 4579 6c70 015e 5866  9.8..Yp|Eylp.^Xf
00000020: 2b01 2479 6c70 18                        +.$ylp.


5

PHP, 105 89 60 57 bayt

benim ilk golf burada deneyin (manatwork ve user55641 sayesinde)

for(;$i++<9;)printf("%9s x 8 + $i = %s
",$s.=$i,$s*8+$i);

59

for(;$i++<9;)printf("%9s x 8 + $i = %s
",$s.=$i,$t.=10-$i);

89 (kendi denemem)

for(;@++$i<=9;){printf("%9s x 8 + %s = %s\n",join(range(1,$i)),$i,join(range(9,10-$i)));}

105 (ilk)

for($j='123456789';@$j[$i++];){printf("%9s x 8 + %s = %s\n",substr($j,0,$i),$i,strrev(substr($j,-$i)));}

1
Tek bir açıklama etrafında parantez gerek yok. Yalnız $ i, format belirteci olmadan doğrudan dizede enterpolasyon yapar.
Manatwork

1
Birkaç püf noktası ile 23 bayt daha bırakabilirsiniz: @ ++ $ i <= 9 ile $ i ++ <9 arasında değişiklik yapmak 2 bayt tasarrufu sağlar. İşlemleri durdurmadıkları için bildirimleri susturmanıza gerek yoktur ve standart PPCG kuralları uyarınca isterseniz stderr'i yok sayabilirsiniz. \ N'yi gerçek bir yeni satır karakteriyle değiştirmek bayttan tasarruf sağlar. Birleştirme (aralık (...)) bitlerinin $ s olarak değiştirilmesi. = $ İ ve $ t. = 10- $ i 15 bayt kazandırır. Bu işe yarıyor, çünkü ödevler verilen değeri döndürür ve golf oynamak için bulduğum en değerli numaradır. Son 5 bayt yukarıdaki
manatwork

1
Sen değiştirerek 2 daha bayt bırakın $t.=10-$iile $s*8+$i. tio.run/##K8go@G9jXwAk0/...
640KB

1
Bu 59 bayt. Ve $s*8+$ibunun yerine $t.=10-$iiki tane daha tasarruf ediyor.
Titus

5

Pyth, 32 bayt

VS9ss[*dK-9NSN" x 8 + "N" = "r9K

Çevrimiçi deneyin!

VS9ss[*dK-9NSN" x 8 + "N" = "r9K
VS9                                  # For N in 1..9
   s                                 # Join without delimiter
    s[                               # Reduce the array on + (flattens)
      *dK-9N                         # - Space, repeated K=(9-N) times
            SN                       # - The string sequence 1..N
              " x 8 + "              # - This string literal
                       N             # - N itself
                        " = "        # - This string literal
                             r9K     # - The string sequence 9..K

2 bayt tasarrufu için @FryAmTheEggman teşekkürler. 3 byte tasarruf için @KennyLau teşekkürler.


sboşlukla birleşmez - sınırlayıcı olmadan birleşir.
isaacg

@isaacg hah, ve şimdi uzaya katılarak bir bayt kurtarabileceğimi düşünüyorum.
Ven,

Bayt sayısı aynı olurdu .
Sızdıran Rahibe


4

Python 2, 87 84 78 75 bayt

s="123456789"
n=1
exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9

Çevrimiçi deneyin

Önceki bir sürüm bazı string magic kullanır.

R=range(1,10)
for n in R:print" "*(9-n)+`R`[1:n*3:3]+" x 8 + %d = "%n+`R`[-2:27-3*n:-3]

range(1,10)Bir dizgiye döküm vermek [1, 2, 3, 4, 5, 6, 7, 8, 9], her sayı sadece bir rakam olduğundan, bu çok hoş Yani bundan ipi almak 123456789çok kolaydır `range(1,10)`[1::3]. Tersine çevrilmiş aralık `range(1,10)`[-2::-3]. Daha sonra, sadece her yinelemeyi istediğim kadar almak için, ters basamak için 3*nya da 3*(9-n)( 27-3*n) de dilimleyeceğim .


for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]80 bayt için yapabilirsiniz .
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9Üç tane daha tasarruf etti! 75'e
Lynn

Güzel, yardımın için teşekkürler! Çok kötü ikinci kez çift dilimlemek zorunda kaldı ...
mbomb007

4

Perl, 49 bayt

printf"%9s x 8 + $_ = %s
",$@.=$_,$_+8*$@for 1..9

kullanım

perl -e 'printf"%9s x 8 + $_ = %s
",$@.=$_,$_+8*$@for 1..9'

4

Ruby, 77 73 65 60 bayt

Çevrimiçi deneyin ~

@Manatwork gelen büyük yenilemeler

@Xsot tarafından başka bir elden geçirme

a=i=0;9.times{puts"%9d x 8 + %d = %d"%[a=a*10+i+=1,i,a*8+i]}

Biçim dizesi ile daha kısa gibi görünüyor: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
manatwork

(1..9).map1.upto(9)
manatwork

Ah, böyle %9dbir tamsayı doldurmak için bir biçimlendirme seçeneği olduğumu bilmiyordum
Value Ink

60:a=i=0;9.times{puts"%9d x 8 + %d = %d"%[a=a*10+i+=1,i,a*8+i]}
xsot

@ xsot bu harika! İlk sayıyı bu şekilde hesaplamayı düşünmedim.
Value Ink,

4

Java 10, 151 133 130 129 126 110 bayt

v->{String p="\n",r="";for(int n=123456789,i=9;i>0;n/=10,p+=" ")r=p+n+" x 8 + "+i+" = "+(n*8+i--)+r;return r;}

Çevrimiçi deneyin.

Açıklama:

v->{                   // Method with empty unused parameter and String return-type
  String p="\n",       //  Prefix-String, starting at a newline
         r="";         //  Result-String, starting empty
  for(int n=123456789, //  Multiply-number, starting at 123456789
      i=9;i>0          //  Loop `i` in the range [9, 0):
      ;                //    After every iteration:
       n/=10,          //     Remove the last digit from the integer
       p+=" ")         //     Append a space after the prefix
    r=...+r;           //   Prepend the following to the result-String:
      p                //    The prefix-String
      +n               //    Followed by the integer
      +" x 8 + "       //    Followed by the literal String " x 8 + "
      +i               //    Followed by the loop-index `i`
      +" = "           //    Followed by the literal String " = "
      +(n*8+i--)       //    Followed by the result of that equation
  return r;}           //  Return the result-String

1
Sanırım xçarpma işareti yerine baytları kurtarabilirsin .
wizzwizz4

1
Sen başlatarak bayt bir çift kaydedebilirsiniz siçin "\n"ve kaldırma "\n"+gelen fordöngü
cliffroot

@ wizzwizz4 Teşekkürler. ×x
Bilmeliydim

Eklemekte musun syanı her tekrarında sonuca?
cliffroot

Bunun eski olduğunu biliyorum ama return obunun yerine yapamaz mısın System.out.print(o)? Ayrıca, Java 10'a geçebilir ve tasarruf edersiniz varve lambdas yapabilirsiniz
Ignorance uygulaması

3

C, 74 bayt

d(i,n){for(i=n=1;i<10;n=++i+n*10)printf("%9d x 8 + %d = %d\n",n,i,n*8+i);}

3

C #, 113 bayt

void f(){for(int n=1,i=1;i<10;n=10*n+ ++i)Console.WriteLine(new string(' ',9-i)+n+" x "+"8 + "+i+" = "+(n*8+i));}

Bu çözümü geliştirmek için yine de paylaşmaktan çekinmeyin.


Boşluk kaldırarak 1 bayt tasarruf edebilirsiniz: ;n=10*n+ ++ifor-loop'ta değiştirilebilir ;n=++i+10*n. Ayrıca, +" x "+"8 + "+değiştirilebilir +" x 8 + "+. 3 bayt daha kaydetmek için
Kevin Cruijssen

void f () {(int n = 1, i = 1; i <10; n = ++ i + 10 * n) için Console.WriteLine ($ "{new string ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ size bir bayt kaydetti!
downrep_nation

3

Toplu, 117 bayt

@echo off
set a=         12345678987654321
for /l %%i in (1,1,9)do call echo %%a:~%%i,9%% x 8 + %%i = %%a:~17,%%i%%

Evet, bu bir satırda% 16 işaretidir; Bu sizin için Batch!


2

Haskell, 92 bayt

s=(show=<<)
[1..9]>>= \x->([x..8]>>" ")++s[1..x]++" x 8 + "++s[x]++" = "++s[9,8..10-x]++"\n"

Nasıl çalışır:

s=(show=<<)                   -- helper function that turns a list of numbers into
                              -- a string without delimiters, e.g. [1,2] -> "12"

[1..9]>>=                     -- for each number 1 to 9
     ([x..8]>>" ")            -- take length of [x..8] copies of a space
     s[1..x]                  -- the digits from 1 to x
     " x 8 + "                -- a string literal
     s[x]                     -- the digit of x
     " = "                    -- another string literal
     s[9,8..10-x]             -- the digits from 9 down to 10-x
     "\n"                     -- an a newline


2

Pyke, 30 29 bayt

9Fd*~utj+9<\x8\+9i-\=ji>_dJ)X

Burada dene!

9F                         )  -  for i in range(9):
  d*                          -       " " * i
        +                     -      ^ + V
       j                      -       j = V
    ~ut                       -        "123456789"
         9<                   -     ^[:9]
           \x8\+9i-\=         -    [^, "x", 8, "+", (9-i), "=", V]
                        _     -     reversed(V)
                     ji>      -      j[i:]
                         dJ   -   " ".join(^)
                            X - print(reversed(^))

2

PowerShell v2 +, 85 64 58 57 52 bayt

8..0|%{" "*$_+-join(1..++$i+" x 8 + $i = "+9..++$_)}

8..0|%{...}Range operatörü üzerinden 8 - 0 arasında döngüler . Her yineleme biz çıkış (boşluklar uygun sayıda oluşan bir dizi birleştirme " "*$_), artı bir -join(a aralığının ed dize 1önceden artan yardımcı numarasına ++$iartı orta bit " x 8 + $i = "artı nihai aralığında 9mevcut sayısı için $_önceden -incremented).

Buradaki büyük numaralardan biri -join, sadece tek bir -joinoperatör kullandığımız anlamına gelir, yani parenler içinde dizileri "eklememize" izin veren tip tahmini için "sol tercihi" kullanmaktır .

Örnek

PS C:\Tools\Scripts\golfing> .\magical-8-trapezium.ps1
        1 x 8 + 1 = 9
       12 x 8 + 2 = 98
      123 x 8 + 3 = 987
     1234 x 8 + 4 = 9876
    12345 x 8 + 5 = 98765
   123456 x 8 + 6 = 987654
  1234567 x 8 + 7 = 9876543
 12345678 x 8 + 8 = 98765432
123456789 x 8 + 9 = 987654321

4
%{Gözlerin iyi mi?
gcampbell

@gcampbell Gözlerin böyle gözükse, kaşlarını çatırdın.
AdmBorkBork

Fontunuzun yüzdeleri nasıl oluşturduğuna bağlıdır.
gcampbell


2

J, 51 bayt

(|."1|.\p),.' x 8 + ',"1]p,.' = ',"1]\|.p=:u:49+i.9

Dize oluşturur 123456789ve daha sonra çıktıyı oluşturmak için önekler ve sonekler üzerinde çalışır.

kullanım

   (|."1|.\p),.' x 8 + ',"1]p,.' = ',"1]\|.p=:u:49+i.9
        1 x 8 + 1 = 9        
       12 x 8 + 2 = 98       
      123 x 8 + 3 = 987      
     1234 x 8 + 4 = 9876     
    12345 x 8 + 5 = 98765    
   123456 x 8 + 6 = 987654   
  1234567 x 8 + 7 = 9876543  
 12345678 x 8 + 8 = 98765432 
123456789 x 8 + 9 = 987654321

2

JavaScript ES6 (88)

Yeni repeatyöntemden faydalanmak , geri tepmek ve baştan çıkarıcı ...

i=10;for(y="";--i;)console.log(`${" ".repeat(i)+(y+=(x=10-i))} x 8 + ${x} = ${y*8+x}\n`)

nice job bro, biraz alan kaldırmayı düşünün , bunun alertyerine console.logbiraz bayt kurtarabilirsin!
chau giang,

Bunu gece yarısından hemen önce cevap verdiğimde, yarı uykuya yakın olduğumu düşündüm ... Yakında bununla ilgili bir güncelleme yayınlayacağım. LOL
WallyWest

2

R, 107 103 bayt

a=1;for(i in 2:10){cat(rep("",11-i),paste(a,"x",8,"+",(i-1),"=",strtoi(a)*8+(i-1)),"\n");a=paste0(a,i)}

Ungolfed:

a=1

for(i in 2:10)
    cat(rep("",11-i),paste(a,"x",8,"+",(i-1),"=",strtoi(a)*8+(i-1)),"\n")
    a=paste0(a,i)

Sonuç:

        1 x 8 + 1 = 9 
       12 x 8 + 2 = 98 
      123 x 8 + 3 = 987 
     1234 x 8 + 4 = 9876 
    12345 x 8 + 5 = 98765 
   123456 x 8 + 6 = 987654   
  1234567 x 8 + 7 = 9876543 
 12345678 x 8 + 8 = 98765432 
123456789 x 8 + 9 = 987654321


2

APL (Dyalog Unicode) , 61 52 39 bayt SBCS

↑(⍳9)((¯9↑↑),' x 8 +',⊣,'= ',↑∘⌽)¨⊂1↓⎕D

Çevrimiçi deneyin!

-9 Bayt 10⊥sayısını azaltmak için numarayı ayrıştırmak için hile kullanarak . -13 için @ Adám'a teşekkürler!

Açıklama:

    ((¯9↑↑),' x 8 +',⊣,'= ',↑∘⌽)¨⊂1↓⎕D
                                     D   Numbers from 0 to 9
                                   1     Drop the 0
 (⍳9)(                          )¨⊂       Do 9 times, N=current
                             ↑∘⌽          Reverse the string (9..1) and cut off N elements
                                         N itself
      (   ↑)                              Drop N elements off the 1..9 string...
      9 )                              ...then pad it back with spaces
            ,' x 8 +', ,'= ',             Join with a few constant strings
                                         Format

1

JavaScript (ES6), 99 bayt

_=>[...Array(9)].map((n,i)=>`${n="        123456789".substr(i,9)} x 8 + ${++i} = ${n*8+i}`).join`\n`
_=>".........".replace(/./g,(n,i)=>`${n="        123456789".substr(i,9)} x 8 + ${++i) = ${n*8+i}\n`)

Nerede \nbir hazır satır karakteri temsil eder. İkinci versiyonda takip eden bir yeni satır çıkıyor. Rakamlar için bir formül buldum ('1'.repeat(9-i)+0+i)/9ama dolguyu bu şekilde yapmak daha kolaydı.


1

Brainfuck , 232 bayt

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

Çevrimiçi deneyin!

Çok daha fazla golf oynayabilir ...


1

Javascript (harici kütüphaneyi kullanarak) (143 bayt)

n=>_.Range(1,9).WriteLine(v=>_.Range(0,10-v).Write("",x=>" ")+_.Range(1,v).Write("")+" x 8 + " + v + " = "+_.Range(10-v,v).Reverse().Write(""))

Lib bağlantısı: https://github.com/mvegh1/Enumerable/

Kod açıklaması: 1 ile 9 arasında bir aralık oluşturun ve her değer için, karmaşık yüklemeye karşılık gelen bir satır yazın. Öngörü, geçerli tamsayı değerinden geçirilir ve bu kadar fazla boşluk oluşturmak için 10-currentValue öğelerini kapsayan bir aralık oluşturur. Bu boşluklar, çizginin formül kısmı ile birleştirilir ve daha sonra ters sırada, ön eleman olarak elemanların sayısıyla eşleşen aralığın arka ucu ile birleştirilir.

Not: Görüntüde, ilk satır bir boşluk ile kapatılmıştır çünkü konsol, dönüş değeri bir dize olduğundan tırnak işareti eklemiştir. Gerçek değer doğru biçimlendirilmiş

görüntü tanımını buraya girin


1

05AB1E , 24 bayt

9Lε©LJ'x8'+®'=T®L-Jðý}.c

Çevrimiçi deneyin!

Şimdi izin verilen, meydan okumadan daha yeni bir sürüm kullanır.


Çok değil, ama 05AB1E'nin daha yeni sürümünde, onu kaldırabilir ©ve bir bayttan tasarruf ®etmek yiçin girişini değiştirebilirsiniz .
Kevin Cruijssen

@KevinCruijssen Eh, genellikle böyle eski cevapları "güncellemiyorum". Ayrıca, "yeni sürüm" tamamen farklı bir dildir (farklı uygulamalar).
Outgolfer Erik


1

VBA (Excel), 51 bayt

Hemen Pencereyi Kullanma

For z=1To 9:a=a &z:?Spc(9-z)a" x 8 +"z"="a*8+z:Next

0

k (77 bayt)

Muhtemelen biraz daha kısaltılmış olabilir

-1@'((|t)#\:" "),'(t#\:n),'" x 8 + ",/:n,'" = ",/:(t:"I"$'n)#\:|n:"123456789";

Örnek:

k)-1@'((|t)#\:" "),'(t#\:n),'" x 8 + ",/:n,'" = ",/:(t:"I"$'n)#\:|n:"123456789";
         1 x 8 + 1 = 9
        12 x 8 + 2 = 98
       123 x 8 + 3 = 987
      1234 x 8 + 4 = 9876
     12345 x 8 + 5 = 98765
    123456 x 8 + 6 = 987654
   1234567 x 8 + 7 = 9876543
  12345678 x 8 + 8 = 98765432
 123456789 x 8 + 9 = 987654321

0

golflua, 56 karakter

p=""~@i=1,9p=p..i; w(S.q("%9s x 8 + %d = "..p*8+i,p,i))$

Örnek çalışma:

bash-4.3$ golflua -e 'p=""~@i=1,9p=p..i; w(S.q("%9s x 8 + %d = "..p*8+i,p,i))$'
        1 x 8 + 1 = 9
       12 x 8 + 2 = 98
      123 x 8 + 3 = 987
     1234 x 8 + 4 = 9876
    12345 x 8 + 5 = 98765
   123456 x 8 + 6 = 987654
  1234567 x 8 + 7 = 9876543
 12345678 x 8 + 8 = 98765432
123456789 x 8 + 9 = 987654321
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.