Magical 8 Trapeziumを出力する


41

あなたの仕事は、Magical 8 Trapeziumを出力することです:

        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
  • 選択した言語で、可能な限り少ないバイト数で出力します。
  • 台形を維持するために、各行の先頭にあるスペースの数に注意してください。
  • 末尾のスペースは許可されます。
  • 使用する×か、文字xを使用できます-どちらでも使用できます。


真ん中のスペースが必要ですか?
値インク

@ KevinLau-notKennyですが、重要な場合はいつでも代替を投稿することもできます。
rybo111

中央の6つのスペースに対応する6バイトなので、いいえ、それは十分に重要ではないと思います。
値インク

回答:


15

Python 2、59バイト

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

数値ai方程式a * 8 + iは算術的に生成されます。各行iはインクリメントaされ、次の数字がを介して追加されa=a*10+iます。例えば、場合a=12345, i=5そして、iなると6、新しいのでaIS 12345*10 + 6です123456

これらを文字列ではなく数値として保存すると、式a*8+iで与えられるようにRHSを計算できます。これは、文字列の反転よりも短いです。


+
1-

7

V、37バイト

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

オンラインでお試しください!

これには印刷できないものが含まれているため、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バイト

私の最初のゴルフはここで試してみてください(manatworkとuser55641に感謝)

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(自分の試行)

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

105(最初)

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

1
単一のステートメントを囲む中括弧は不要です。$ i単独では、書式指定子なしで文字列に直接補間する方が適切です。
マナトワーク

1
いくつかのトリックでさらに23バイトをドロップできます。@ ++ $ i <= 9を$ i ++ <9に変更すると、2バイト節約できます。実行を停止しないため、通知を黙らせる必要はありません。標準のPPCGルールでは、必要に応じてstderrを無視できます。\ nを実際の改行文字に変更すると、バイトが節約されます。join(range(...))ビットを$ s。= $ iおよび$ t。= 10- $ iに変更すると、15バイト節約できます。これは、割り当てが割り当てられた値を返すために機能し、PHPでゴルフをするために見つけた最も貴重なトリックです。最後の5つのバイトは、上記manatworkで詳述されている
user55641

1
に置き換えることで$t.=10-$i、さらに2バイトをドロップできます$s*8+$itio.run/##K8go@G9jXwAk0/...
640キロバイト

1
59バイトです。そして$s*8+$i$t.=10-$iさらに2つ節約します。
タイタス

5

Pyth、32バイト

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

オンラインでお試しください!

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バイトを保存してくれた@FryAmTheEggmanに感謝します。3バイトを節約してくれた@KennyLauに感謝します。


sスペースで結合しません-区切り文字なしで結合します。
isaacg

ほら@isaacg、そして今、私はスペースで参加してバイトを救うことができると思っています
ヴェン

バイト数は同じになります。
リーキー修道女


4

Python 2、87 84 78 75バイト

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

オンラインで試す

以前のバージョンでは、ストリングマジックを使用していました。

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)文字列にキャストするとが得られ[1, 2, 3, 4, 5, 6, 7, 8, 9]、これはすべての数字が1桁にすぎないため便利です。したがって、これから文字列123456789を取得するのは簡単`range(1,10)`[1::3]です。逆の範囲は`range(1,10)`[-2::-3]です。次に、各反復が必要な範囲でのみ取得するために、逆の桁の3*n、または3*(9-n)27-3*n)で切り取ります。


for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]80バイトでできます。
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9さらに3つ節約できます!75まで。–
リン

いいね、助けてくれてありがとう!
残念なことに


4

ルビー、77 73 65 60バイト

オンラインで試してみてください〜

@manatworkからの大幅な改良

@xsotからの別のオーバーホール

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

書式文字列:で短くなっているようですputs'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i]
マナトワーク

(1..9).map1.upto(9)
マナトワーク

ああ、私は%9dそのような整数をパディングするフォーマットオプションであることを知りませんでした
値インク

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

@xsotそれは素晴らしい!そのような初期数を計算することを考えていませんでした。
バリューインク

4

ジャワ10、151の 133 130 129 126 110バイト

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;}

オンラインでお試しください。

説明:

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
x乗算記号の代わりに使用することでバイトを節約できると思います。
wizzwizz4

1
あなたは初期化することにより、バイトのカップルを保存することができますs"\n"して削除する"\n"+からforループ
cliffroot

