Karenin çıkış köşe pozisyonlarım


18

Bir sayı verildiğinde n, bir n*nkare matrisin köşegenlerinden herhangi birine düşen 1 tabanlı indekslerin sıralı bir listesini verin .

Misal:

Aşağıdakilerin girişi için 3:

Kare:

1 2 3
4 5 6
7 8 9

Şimdi tarafından temsil edilen tüm indeksleri seçmek \, /ya da X( #ya da olmayan diyagonal pozisyonları reddedilir)

\ # /
# X #
/ # \

Çıktı:

[1,3,5,7,9]

Test senaryoları:

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]

Kabul edilmiş bir cevap olmayacak. Her dil için en kısa kodu bilmek istiyorum.


1
Soru, görüntülerdeki \, / ve X karakterlerinin (1 dizinli) indekslerini sormaktır. Kendi başına kötü bir soru değil, ama açıklama eksik.
— Arfie

İstediğinizin kısa ve net bir açıklamasını yapmak istiyorsanız, kötü bir meydan okuma olmadığı için muhtemelen tekrar açacağız. Şu an itibariyle, bu çok açık değil
— Bay Xcoder

Yeniden açmaya oy verdim, ancak karışıklığı önlemek için ascii görüntülerini örnekler alanından çıkarmak isteyebilirsiniz. İlk başta bunları da
— üretmem

7
Sipariş önemli mi?
— Bay Xcoder

9
FWIW Siparişin alakasız olduğunu düşünüyorum daha ilginç golfler için yapabilir ...
— Jonathan Allan

Yanıtlar:



7

JavaScript (ES6), 48 bayt

Dize olarak tire ile ayrılmış tam sayıların bir listesini çıkarır.

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

Biçimlendirilmiş ve yorumlanmış

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

Test senaryoları


İşaretler ayırıcılar olarak kullanarak güzel bir çözüm. &Bir bayt kaydetmek için bitwsie kullanabilir misiniz ?
— Shaggy

@Shaggy Hayır, bu işe yaramaz. Örneğin: 4%3ve 4%5ortak 1 bitleri yoktur, ancak her ikisi de sıfırdan farklıdır.
— Arnauld

Yup, sadece test etti n=5ve işe yaramayacağını fark etti.
— Shaggy

k%~-n&&k%-~nçalışmalı. ayırıcı ile güzel hile!
— Titus

@Titus Golf söz konusu olduğunda gerçekten önemli değil ama ... evet, bu biraz daha okunabilir olabilir . :-) (güncellendi)
— Arnauld

7

R , 38 35 34 38 bayt

whichİşlevin varlığını hatırladığımda 3 bayt kaydedildi ..., @Rift sayesinde 1 bayt kaydedildi

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

ec=TTarafından tam bir program olarak çağrıldığında argüman için +4 baytsource()

Çevrimiçi deneyin!

Açıklama:

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 byted=diag(n<-scan());which(d|d[n:1,])
— Rift,

Bunu tam bir program ( source) olarak çalıştırdığınızda hiçbir şey yazdırılmaz. Aramalısın cat. Bu yazıya meta bakın .
— JAD

@JarkoDubbeldam Yeterince adil! Her zaman TIO için geçerli çıktı sağlayarak çalıştım, hiçbir zaman "tam bir program" olma gerekliliklerini gerçekten dikkate almadım.
— user2390246

Geri dönmek ve tüm eski cevaplarımı düzeltmek için planlama yapmama rağmen!
— user2390246

R ve kod snippet'lerinin konsol ortamı onu kullanmanın ana yolu olduğu için biraz belirsizdir. Bağladığım meta iş parçacığıyla ilgili görüşlerinizi paylaşmaktan çekinmeyin. O kadar fazla girdi almadı.
— JAD


5

Oktav , 41 37 bayt

Bu arada MATLAB'de de çalışıyor. Sinsi Octave'e özgü işlevsellik yok :)

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

Çevrimiçi deneyin!

Açıklama:

Bir kare matris oluşturmak ve iki köşegen bulmak yerine, köşegenleri doğrudan hesaplamayı tercih ettim. Bu 17 bayt daha kısaydı! =)

@(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

Olmadan şöyle görünür unique:

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

Evet, muhtemelen daha insan dostu hale getirmek için köşegenlerin sırasını tersine çevirmeliydim.


5

MATL , 6 bayt

XytP+f

Çevrimiçi deneyin!

açıklama

Oktav cevabımla aynı yaklaşım.

Girişi 3örnek olarak ele alalım.

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]

Doğrusal indeksleme kolon-major , 1-tabanlıdır. Daha fazla bilgi için uzunluk-12 pasajı bkz burada .


"Devrik" ne anlama geliyor?
— Outgolfer Erik

@EriktheOutgolfer Üzgünüm, benim hatam. tdevrik değil, yineleniyor. Ayrıca, çalışılmış bir örnek ekledim
— Luis Mendo

İnanılmaz! Bunu başarmak istersem iki döngüyü alır.
— mr5

@LuisMendo Bundan şüpheliyim, çünkü bir kimlik matrisi aktarmanın bir anlamı yok ... hmm, algoritmanızla bir bayt kaydetmeyi başardım.
— Outgolfer Erik


4

Oktav, 68 54 bayt

14 bayt kazandığı için @Stewie Griffin'e teşekkürler!

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

Çevrimiçi deneyin!

MATLAB, 68 bayt

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

