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.