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).map→1.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.