Açıklama:

@(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 Teşekkürler, Jimi benim favorim.
— Steadybox

4

Mathematica, 42 bayt

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

Çevrimiçi deneyin!

@KellyLowder aşağı golf ..

Mathematica, 37 bayt

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

ve @alephalpha masayı fırlattı!

Mathematica, 34 bayt

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

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&5 byte daha kısa
— Kelly Lowder

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




2

C # (.NET Core) , 97 83 bayt

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

Çevrimiçi deneyin!

Buradaki değişiklik, bulunacak sayılar arasındaki geçişe dayanmaktadır. 0'dan başlayarak iki vardiya vardır n-1ve n+1eğer öyleyse, n=5için numaralar n-1olacağını 0,4,8,12,16,20ve için n+1olurdu 0,6,12,18,24. Bunları birleştirip 1-indeksleme (0-indeksleme yerine) verir 1,5,7,9,13,17,19,21,25. Uzaklık, nbitsel negatifleme (bitsel tamamlayıcı işlemi) kullanılarak elde edilir, burada ~-n==n-1ve-~n==n+1 .

Eski versiyon

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}]";}

Çevrimiçi deneyin!

Bu yaklaşım, sayıların köşegenler üzerinde olup olmadığını belirlemek için sütun ve satır indekslerini kullanır. i/nsatır dizinini verir vei%n sütun dizinini verir.

Yalnızca Sayı Dizisini Döndürme

Yalnızca sayı dizisini oluşturmanın bayt maliyetine sayıldığı kabul edilirse, Dennis.Verweij'in önerisine dayanarak aşağıdakiler yapılabilir ( using System.Linq;fazladan 18 bayt ekler):

C # (.NET Core) , 66 + 18 = 84 bayt

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

Çevrimiçi deneyin!


fazladan kurtularak kodu azaltabilirsiniz &. Ekstra &, sadece ilk giriş yanlışsa karşılaştırmayı kırmak için var MSDN
— Dennis.Verweij

aslında Linq kullanarak 92 bayt olabilir Online deneyin!
— Dennis.Verweij

@ Dennis.Verweij Düzgün, TIO'daki üstbilgi veya altbilgiye ne kadar geçiş yapabileceğimden emin değildim. Benimle bir oyun oynayacağım.
— Ayb4btu

talihsiz bir linq (System.Linq; kullanarak) referansı için 18 bayt eklemeyi unutmayın, ancak nasıl çalışır: S
— Dennis.Verweij

Ah tamam. Ama bunun için gerekli değil using System;mi? (Ben bir sarma namespace System.Linqgeçerli kabul ediyorum ?)
— Ayb4btu

2

Javascript, 73 63 bayt

eski versiyon

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

@Shaggy sayesinde 10 bayt kaydedildi

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

İlk kez golf! çok fazla berbat etmediğimi umuyorum.


PPCG'ye hoş geldiniz :) Üzerinde çalıştığımla benzer bir çözüm (sadece benimki 0 dizinli). filterFonksiyonunuzda aşağıdakileri kullanarak bazı baytları kaydedebilirsiniz : !(--x%(n+1)&&x%(n-1))ve dizinizi böyle oluşturarak oluşturabilirsiniz:[...Array(n*n+1).keys()]
— Shaggy

@Shaggy Teşekkürler! İşten eve gelir gelmez cevabınızı önerinizle geliştirmeye çalışacağım!
— Marco Lepore

Rica ederim. Bu arada: " bir [1...n*n]aralık oluşturmaktan biraz daha kısaArray(n*n).fill().map((x,i)=>i+1) " - [...Array(n*n)].map((_,y)=>y+1)ileride başvurmak için bunu yapmanın daha kısa bir yoludur.
— Shaggy

Onunla biraz daha yaptım ve 56 bayt için bununla sona erdi:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
— Shaggy

@Shaggy Son sürümünüzü denedim ama f (1) ve f (2) için ekstra bir sıfır çıktı, ancak [1 ... n * n] aralığıyla çalışıyor, bu yüzden bana gösterdiğiniz yolu kullandım önceki yorum. Ya da belki bir yere bulaştım?
— Marco Lepore


1

Perl 5 , 56 + 1 (-n) = 57 bayt

!(($_+1+$_/$,)%$,&&$_%($,+1))&&say++$_ for 0..($,=$_)**2

Çevrimiçi deneyin!


+3 olmamalı mı?
— sergiol

1
Hayır. Varsayılan komut satırı perl -e. Bu örnek için komut satırı olacaktır perl -ne. Bu +1 farkı.
— Xcali


1

Japt , 16 bayt

Bundan daha iyisini yapamıyorum ama eminim. 1 endeksleme kullandığımız gereksiz gereklilik için 2 bayt feda etmek zorunda kaldı.

²õ f@´XvUÉ ªXvUÄ

Dene



0

PHP, 56 54 + 1 bayt

-RBayrak için +1 bayt

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

tire işaretli numaraların önüne yazdırır. Pipo ile çalıştırın -nRveya çevrimiçi deneyin .

**operatör için PHP 5.6 veya üstünü gerektirir .
Eski PHP için bir bayt ekleyin: Değiştir ;$z**.5<$n=$argnile $z=$argn;$z<$n*$n.


0

Ruby, 45 bayt

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

Dahili olarak sıfır indeksli olarak çalışır. imodulo n+1veya n-10 olup olmadığını kontrol eder i+1.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.