@ wizzwizz4ありがとう。知られている必要があります×2バイトの代わりのような1ですx。..
ケビンCruijssen

s繰り返しごとに結果に追加しませんか?
クリフルート

私はこれが古いことを知っていますが、return o代わりにできませんSystem.out.print(o)か?また、Java 10に変更してvar、ラムダを使用して保存することができます
無知の


3

C#、113バイト

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));}

とにかくこのソリューションを改善する必要がある場合は、気軽に共有してください。


スペースを削除することで1バイト節約;n=10*n+ ++iできます。forループではに変更できます;n=++i+10*n。また、+" x "+"8 + "+に変更できます+" x 8 + "+。さらに3バイト節約します。
ケビンCruijssen 16

void f(){for(int n = 1、i = 1; i <10; n = ++ i + 10 * n)Console.WriteLine($ "{new string( ''、9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ 1バイト節約しました!
downrep_nation

3

バッチ、117バイト

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

はい、1行に16%の記号があります。それはあなたのためのバッチです!


2

Haskell、92バイト

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

使い方:

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

パイク、30 29バイト

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

ここで試してみてください!

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バイト

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

8..0|%{...}範囲演算子を介して8から0にループします。各反復で、(適切な数のスペース" "*$_)、および-joined文字列(範囲から1事前にインクリメントされたヘルパー番号++$i、プラス中間ビット" x 8 + $i = "、および最終範囲から9現在の番号$_pre )で構成される文字列連結を出力します-増分)。

ここでの1つの大きなトリックは、型キャストに「左優先」を活用することです。これにより、-join括弧内で配列を「追加」できます-join。つまり、演算子を1つだけ使用します。

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
%{あなたの目は大丈夫ですか?
-gcampbell

@gcampbellあなたの目がそのように見えたら、あなたも眉をひそめているでしょう。
AdmBorkBork

フォントがパーセントをレンダリングする方法に依存します。
-gcampbell


2

J、51バイト

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

文字列123456789を作成し、その接頭辞と接尾辞を操作して出力を作成します。

使用法

   (|."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)

新しいrepeatメソッド、バックティックス、テンプレートの活用...

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

すてきな仲間、あなたはいくつかのスペースを削除し、alert代わりに使用することを検討する必要がありますconsole.log、それはいくつかのバイトを節約できます!
チャウジャン

真夜中の直前にこれに答えたので、私はほぼ半分眠っていると思います...私はこれについての更新をすぐに投稿します。笑
WallyWest

2

R、107103バイト

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)}

アンゴルフド:

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)

結果:

        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 バイトSBCS

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

オンラインでお試しください!

-9バイトを10⊥削減する代わりに、トリックを使用して数値を解析します。-13の@Adámに感謝します!

説明:

    ((¯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バイト

_=>[...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`)

where \nは、リテラルの改行文字を表します。2番目のバージョンは、末尾の改行を出力します。数値の公式を思いつきましたが、('1'.repeat(9-i)+0+i)/9この方法の方がパディングが簡単でした。



1

Javascript(外部ライブラリを使用)(143バイト)

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へのリンク:https : //github.com/mvegh1/Enumerable/

コードの説明:範囲1〜9を作成し、各値について、複雑な述語に対応する行を記述します。述語には現在の整数値が渡され、10個のcurrentValue要素にまたがる範囲が作成され、その数のスペースが作成されます。これらのスペースは、行の数式部分と連結され、その後、要素の数に一致する範囲の末尾とフロントエンドとして逆順に連結されます。

注:イメージでは、戻り値がストリングであるためコンソールが引用符を追加したため、最初の行は1スペース分ずれています。実際の値は正しくフォーマットされています

ここに画像の説明を入力してください


1

05AB1E、24バイト

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

オンラインでお試しください!

現在許可されているチャレンジよりも新しいバージョンを使用します。


大したことではありませんが、05AB1Eのさらに新しいバージョンでは©、を削除し、®to yを変更してバイトを保存できます。
ケビンクルーッセン

@KevinCruijssenええ、私は一般的にそのような古い答えを「更新」しません。また、「新しいバージョン」はまったく異なる言語です(異なる実装)。
エリック・ザ・アウトゴルファー


1

VBA(Excel)、51バイト

イミディエイトウィンドウを使用する

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

0

k(77バイト)

おそらくもう少し短くすることができます

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

例:

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文字

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

サンプル実行:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.