Роздрукуйте арку висхідних / низхідних чисел


28

Я вважав, що "арка" є найкращим способом описати цю схему чисел:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

Формально визначений, кожен рядок складається з цифр від 1 до 9-n, (n-1)*2пробілів і чисел 9-nчерез 1 (де nпоточний рядок).

Ваше завдання - написати, скориставшись найкоротшим можливим кодом, невеликий скрипт / програму, яка надрукує вищезазначений зразок з урахуванням таких обмежень:

  1. Ви не можете жорстко кодувати весь візерунок. Ви можете мати лише жорсткий код одного рядка шаблону.
  2. Програма повинна надрукувати новий рядок (будь-яку комбінацію \nабо \r) в кінці кожного рядка.

На старт, увага, марш!


1
Додаткова маленька хитрість буде доступна для верхньої лінії, 123456787654321оскільки вона дорівнює 11111111^2 ;-)
Egor Skriptunoff

3
@EgorSkriptunoff 11111111^2 == 123465787654321 != 1234567887654321( помічайте повторення 8)
Боб

Це щось на зразок оберненого Друком цього алмазу
Пітер Тейлор

6
Це схоже на штору .
Нестабільність

Відповіді:


22

Пітон 2, 65 55 53 51

s=12345678
while s:r='%-8d'%s;print r+r[::-1];s/=10

Скорочено, використовуючи деякі ідеї ugoren .


Хе, я знав, що є місце для вдосконалення: П
Натан Осман

2
Ви можете зекономити багато s=s[1:]за цикл таwhile s:
ugoren


9

APL (18)

k,⌽k←↑↑∘(1↓⎕D)¨⌽⍳8

Пояснення:

  • 1↓⎕D: рядок цифр ("0123456789") мінус його перший елемент
  • ↑∘(1↓⎕D)¨⌽⍳8: виберіть перші [8..1] символи ('12345678', '1234567' ...)
  • : форматувати як матриця (заповнення невикористаних символів пробілами)
  • k,⌽k←: зберігання kта відображення з kподальшим вертикальним дзеркальним відображеннямk

4

Ruby: 61 50 символів

s="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}

Проба зразка:

bash-4.2$ ruby -e 's="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}'
1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

4

Befunge - 3 х 18 = 54

Я відчував, що мені потрібно щось робити з приворотом, це минуло давно, як я останній раз користувався цим. Ця проблема вважається найбільш підходящою для мови.

Це жахливо повільно через цикл друку, який виконує близько 8 дій на символ (стилі підрахунку різняться).

80v >#v"12345678"<
>5 *^ >,#$:_$:1-:v
^2< 0p0+7\*48\_@#<

4

JavaScript, 71

s='1234567887654321',i=10;while(--i)console.log(s=s.split(i).join(' '))

s="1234567887654321";for(i=10;--i;)console.log(s=s.split(i).join(" "))для 70 символів, @SteveWorley
WallyWest

3

C, 83 символів

main(a,b,n){
    for(a=12345678,n=1e8,b=n-a-1;a;a/=10)
        printf("%-8d%8d\n",a,b),
        b%=n/=10;
}

3

Пітон 2, 75 62

Він не переможе у відповіді Volatility, але ось інший підхід із використанням змінних рядків python ( bytearray):

s=bytearray('1234567887654321')
for i in range(8):s[8-i:8+i]=i*'  ';print s

Редагувати

Я знайшов більш коротку версію, використовуючи str.replace:

s='1234567887654321'
for c in s[8:]:print s;s=s.replace(c,' ')

3

Перл, 41

плюс -Eперемикач. Всього символів у командному рядку: 50

потрібен принаймні perl5, версія 10.

perl -E'say@!=1..8-$_,$"x(2*$_),reverse@!for-0..7'

Я б сказав, що це 42, через те, що стандартний погляд на -Eдодаток до програми є однобайтовим.
Тімтех

3

Математика 92 85 67 54 51

Спосіб №1 : (54 символи) Створює масив за допомогою рядка №, кола # та відстані від лівого та правого краю.

Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]

Спосіб №2 : (67 знаків) Діапазони, що скорочують колодки, що скорочуються

Print@@@Table[Join[k = PadRight[Range@i, 8, " "], Reverse@k], {i, 8, 1, -1}];

Спосіб №3 : (85 символів) Вибірково заповнюйте кожен рядок масиву.

Почніть зі списку з 8 символів пробілу. Замініть позиції 1 і 16 на "1"; замініть "2" у позиціях 2 та 15 тощо.

