เอาท์พุทตำแหน่งแนวทแยงของฉันกำลังสอง


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 ในภาพ ไม่ใช่คำถามที่ไม่ดีต่อ se แต่ขาดคำอธิบาย
Arfie

หากคุณยินดีที่จะให้คำอธิบายสั้น ๆ และชัดเจนเกี่ยวกับสิ่งที่คุณต้องการเราอาจจะเปิดใหม่อีกครั้งเนื่องจากไม่ใช่ความท้าทายที่ไม่ดี ณ ตอนนี้มันไม่ชัดเจนมาก
Mr. Xcoder

ฉันโหวตให้เปิดใหม่อีกครั้งแม้ว่าคุณอาจต้องการย้ายภาพ ASCII ออกจากพื้นที่ตัวอย่างเพื่อหลีกเลี่ยงความสับสน ตอนแรกฉันไม่แน่ใจว่าฉันต้องผลิตสิ่งเหล่านี้ด้วยหรือเปล่า (แต่ฉันเข้าใจว่าผลลัพธ์ที่ต้องการเป็นเพียงดัชนีเท่านั้น)
Arfie

7
การสั่งซื้อมีความสำคัญหรือไม่
Mr. Xcoder

9
FWIW ฉันคิดว่าการมีคำสั่งไม่เกี่ยวข้องอาจทำให้สนามกอล์ฟน่าสนใจยิ่งขึ้น ...
Jonathan Allan

คำตอบ:



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 &เพื่อบันทึก byte ได้ไหม?
ขนดก

@Shaggy ไม่นั่นไม่ได้ผล ตัวอย่างเช่น: 4%3และ4%5ไม่มี 1 บิตที่เหมือนกัน แต่ทั้งคู่ไม่ใช่ศูนย์
Arnauld

ใช่เพิ่งทดสอบn=5และพบว่ามันใช้งานไม่ได้
Shaggy

k%~-n&&k%-~nควรทำงาน. เคล็ดลับดีกับตัวคั่น!
ติตัส

@Titus ไม่ว่ามันจะมีความสำคัญจริงๆเมื่อพูดถึงการเล่นกอล์ฟ แต่ ... ใช่แล้วมันอาจจะอ่านง่ายขึ้นเล็กน้อย :-) (อัปเดต)
Arnauld

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 เสมอไม่เคยพิจารณาข้อกำหนดของการเป็น "โปรแกรมเต็มรูปแบบ" จริงๆ
user2390246

แม้ว่าฉันจะไม่ได้วางแผนที่จะกลับไปแก้ไขคำตอบเก่า ๆ ทั้งหมดเพื่อแก้ไขปัญหานี้!
user2390246

มันค่อนข้างคลุมเครือเนื่องจากสภาพแวดล้อมคอนโซลของ R และโค้ดเป็นวิธีหลักในการใช้งาน อย่าลังเลที่จะแบ่งปันข้อมูลเชิงลึกในเมตาดาต้าที่ฉันเชื่อมโยงไว้ มันไม่ได้รับการป้อนข้อมูลจำนวนมากทั้งหมด
JAD

6

เยลลี่ขนาด 8 ไบต์

⁼þ`+Ṛ$ẎT

ลองออนไลน์!

ใช้อัลกอริทึมของ Luis Mendo บนคำตอบ MATL ของเขา


Mhm ŒDผมประหลาดใจมากที่คุณไม่ได้ใช้
Mr. Xcoder

@ Mr.Xcoder ŒDทำบางสิ่งที่แตกต่างอย่างสิ้นเชิงจาก X ในขนาดที่ระบุ
Erik the Outgolfer

5

คู่ , 41 37 ไบต์

วิธีนี้ใช้ได้ใน MATLAB ด้วยเช่นกัน ไม่มีฟังก์ชั่นเฉพาะส่อเสียด :)

@(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 snippet ที่นี่


"transpose" หมายถึงอะไร
Erik the Outgolfer

@EriktheOutgolfer ขออภัยฉันไม่ดี tซ้ำซ้อนไม่ไขว้กัน นอกจากนี้ฉันได้เพิ่มตัวอย่างผลงาน
Luis Mendo

! ที่น่าตื่นตาตื่นใจ ฉันต้องใช้สองลูปถ้าฉันต้องการทำสิ่งนี้ให้สำเร็จ
mr5

@ LuisMendo ฉันสงสัยเช่นนั้นเพราะการเปลี่ยนเมทริกซ์เอกลักษณ์ไม่สมเหตุสมผล ... อืมฉันจัดการเพื่อบันทึกไบต์ด้วยอัลกอริทึมของคุณ
Erik the Outgolfer


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 ขอบคุณ Jimi คนโปรดของฉัน
Steadybox

4

Mathematica ขนาด 42 ไบต์

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

ลองออนไลน์!

@KellyLowder ส่งมันถึง ..

Mathematica ขนาด 37 ไบต์

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

และ @alephalpha โยนโต๊ะออกไป!

Mathematica, 34 ไบต์

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

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&สั้นลง 5 ไบต์
Kelly Lowder

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




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-indexing (แทนที่จะเป็น 0-indexing) จะ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 ขอบคุณ! ฉันจะพยายามปรับปรุงคำตอบด้วยคำแนะนำของคุณทันทีที่ฉันกลับถึงบ้านจากที่ทำงาน!
Marco Lepore

ไม่เป็นไร โดยวิธีการ: " มันสั้นกว่าการสร้าง[1...n*n]ช่วงด้วยArray(n*n).fill().map((x,i)=>i+1) " - [...Array(n*n)].map((_,y)=>y+1)เป็นวิธีที่สั้นกว่าสำหรับการอ้างอิงในอนาคต
ขนดก

ทำมันเพิ่มอีกนิดและจบลงด้วยสิ่งนี้สำหรับ 56 ไบต์:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy

@Shaggy ฉันลองรุ่นล่าสุดของคุณแล้ว แต่มันจะให้ผลลัพธ์เป็นศูนย์พิเศษสำหรับ f (1) และ f (2) มันใช้งานได้กับช่วง [1 ... n * n] แต่ฉันก็เลยใช้วิธีที่คุณแสดงให้ฉันเห็นใน ความคิดเห็นก่อนหน้า หรือบางทีฉันก็สับสนไปบ้าง
Marco Lepore


1

Perl 5 , 56 + 1 (-n) = 57 ไบต์

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

ลองออนไลน์!


ไม่ควร `-n 'เป็น +3?
sergiol

1
perl -eเลขที่บรรทัดคำสั่งสันนิษฐานว่าเป็น perl -neบรรทัดคำสั่งเช่นนี้จะเป็น นั่นคือความแตกต่างของ +1
Xcali


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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.