Вихідні діагональні позиції у мене в квадрат


18

Задавши число n, виведіть упорядкований список 1-бальних індексів, що падають на будь-яку з діагоналей n*nквадратної матриці.

Приклад:

Для введення 3:

Площа повинна бути:

1 2 3
4 5 6
7 8 9

Тепер ми вибираємо всі показники , представлені \, /або X( #або НЕ діагональні позиції відкидаються)

\ # /
# X #
/ # \

Вихід повинен бути:

[1,3,5,7,9]

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

1=>[1]
2=>[1,2,3,4]
3=>[1,3,5,7,9]
4=>[1,4,6,7,10,11,13,16]
5=>[1,5,7,9,13,17,19,21,25]

Прийнятої відповіді не буде. Я хочу знати найкоротший код для кожної мови.


1
Питання задає (1-індексований) індекси символів \, / та X на зображеннях. Питання само по собі, але не вистачає пояснень.
Арфі

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

Я проголосував за повторне відкриття, хоча ви також можете перенести зображення ascii з області прикладів, щоб уникнути плутанини. Спочатку я не був упевнений, чи повинен я їх також створити (але я розумію, що потрібний вихід - це лише список індексів)
Arfie

7
Чи має значення замовлення?
Містер Xcoder

9
FWIW Я думаю, що замовлення не має значення може зробити для більш цікавих гольфів ...
Джонатан Аллан

Відповіді:



7

JavaScript (ES6), 48 байт

Виводить список цілих чисел, розділених тире, як рядок.

f=(n,k=n*n)=>--k?f(n,k)+(k%~-n&&k%-~n?'':~k):'1'

Відформатовано та прокоментовано

f = (n, k = n * n) => // given n and starting with k = n²
  --k ?               // decrement k; if it does not equal zero:
    f(n, k) + (       //   return the result of a recursive call followed by:
      k % ~-n &&      //     if both k % (n - 1) and
      k % -~n ?       //             k % (n + 1) are non-zero:
        ''            //       an empty string
      :               //     else:
        ~k            //       -(k + 1) (instantly coerced to a string)
    )                 //   end of iteration
  :                   // else:
    '1'               //   return '1' and stop recursion

Тестові справи


Гарний спосіб вирішення питань, використовуючи знаки як роздільники. Чи можете ви використовувати bitwsie, &щоб зберегти байт?
Shaggy

@Shaggy Ні, це не працює. Наприклад: 4%3і 4%5не мають спільного 1-біта, але обидва є не нульовими.
Арнольд

Так, просто перевірив це n=5і помітив, що це не буде працювати.
Shaggy

k%~-n&&k%-~nповинні працювати. приємний трюк з роздільником!
Тит

@Titus Не те, що це дійсно важливо, коли мова йде про гольф, але ... так, це може бути трохи читабельніше. :-) (оновлено)
Арнольд

7

R , 38 35 34 38 байт

3 байти зберегли, коли я згадав про існування whichфункції ..., 1 байт збережено завдяки @Rift

d=diag(n<-scan());which(d|d[n:1,])

+4 байти для аргументу, ec=Tколи викликається повною програмоюsource()

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

Пояснення:

n<-scan()            # take input
d=diag(n);           # create an identity matrix (ones on diagonal, zeros elsewhere)
d|d[n:1,]            # coerce d to logical and combine (OR) with a flipped version
which([d|d[n:1,]])   # Find indices for T values in the logical expression above

1
-1 байтd=diag(n<-scan());which(d|d[n:1,])
Ріфт

Якщо запускати це як повну програму ( source), це нічого не друкує. Ви повинні зателефонувати cat. Дивіться цю публікацію на мета .
JAD

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

Хоча я не планую повертатися назад і редагувати всі свої старі відповіді, щоб виправити це!
користувач2390246

Це трохи розпливчасто, оскільки консольне середовище R та фрагменти коду є основним способом його використання. Не соромтеся ділитися думками про цю мета-нитку, яку я пов’язав. Він не отримав такого великого вкладу.
JAD

6

Желе , 8 байт