p = 0; q = 16;
Print @@@Reverse@Rest@NestList[ReplacePart[#, {++p -> p, q-- -> p}]&,Array[" "&,q], 8];

Метод №4 : (86 символів) Вибірково очистіть кожен рядок масиву.

p=8;q=9;
Print@@@NestList[ReplacePart[#,{p---> " ",q++-> " "}]&,Join[k=Range@8,Reverse@k],7];

Спосіб №5 : Використання рядків (92 знаки)

p=8;s="12345678";
Print[#,StringReverse@#]&/@NestList[StringReplace[#,ToString@p-- ->  " "]&,s,7];

Ця нова - струнка! Я б ще +1, якби міг. :-) btw, ви можете кинути ()та замінити #1на #:Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]
Mr.Wizard

Дякую за поради. Так, Arrayіноді можна робити приємні таблиці, не додаючи ітераторів.
DavidC

3

PHP, 68

(Натхненний відповіддю HamZa)

for($n=8;$n;$r[]=$n--)echo str_replace($r," ","1234567887654321\n");

Грає на тому, що str_replace PHP може прийняти масив для пошуку та рядок для заміни, він замінить кожен елемент у масиві заданим рядком. Після кожної ітерації поточний номер додається до масиву пошуку, видаляючи його з наступного циклу.

Приклад коду в дії: http://ideone.com/9wVr0X


hehe приємно +1
HamZa

Але, здається, не потрібно розміщувати потрібну кількість пробілів у середині
Nathan hayfield

@nathanhayfield: Як так? Перший рядок має 0 пробілів, у другому - 2, потім 4, 6, 8 тощо.
Містер Лама

не коли я запускав його на writecodeonline.com/php
nathan

Це тому, що вихід не був загорнутий у <pre>теги. При інтерпретації як html-текст пробіли згортаються, а нові рядки ігноруються, але якщо ви перевірите джерело, ви побачите інше.
Містер Лама

3

Марбельний 165

@0
08
>0
LN
--
@0
:LN
}0}0}0}0
..SAPSSD0A
{0
:PS
}0
~~09
..//
<<@0
\\>0
&0//
--@1
@020
&0/\&0
@1
:SA
@0
}0
>0!!
--00@1
@0++//
+O/\@1
+O
:SD
}0@0
\\>0\/
--/\+O
@0..+O

Псевдокод:

MB():
    for x in 8..1:
        LN(x)
LN(x):
    SA(x)
    PS(x)
    SD(x)
    print "\n"
PS(x):
    print " "*(8-x)*2
SA(x):
    for n in 1..x:
        print n
SD(x):
    for n in x..1:
        print n

2

Python 2.x - 73 65 63 61 символів

c=1;s='87654321'
while c<9:print s[::-1]+s;s=' '*c+s[c:];c+=1

2

PHP, 76

for($i=9;$i>1;){$r[]=$i--;echo str_replace($r,' ','1234567887654321')."\r";}

2

К, 28

-1_a,'|:'a:8$'{-1_x}\,/$1+!8

.

k)-1_a,'|:'a:8$'{-1_x}\,/$1+!8
"1234567887654321"
"1234567  7654321"
"123456    654321"
"12345      54321"
"1234        4321"
"123          321"
"12            21"
"1              1"

Ви можете узагальнити це для 36: {-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x}

k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 5
"1234554321"
"1234  4321"
"123    321"
"12      21"
"1        1"
q)k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 15
"123456789101112131415514131211101987654321"
"12345678910111213141  14131211101987654321"
"1234567891011121314    4131211101987654321"
"123456789101112131      131211101987654321"
"12345678910111213        31211101987654321"
"1234567891011121          1211101987654321"
"123456789101112            211101987654321"
"12345678910111              11101987654321"
"1234567891011                1101987654321"
"123456789101                  101987654321"
"12345678910                    01987654321"
"1234567891                      1987654321"
"123456789                        987654321"
"12345678                          87654321"
"1234567                            7654321"
"123456                              654321"
"12345                                54321"
"1234                                  4321"
"123                                    321"
"12                                      21"
"1                                        1"

2

Javascript, 67 знаків

Натхненний відповіддю Стівворлі (я б прокоментував, якщо зможу):

Фрагмент коду

a='1234567887654321\n',b='',c=10;while(--c)b+=a=a.split(c).join(' ')
<a href="#" onclick="javascript:document.getElementById('output').innerHTML = b;">Display</a>
<pre id="output">...</pre>

Наявність останнього нового рядка відповідає правилам.

оновлення: виріжте 2 символи, видаливши дужки (пріоритет оператора) та 1, видаливши непотрібний пробіл

Здавалося, що це тролінг мене, тому що незалежно від того, скільки б різних способів я намагався скоротити або спростити шляхом некрупного кодування сегмента коду, довжина залишилася такою ж, доки я не дозволю застосувати правило "Я думаю, що це рахується", написане нижче.

(Якщо друк вважається тим, що повертається, коли це виконується в хромованій консолі)


Це не схоже на іншу відповідь, номери не вирівнюються у правій колонці.
AL

@AL Попередження не потрібне, якщо ви читаєте, який вихід виходить з консолі btw.
Sophiα2329

Для вирівнювання правого стовпця має бути 1 пробіл замість 2 у аргументі рядка приєднання. З двома пробілами вона правильно вирівняна в хромованому оповіщенні браузера.
Qwertiy

Я оновив вашу публікацію (редагування слід прийняти), щоб відобразити результат у фрагменті без попередження JS, в цьому випадку потрібно лише одне місце.
AL

2

Мозговий ебать: 542 байт

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

