Відліки розмірів


17

Напишіть функцію f (n, k), яка відображає k-мірний відлік від n.

Одномірний відлік від 5 виглядає так

 54321

Двомірний відлік від 5 виглядає так

 54321
 4321
 321
 21
 1

Нарешті, виглядає тривимірний відлік від 5

 54321
 4321
 321
 21
 1
 4321
 321
 21
 1
 321
 21
 1
 21
 1
 1

Формальне визначення

Одновимірний відлік від будь-якого n являє собою єдиний рядок з цифрами n, n-1, ..., 1, з'єднаними (з наступним новим рядком).

Для будь-якого k зворотний відлік k від 1 є єдиним рядком

 1

Для n> 1 і k> 1, k-мірний відлік від n - це (k-1) -вимірний відлік від n, а потім k-розмірний відлік від n-1.

Вхідні дані

Два натуральних числа k і n <= 9 у будь-якому обраному вами форматі.

Вихідні дані

K-мірний відлік від n, з новим рядком після кожного одновимірного відліку. Додаткові нові рядки дозволені у висновку.

Оцінка балів

Стандартне підрахунок гольфу.

Приклад бонусу

Ось приклад з k> n, 4-мірний відлік від 3 (з додатковими коментарями, які не повинні включатись у фактичні рішення):

 -- 3-dimensional countdown from 3
 321
 21
 1
 21
 1
 1
 -- 4-dimensional countdown from 2:
 ---- 3-dimensional countdown from 2:
 21
 1
 1
 ---- 4-dimensional countdown from 1:
 1  

Роз'яснення:

Цифри на рядку не повинні бути суміжними, але вони повинні бути рівномірно розташовані.

Ви можете написати повну програму, а не лише функцію, якщо хочете.


Я не впевнений, що я правильно розумію тестові випадки. Чи відліки 3D та 4D однакові?
Денніс

1
@ Денніс Я думаю, що намір полягає в тому, щоб 4D відлік від 2 = 3D відлік з 2 + 4D відлік з 1
Sp3000

чи не повинен це сказати 3d відлік від одного?
Руйнуючий лимон

Додаткові нові рядки дозволені у висновку. Чи означає це , зверніться до задньої символ нового рядка або вони можуть відбутися в будь-якому місці?
Денніс

@Dennis Додаткові нові рядки можуть з’являтися де завгодно. Ну, 543 \ n21 не все в порядку, але після будь-якого "1" вони все в порядку.
Ерік Треслер

Відповіді:


15

Пітон, 60 байт

f=lambda n,k:n>1<k and f(n,k-1)+f(n-1,k)or'987654321\n'[~n:]

Перевірте це на Ideone .

Як це працює

До - мірний відлік від п може бути визначений за допомогою одного базового випадку:

Якщо n = 1 або k = 1 , то вихід n || n-1 || ... || 1 || ¶ , де || вказує на конкатенацію.

Використовуючи рекурсивне визначення з питання, f(n,k)повертає, f(n,k-1)+f(n-1,k)якщо n> 1 і k> 1 ; в іншому випадку він повертає останні n + 1 символів з '987654321\n'.


Денніс просто надто гарний. Як ти це зробив, хоча?
клісмік

Моє єдине розуміння тут було те, що ви можете комбінувати обидва основні випадки. Решта - це лише прямий переклад рекурсивного визначення.
Денніс

8

Желе , 8 байт

R¡UḌFṚp⁷

Це повна програма, яка очікує n та k як аргументи командного рядка.

Спробуйте в Інтернеті!

Як це працює

R¡UḌFṚp⁷  Main link. Left argument: n. Right argument: k

 ¡        Repeat the link to the left k times.
R           Range; map each integer j in the previous return value to [1, ..., j].
  U       Upend; reverse each 1-dimensional array in the result.
   Ḍ      Undecimal; convert each 1-dimensional array from base 10 to integer.
    F     Flatten the resulting array.
     Ṛ    Reverse the result.
      p⁷  Cartesian product with '\n'. (Join is weird for singleton arrays.)

Не Yпрацює замість p⁷?
милі

Типу. Бо 5, 1він відображає [54321].
Денніс

5

Javascript, 40 38 37 байт

Збережено 1 байт завдяки @ edc65:

f=(n,k)=>k*n?f(n,k-1)+f(n-1,k):n||`
`

Попередні відповіді

38 байт завдяки @Neil:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n||`
`

40 байт:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n?n:'\n'