⁼þ`+Ṛ$ẎT

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

У своїй відповіді MATL використовується алгоритм Луїса Мендо.


Гм, я дуже здивований, що ти цього не використовував ŒD.
Містер Xcoder

@ Mr.Xcoder ŒDробить щось зовсім інше, ніж X певного розміру.
Ерік Аутгольфер

5

Октава , 41 37 байт

До речі, це працює і в MATLAB. Немає підлогових функцій Octave :)

@(x)unique([x:x-1:x^2-1;1:x+1:x*x+1])

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

Пояснення:

Замість того, щоб створити квадратну матрицю і знайти дві діагоналі, я зрозумів, що я краще обчислити діагоналі безпосередньо. Це було на 17 байт коротше! =)

@(x)                                   % Anonymous function that takes 'x' as input
    unique(...                   ...)  % unique gives the unique elements, sorted
           [x:x-1:x^2-1                % The anti-diagonal (is that the correct word?)
                       ;               % New row
                        1:x+1:x*x+1])  % The regular diagonal

Ось як це виглядає, без unique:

ans =    
    6   11   16   21   26   31
    1    8   15   22   29   36

Так, я, мабуть, мав би перевернути порядок діагоналей, щоб зробити його більш прихильним для людини.


5

MATL , 6 байт

XytP+f

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

Пояснення

Той самий підхід, як і моя відповідь Октави.

Розглянемо вклад 3як приклад.

Xy   % Implicit input. Identity matrix of that size
     % STACK: [1 0 0;
               0 1 0;
               0 0 1]
t    % Duplicate
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [1 0 0
               0 1 0
               0 0 1]
P    % Flip vertically
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [0 0 1
               0 1 0
               1 0 0]
+    % Add
     % STACK: [1 0 1
               0 2 0
               1 0 1]
f    % Linear indices of nonzero entries. Implicit display  
     % STACK:[1; 3; 5; 7; 9]

Лінійна індексація основна на стовпцях , заснована на 1. Для отримання додаткової інформації дивіться фрагмент довжини-12 тут .


Що повинно означати "перенесення"?
Ерік Аутгольфер

@EriktheOutgolfer Вибачте, моє погано. tдублікат, не транспонирование. Також я додав відпрацьований приклад
Луїс Мендо

Дивовижний! Для цього знадобиться дві петлі, якщо я хочу це зробити.
mr5

@LuisMendo Я підозрював це, оскільки перенесення матриці ідентичності не має сенсу ... хм, мені вдалося зберегти байт за допомогою вашого алгоритму.
Ерік Аутгольфер


4

Октава, 68 54 байти

Дякуємо @Stewie Griffin за збереження 14 байт!

@(x)unique([diag(m=reshape(1:x^2,x,x)),diag(flip(m))])

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

MATLAB, 68 байт

x=input('');m=reshape([1:x*x],x,x);unique([diag(m) diag(flipud(m))])

Пояснення:

@(x)                               % Anonymous function
m=reshape([1:x*x],x,x);            % Create a vector from 1 to x^2 and
                                   % reshape it into an x*x matrix.
diag(m)                            % Find the values on the diagonal.
diag(flip(m))                      % Flip the matrix upside down and
                                   % find the values on the diagonal.
unique([])                         % Place the values from both diagonals
                                   % into a vector and remove duplicates.

@LuisMendo Спасибі, Джимі - мій улюблений.
Steadybox

4

Математика, 42 байти

Union@Flatten@Table[{i,#+1-i}+i#-#,{i,#}]&

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

@KellyLowder переграв його до ..

Математика, 37 байт

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&

і @alephalpha викинув стіл!

Математика, 34 байти

Union@@Range[{1,#},#^2,{#+1,#-1}]&

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&на 5 байт коротше
Келлі Лоудер

Union@@Range[{1,#},#^2,{#+1,#-1}]&
алефальфа




2

C # (.NET Core) , 97 83 байт

f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}

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

Зміна тут ґрунтується на зрушенні між числами для пошуку. Дві зміни, що починаються з 0, є, n-1і n+1, якщо б n=5, числа для n-1були б 0,4,8,12,16,20і n+1були 0,6,12,18,24. Поєднання цих даних та надання 1-індексації (замість 0-індексації) дає 1,5,7,9,13,17,19,21,25. Зсув від nдосягається за допомогою бітового заперечення (побітової операції доповнення), де ~-n==n-1і-~n==n+1 .

Стара версія

f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}

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

Цей підхід використовує індекси стовпців та рядків для визначення, чи є числа на діагоналях. i/nдає індекс рядка таi%n дає індекс стовпців.

Повернення лише масив чисел

Якщо побудова лише масиву чисел вважається таким, що зараховується до вартості байтів, тоді можна зробити наступне, виходячи із пропозиції Dennis.Verweij ( using System.Linq;додає додаткові 18 байт):

C # (.NET Core) , 66 + 18 = 84 байти

x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()

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


ви можете зменшити код, позбувшись зайвих &. Додаткова інформація &є лише для того, щоб зірвати порівняння, якщо перший ввід неправдивий MSDN
Dennis.Verweij,

насправді ви можете мати 92 байти, використовуючи Linq. Спробуйте в Інтернеті!
Dennis.Verweij

@ Dennis.Verweij Охайний, я не був впевнений, скільки я можу перейти до заголовка або колонтитулу в TIO. Я зіграю зі своїм.
Ayb4btu

Ви повинні пам’ятати, що потрібно включити 18 байт для посилання на linq (використовуючи System.Linq;), що шкода, але як це працює: S
Dennis.Verweij

Добренько. Але це не потрібно using System;? (Я припускаю, що упаковка його namespace System.Linqнедійсна?)
Ayb4btu

2

Javascript, 73 63 байт

стара версія

n=>[...Array(y=n*n).keys(),y].filter(x=>(--x/n|0)==x%n||(x/n|0)==n-x%n-1)

Збережено 10 байт завдяки @Shaggy

n=>[...Array(n*n)].map((_,y)=>y+1).filter(x=>!(--x%-~n&&x%~-n))

Перший раз гольф! ось сподіваюся, що я не зіпсувався надто погано.


Ласкаво просимо до PPCG :) Подібне рішення до того, над яким я працював (лише мій 0-індексований). Можливо, ви зможете зберегти деякі байти, скориставшись у своїй filterфункції таким чином: !(--x%(n+1)&&x%(n-1))і створивши такий масив так:[...Array(n*n+1).keys()]
Shaggy

@Shaggy Дякую! Я спробую вдосконалити відповідь з вашою пропозицією, як тільки повернусь з роботи додому!
Марко Лепоре

Ласкаво просимо. До речі: " це трохи коротше, ніж створити [1...n*n]діапазон за допомогоюArray(n*n).fill().map((x,i)=>i+1) " - [...Array(n*n)].map((_,y)=>y+1)це коротший спосіб зробити це для подальшої довідки.
Shaggy

Зробив трохи більше і закінчив це на 56 байт:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy

@Shaggy Я спробував вашу останню версію, але вона дала б додатковий нуль для f (1) і f (2), вона працює з діапазоном [1 ... n * n], хоча я використовував те, як ви показали мені в попередній коментар. А може, я заплутався якось?
Марко Лепоре




1

Japt , 16 байт

Не можу здатися, що це краще, ніж це, але я впевнений, що це можливо. Довелося пожертвувати 2 байтами за непотрібну вимогу, що ми використовуємо 1-індексацію.

²õ f@´XvUÉ ªXvUÄ

Перевірте це



0

PHP, 56 54 + 1 байт

+1 байт для -Rпрапора

for(;$z**.5<$n=$argn;$z++)$z%-~$n&&$z%~-$n||print~+$z;

друкує номери, попередньо подані тире. Запустіть як трубу -nRабо спробуйте в Інтернеті .

для **оператора потрібен PHP 5.6 або пізнішої версії .
Додайте один байт для старого PHP: Замініть ;$z**.5<$n=$argnна $z=$argn;$z<$n*$n.


0

Рубін, 45 байт

->n{(n*n).times{|i|i%-~n>0&&i%~-n>0||p(i+1)}}

Працює внутрішньо як нульове індексування. перевіряє, чи є iмодуль n+1або n-10, якщо так - друкується i+1.

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