1

Математика , 59

61, використовуючи власні ідеї:

Grid[Clip[#~Join~Reverse@#&@Range@8,{1,9-#},{," "}]&~Array~8]

Або 59, запозичивши відповідь Девіда:

Grid@Array[Join[k=PadRight[Range[9-#],8," "],Reverse@k]&,8]

Щойно я врятував 4 символи за допомогою Grid, натхненного вашим записом.
DavidC


1

Хаскелл, 84

Відправна точка для покращення:

mapM_ putStrLn[let l=take(8-i)"12345678"++replicate i ' 'in l++reverse l|i<-[0..7]]

Швидше за все, це було б, щоб l++reverse lпитання було вільним, дозволяючи нам позбутися від letзаяви, але я можу знайти ap, що потрібно імпорт.


1

PostScript: 105 символів

Обробка рядків не є простою в PS, але може створити відносно простий код:

0 1 7{(1234567887654321)dup
8 3 index sub(              )0 6 -1 roll 2 mul getinterval putinterval =}for

Трохи довша версія на 120 символів, але може генерувати різні арки чисел, замінюючи 8 на початку другого рядка будь-яким числом у діапазоні від 1 до 9:

/D{dup}def/R{repeat}def/P{=print}def
8 D -1 1{1 1 index{D P 1 add}R pop 2 copy sub{(  )P}R D{D P 1 sub}R pop()=}for pop

Приємно бачити, що я не єдиний, хто любить PostScript там.
AJMansfield

1

GoRuby 2.1

36 символів

8.w(1){|x|a=[*1..x].j.lj 8;s a+a.rv}

Безумовно

8.downto(1) do |x|
  a = [*1..x].join.ljust(8)
  puts a + a.reverse
end

1

К 20

{x,'|:'x:|x$,\$1+!x}    

q)k){x,'|:'x:|x$,\$1+!x}8    
"1234567887654321"    
"1234567  7654321"    
"123456    654321"    
"12345      54321"    
"1234        4321"      
"123          321"    
"12            21"    
"1              1"    

1

TSQL, 148

Редагувати: до 148 з пропозицією манатурки та перейдіть на ЗАМОВЛЕННЯ.

Читає:

WITH t AS(
    SELECT 1n, CAST(1 AS VARCHAR(MAX)) o
 UNION ALL
    SELECT n+1,o+CHAR(n+49)
    FROM t
    WHERE n<8
)
SELECT o  + SPACE(16-2*n) + REVERSE(o)
FROM t
ORDER BY 1 DESC

Гольф:

WITH t AS(SELECT 1n,CAST(1AS VARCHAR(MAX))o UNION ALL SELECT 1+n,o+CHAR(n+49)FROM t WHERE n<8)SELECT o+SPACE(16-2*n)+REVERSE(o)FROM t ORDER BY 1DESC

Вихід:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

1
Хороший. Але ви можете, будь ласка, опублікувати його також у форматі, в якому ви нарахували 153 символи? У будь-якому випадку, ви можете пощадити два символи, використовуючи числовий, 1а не рядок, '1'куди ви castйого відразу введете varchar. Це дає мені 149 символів: with t as(select 1n,cast(1as varchar(max))o union all select n+1,o+char(n+49)from t where n<8)select o+space(16-2*n)+reverse(o)from t order by o desc.
манатура

@manatwork: Я не міг відтворити 153 число, тому що я все менше знижувався. Однак застосовано вашу пропозицію. Спасибі!
комфортноdrei

1

Хаскелл, 79

r n x|x>n=' '|True=x
t="87654321"
main=mapM(putStrLn.(`map`("12345678"++t)).r)t

Це працює, заміняючи символи> n на ' ', де символи n походять з "87654321" (що, як буває, є хвостом рядка для здійснення заміни на).


1

PHP: 61 символ (або 60 символів, якщо ви заміните \ n справжнім новим рядком ASCII)

(Натхненний відповіддю GigaWatt та HamZa)

for($n=9;$n;$r[$n--]=" ")echo strtr("1234567887654321\n",$r);

http://ideone.com/FV1NXu


1

PowerShell: 38

Код для гольфу

8..1|%{-join(1..$_+"  "*(8-$_)+$_..1)}

Покрокова інструкція

8..1|%{... }цілі числа від 8 до 1 в цикл ForEach-Object.
-join(... )об'єднує вихід вкладеного коду в єдиний рядок без розмежувачів.
1..$_виводить цілі числа, що збільшуються від 1 до поточного цілого числа в циклі.
+" "*(8-$_)до результату додає подвійний пробіл, помножений на різницю між 8 і поточним цілим числом.
+$_..1до результату додає цілі числа, спадаючи від поточного цілого числа до 1.


1

Javascript з лямбдами, 147

(s="12345678")[r="replace"](/./g,i=>s[r](RegExp(".{"+(i-1)+"}$"),Array(i*2-1).join(" ")))[r](/\d{1,8} */g,m=>m+(Array(m%10+1).join(m%10+1)-m)+"\n")

Можна перевірити у Firefox.



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