Виведіть магічний 8 трапецій


41

Ваше завдання - вивести Чарівний 8 трапецій:

        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

Числа aта iрівняння a * 8 + iформуються арифметично. Кожен рядок iзбільшується і aнаступна цифра додається через a=a*10+i. Наприклад, якщо a=12345, i=5, то iстає 6, то нове aє те, 12345*10 + 6що є 123456.

Збереження їх як чисел, а не рядків дозволяє нам обчислити РЗС, задані рівнянням a*8+i, яке коротше, ніж обертання рядків.


+1 для того, щоб побачити це таким, яким воно є - суму, яку можна отримати
rybo111

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

05AB1E , 32 31 30 28 байт

Код:

TG9N-ð×NLJðN"x8+ÿ="€ðJžmN£J,

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


.cтут не можна використовувати?
Чарівний восьминіг Урна

@carusocomputing Це так, але це вирішує проблему.
Аднан

Аааа ... Не бачив часової позначки.
Чарівний восьминога Урна

5

PHP, 105 89 60 57 байт

моя перша спробу гольфу тут (завдяки манаборту та користувачеві 55641)

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 на фактичний символ нового рядка зберігає байт. Зміна бітів приєднання (діапазон (...)) на $ s. = $ I і $ t. = 10 - $ я економить 15 байт. Це працює, тому що завдання повертають призначене значення і є майже найціннішим трюком, який я знайшов для гольфу на php. Останні 5 байтів детально описані манатуркою вище
user55641

1
Ви можете скинути ще 2 байти, замінивши $t.=10-$iна $s*8+$i. tio.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

@isaacg hah, і тепер я думаю, що міг би врятувати байт, приєднавшись до місця,
Вен

Кількість байтів було б однаковою .
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

4

Perl, 49 байт

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

Використання

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

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те, що це варіант форматування для прокладки таких цілих чисел
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

Java 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..
Кевін Круїйсен

Чи не додаєте ви 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-loop можна змінити на ;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

Хаскелл, 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|%{...}через оператор діапазону. Кожну ітерацію ми виводимо конкатенацію рядків, що складається з (відповідної кількості пробілів " "*$_), плюс -joinрядка ed (діапазон від 1попередньо збільшеного допоміжного номера ++$i, плюс середній біт " x 8 + $i = ", плюс кінцевий діапазон від 9до поточного числа $_до -посилений).

Одним з великих хитрощів є те, що ми використовуємо «ліву перевагу» для набору типів, що дозволяє нам «додавати» масиви всередину -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

@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, це може заощадити кілька байтів!
chau giang

Враховуючи, що я відповів на це лише до півночі, я вважаю, що я був близько засинання ... Незадовго опублікую оновлення. LOL
WallyWest

2

R, 107 103 байт

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

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-поточні елементи Value, щоб створити стільки пробілів. Ці простори з'єднуються з частиною формули рядка, а потім, яка з'єднується з тайландом діапазону, що відповідає кількості елементів як фронтальний, у зворотному порядку.

Примітка. На зображенні перший рядок відключений одним пробілом, оскільки консоль додала лапки, оскільки значення повернення - рядок. Фактичне значення відформатоване правильно

введіть тут опис зображення


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

гольфлуа, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.