1
Збережіть один байт, використовуючи ||замість ?n:. Збережіть інший байт, використовуючи буквальний новий рядок всередині `s замість '\n'.
Ніл

Найкраще, що я міг обійтися без зайвих нових рядків, було 43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
Ніл

@Neil Я використовую блокнот ++ для підрахунку байтів, а буквальний новий рядок вважається двома знаками.
Хеді

Можливо, ви могли б спробувати його на скрипті браузера?
Ніл

1
Розумний, +1. Але використовуйте *замість цього &&.
edc65

3

Пітон, 76 75 байт

-1 байт завдяки @ Sp3000

c=lambda n,k:k>1and'\n'.join(c(n-i,k-1)for i in range(n))or'987654321'[-n:]

Виводить з ладу процедуру, описану в ОП: приєднує зменшувані nрезультати для нових k-1рядків з базою рекурсії 'n...1'рядка, коли kвона 1( kне більше ніж1 оскільки нам гарантовано позитивний kвхід).

Тестові приклади на ideone


3

Пітон, 86 81 80 байт

o=lambda d,n:"987654321"[-n:]if d<2else"\n".join([o(d-1,n-x) for x in range(n)])

d - кількість розмірів, n - це число відліку.

Незабаром опублікуємо пояснення.

EDIT №1: змінив його на лямбда.

EDIT №2: Збережено 1 байт завдяки @DestructibleWatermelon.


3

Haskell, 57 байт

n#1='\n':(show=<<[n,n-1..1])
1#_=1#1
n#k=n#(k-1)++(n-1)#k

Приклад використання: 5 # 3-> "\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1".

Безпосередня реалізація визначення.


2

Ракетка 215 байт

(define(g n k(s(number->string n)))(cond [(< k 2) n]
[else(define o(for/list((i(string-length s)))
(string->number(substring s i))))(for/list((x o))(g x(- k 1)))])) 
(define(f n k)(for-each println(flatten(g n k))))

Тестування:

(f 54321 3)

54321
4321
321
21
1
4321
321
21
1
321
21
1
21
1
1

Амм ... Чому в режимі 3D 54321з'являється двічі?
Erik the Outgolfer

Я намагаюся розібратися в проблемах.
rnso

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Проблема виправлена.
rnso

Класно, і я також бачу, що ти видалив багато пробілів!
Ерік Аутгольфер

У Racket використання lambda ( λ) завжди менше байтів, ніж використання define. Крім того, для введення nбуло вказано число, для якого ви будуєте (range 1 n). Дивіться також про заміну вашого condна if, оскільки ви зберігаєте байти на else.
Стівен Х.

2

J, 38 37 32 байт

a:":@>@-.~&,0<@-."1~0&(](-i.)"0)

Це функція, яка приймає k на LHS і n на RHS.

Збережено 5 байт із ідеями від @ Adám.

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

   f =: a:":@>@-.~&,0<@-."1~0&(](-i.)"0)
   3 f 5
5 4 3 2 1
4 3 2 1  
3 2 1    
2 1      
1        
4 3 2 1  
3 2 1    
2 1      
1        
3 2 1    
2 1      
1        
2 1      
1        
1

Пояснення

a:":@>@-.~&,0<@-."1~0&(](-i.)"0)  Input: k on LHS, n on RHS
                    0&(        )  Repeat k times on initial value n
                        (   )"0   For each value x
                          i.        Make the range [0, x)
                         -          Subtract x from each to make the range [x, 1]
                       ]            Return the array of ranges
            0  -."1~              Remove the zeros from each row
             <@                   Box each row
          &,                      Flatten the array of boxes
a:     -.~                        Remove the empty boxes
     >@                           Unbox each
  ":@                             Convert it into a string and return

Ви повинні мати можливість використовувати мій підхід .
Adám

@ Adám Спасибі, я спробую це
милі

2

Діалог APL , 18 байт

Підказки для n , то для k .

~∘'0'1⍕(⌽⍳)⍤0⍣⎕⊢⎕

~∘'0'⍤1видалити ( ~) нулі ( '0') з рядків ()⍤1 ) (оббивка пробілами за потребою) з

представлення характеру

(⌽⍳)⍤0⍣⎕зворотний ( ) рахується до ( ) кожного скалярного ( ⍤0), повторного ( ) вхідного ( ) разів

на

числовий вхід

СпробуйтеAPAP онлайн!


2

C 93 байт

Ітеративна реалізація.

m,i,j;f(n,k){for(;m<k+2;m++)for(j=0;j<n;j++){for(i=m;i<n-j;i++)printf("%d",n-j-i);puts("");}}

C 67 65 61 56 52 байт

Рекурсивна реалізація

f(n,k){n*k?f(n,k-1)+f(n-1,k):puts("987654321"+9-n);}

Ви не можете оголосити рядки без використання char *, тому ваша рекурсивна реалізація не компілюється. Але рішення дуже легко і економить 4 байти: просто замініть mвсередині puts()дзвінка на "987654321".
Г. Сліпен

Я склав за допомогою gcc (GCC) 3.4.4 (cygming special, gdc 0,12, використовуючи dmd 0,125). Я думаю, що це нормально, оскільки я просто перетворюю з char * в int, однак, оскільки ваше рішення на 4 байти менше, мені це подобається краще. Спасибі
cleblanc

1

Пакетна, 117 байт

@setlocal
@set/an=%1-1,k=%2-1,p=n*k,s=987654321
@if %p%==0 (call echo %%s:~-%1%%)else call %0 %1 %k%&call %0 %n% %2

Порт Денніса ♦ відповідь Python.


1

Рубін, 56 байт

f=->n,k{n>1&&k>1?[f[n,k-1],f[n-1,k]]:[*1..n].reverse*""}

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

Коли відображаються будь-які рішення, ви повинні використовувати "Ядро # ставить".

Приклад:

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