输出一个神奇的8梯形


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或任意一个。

1
有关。(稍有...)
马丁·恩德

需要中间空格,是吗?
价值墨水

@ KevinLau-notKenny是,但是如果很重要,您也可以随时发布替代方法。
rybo111 '16

它是6个字节,对应于中间的6个空格,所以不,我认为它不够重要。
价值墨水

Answers:


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,因此新a12345*10 + 6123456

将它们存储为数字而不是字符串,可以让我们计算出等式给出的RHS a*8+i,它比字符串反转短。


+1以了解其含义-可以生成的总和
rybo111 '16

7

V,37字节

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

在线尝试!

这包含不可打印的内容,因此这是一个十六进制转储:

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更好地直接在字符串中插值,而无需使用格式说明符。
manatwork '16

1
您可以使用一些技巧来删除另外23个字节:将@ ++ $ i <= 9更改为$ i ++ <9将节省2个字节。您不需要使通知静音,因为它们不会停止执行,并且在标准PPCG规则下,您可以忽略stderr。将\ n更改为实际的换行符会节省一个字节。将join(range(...))位更改为$ s。= $ i和$ t。= 10- $ i可节省15个字节。这是可行的,因为赋值会返回赋值,这几乎是我为高尔夫php找到的最有价值的技巧。最后5个字节由上面的操作详细介绍
user55641 '16

1
您可以通过更换下降2个字节$t.=10-$i$s*8+$itio.run/##K8go@G9jXwAk0/...
640KB

1
那是59个字节。而$s*8+$i不是$t.=10-$i节省另外两个。
泰特斯

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

感谢@FryAmTheEggman节省了2个字节。感谢@KennyLau节省了3个字节。


s不与空格连接-不带分隔符连接。
isaacg '16

@isaacg hah,现在我想我可以通过加入空格来节省一个字节
2016年

字节数将相同
Leaky Nun


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],这很好,因为每个数字都只有一个数字。因此,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再省三个!下降到75。–
林恩

很好,谢谢您的帮助!太糟糕了,我不得不第二次双层切片
mbomb007 '16

4

Perl,49个字节

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

用法

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

4

Ruby 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]
manatwork '16

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

啊,我不知道%9d要填充这样的整数
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太好了!没想到要像这样计算初始数字。
价值墨水

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 '16

1
您可以通过初始化s到循环"\n""\n"+for循环中删除来节省几个字节
悬崖根

@ wizzwizz4谢谢。应知×为2个字节,而不是1像x..
凯文Cruijssen

您不是s也在每次迭代中添加结果吗?
悬崖根

我知道这已经很老了,但是您能return o代替System.out.print(o)吗?另外,您可以更改为Java 10并使用var和lambda进行保存
无知的体现

3

C,74字节

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个字节

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个字节。
凯文·克鲁伊森

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)}“);} ------------为您节省了一个字节!
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%%

是的,一行上有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

Pyke,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 -递增)。

这里的一个大技巧是我们利用“ left-preference”进行类型转换,这使我们可以在-join括号内将数组“添加”在一起,这意味着我们仅使用一个-join运算符。

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 '16

@gcampbell如果你的眼睛看起来像那样,你也会皱着眉头。
AdmBorkBork '16

取决于字体如何呈现百分比。
gcampbell '16


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,它可以节省一些字节!
chau giang

鉴于我是在午夜之前回答这个问题的,所以我认为我已经快要睡着了……我将尽快发布更新。大声笑
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⊥技巧来解析数字,而不是减少。感谢@Adám-13!

说明:

    ((¯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`)

其中\n代表文字换行符。第二个版本输出尾随换行符。我想出了一个数字公式,('1'.repeat(9-i)+0+i)/9但是用这种方法更容易填充。


1

Brainfuck,232字节

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

在线尝试!

可以打得更远...


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

05AB1E,24字节

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

在线尝试!

使用比挑战更高的版本,现已允许。


这不是很多,但在05AB1E的甚至较新的版本,你可以删除©,并改变®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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.