자기 식별 좌표


27

integer가 주어지면 length의 차원으로 n배열을 구성 하는 프로그램이나 함수를 작성하십시오 . 여기서 각 요소는 자체 좌표의 식별자입니다. 즉, 하나의 배열로 시작하여 각 배열에 더 많은 배열 이 포함 된 배열로 채 웁니다 . 가장 깊은 배열의 요소는 전체 배열의 위치를 ​​나타내는 좌표입니다.nnnnn-1

내 설명이 혼란 스러울 수있는 몇 가지 예.

n = 1

["1"]

n = 2

[
 ["11", "12"],
 ["21", "22"]
]

n = 3

[
  [
    ["111","112","113"],
    ["121","122","123"],
    ["131","132","133"]
  ],
  [
    ["211","212","213"],
    ["221","222","223"],
    ["231","232","233"]
  ],
  [
    ["311","312","313"],
    ["321","322","323"],
    ["331","332","333"]
  ]
]

여기서 "321"은 3 번째 배열의 2 번째 요소 중 1 번째 요소임을 의미합니다.

규칙 :

  • 좌표 및 치수 ( n)는 0 또는 1 색인이 될 수 있습니다
  • n모호한 출력을 방지하기 위해 두 가지 색인 옵션 모두 10 미만의 한 자릿수 라고 가정 할 수 있습니다.
  • IO는 유연합니다.
    • 특히, 좌표는 명확한 한 배열, 문자열 등일 수 있습니다. "321"=> [3,2,1]
    • 선행 10이 있거나없는 10 진의 정수일 수 있습니다.
    • 원하는 경우 좌표가 일관된 한 좌표가 역순 일 수 있습니다. "321"=> "123"
    • 출력이 반드시 언어의 배열 구조 일 필요는 없습니다. 배열의 시작, 배열의 끝 및 요소 분리에 대한 명확한 별개의 마커가있는 한.
    • 에 대한 출력은 n=11이 될 수 있습니다
    • 출력이 비정형 인 경우 형식을 설명하십시오.
  • 이것은 이므로 각 언어에서 가장 짧은 솔루션이 승리합니다!

샌드 박스 (삭제됨)
Jo King

타입 시스템이 불가능하다는 것을 깨닫기 전에 Haskell에서 이것을 작성하는 데 문제가있었습니다.
밀 마법사

@ CatWizard : 예를 들어 항상 새로운 데이터 구조를 정의하여 해결할 수 있습니다. data L a = L [L a] | E a.
ბიმო


1
@ToddSewell 입력에 따라 유형이 다른 함수를 사용할 수 없습니다. 이 기능은 입력 할 수 Int -> [String]또는 Int -> [[String]]입력이 무엇인지에 따라, 등등과
H.PWiz

답변:



10

파이썬 3 , 56 바이트

f=lambda n,*l:len(l)//n*l or[f(n,*l,k)for k in range(n)]

온라인으로 사용해보십시오!

Xcoder는 별표 개봉을 위해 Python 3으로 전환하는 2 바이트를 절약했습니다.


3
Python ≥3.5로 전환하면 f=lambda n,*l:len(l)//n*l or[f(n,*l,k)for k in range(n)]56 바이트 에서 작동합니다.
Mr. Xcoder


6

J , 18 바이트

,"1/^:(]{:)~@,.@i.

온라인으로 사용해보십시오!

반복 솔루션, 내장 직교 제품이 없습니다. 이것이 피크 J의 모습입니다.

                       input                                    2
                i.     range                                 0, 1
             ,.@       reshape each element
                       into a one-dimensional array        [0],[1]   (A)
    ^:(]{:)            (input−1) times...             (1 iteration)
,"1/       ~@             prepend the contents of each 1d array in A    |
                          to every 1d array from the previous iteration,|  
                          assembling the results for each A[n] into     |!CANTEXPLAINTHIS!
                          a larger array                                |
                                                         [ [0,0],       |
                                                           [0,1] ],     |
                                                         [ [1,0],       |
                                                           [1,1] ]      |

처음에 더 높은 바이트 수는 저를
Jonah

6

젤리 , 8 7 바이트

ṗ³s³$³¡

온라인으로 사용해보십시오!

설명

인수 2를 예로 사용하십시오.

ṗ³s³$³¡   
ṗ        Cartesian power with power
 ³       2 (the argument). Autoranges the left arg.
         Yields [[1,1],[1,2],[2,1],[2,2]]
    $³¡  Do 2 times:
  s³     Split into segments of length 2. 
         This last step molds the array of indices into the proper shape.

경우 ¡는 댓구에 대한 반복을 통해 오른쪽 인자의 변화하지 않은 다음이 4 바이트가 될 것입니다 :ṗs³¡


이것은 나에게 완전한 프로그램처럼 보입니다. 에 대한 출력 (STDOUT) 1이 유효합니까?
Outgolfer Erik

@EriktheOutgolfer 1의 출력에 만족합니다.
Jo King

@JoKing 그러나이 경우에는 "어레이의 시작, 배열의 끝을 명확하게 구분하는 마커"가 없습니다. 질문을 편집 하시겠습니까? (많은 답변에 실제로는 포함되어 있지 않습니다)
Outgolfer Erik

5

J, 13 바이트

[:{[;/@$,:@i.

온라인으로 사용해보십시오!

흥미롭게도 APL 답변보다 훨씬 길다 (더 나은 번역을 볼 수 없을 수도 있음)

설명

[: { [ ;/@$ ,:@i.


     [                NB. the argument
            ,:@i.     NB. range 0..arg, considered as one item: ,: is "itemize" 
          $           NB. repeat the right range the left number of times
       ;/@            NB. and then put boxes around them. so, eg, if we had
                      NB. an arg of 3, now we have the list of boxes 
                      NB. [0 1 2][0 1 2][0 1 2]
[: {                  NB. { is "Catalog", it creates the cartesian product
                      NB. in exactly the format we desire.


@FrownyFrog 후크를 피하는 #.inv것은 매우 영리합니다. +1.
cole

@FrownyFrog 이제 "다른 기반으로 계산"솔루션을 살펴 보았으므로 다른 게시물로 추가해야 할만큼 다른 방법이라고 생각합니다. 아주 좋은 해결책입니다.
Jonah

Jonah, @cole 감사합니다
FrownyFrog

5

MATLAB, 92 89 55 바이트

나는 도전의 규칙을 다시 읽은 다른 대답을 가지고 있지만 이전 시도는 다르고 여전히 재미있게 보이므로 아래에 남겨 두겠습니다.

reshape(string(dec2base(0:n^n-1,n+(n<2))),[~(1:n)+n 1])

설명

                        0:n^n-1                        % [0,1,...,n^n-1]
               dec2base(       ,n+(n<2))               % Put into base n (base 2 if n=1)
        string(                         )              % Convert to strings
                                          [~(1:n)+n 1] % Dimension array [n,n,...,n] (length n)
reshape(                                 ,            )% Use dim array to reshape

인덱스가 0 인 n 차원 문자열 배열을 출력합니다.

이전 답변 (89 바이트)

내 첫 골프! 이것은 더 줄어들 수 있지만 내가 가진 것을 게시 할 것이라고 생각했습니다.

x=(1:n)';for d=2:n;y=((1:n)*10^(d-1));o=[];for p=1:nnz(y);o=cat(d,o,(x+y(p)));end;x=o end

설명

x=(1:n)';                       % Create array x=[1,2,...n]'
for d=2:n                       % d for dimension
    y=((1:n)*10^(d-1));         % Creates an array for each d where
                                %   y=[10,20,30,...] for n=2
                                %   y=[100,200,...] for n=3 etc.
    o=[];                       % o for output
    for p=1:nnz(y)              % For each value of y
        o=cat(d,...             % Concatenate in the dth dimension:
            o,...               % - The current output
            x+y(p));            % - The sum of
                                %   - The array from the last dimension
                                %   - The current value in y (e.g. 100)
    end
    x=o                         % Send the output to x for the next loop
end

마지막에 x를 출력하여 솔루션 제공

다른 MATLAB 포스트와 마찬가지로 출력은 숫자를 사용하여 좌표를 표시하는 것을 제외하고 n 차원 배열입니다. MATLAB에서는 루프가 좋지 않기 때문에 모든 값에서 작동하지만 n = 8 부근에서 크게 느려지기 시작합니다.

편집 : Luis Mendo 덕분에 -2 바이트. 또한 출력을 인쇄하기 위해 마지막 세미콜론을 제거했습니다.


4
PPCG에 오신 것을 환영합니다!
얽히고 설킨

나는 당신이 바꿀 수 있다고 생각 length하여 nnz몇 바이트를 저장합니다. 또한 PPCG 규칙에 따라 코드는 일반적으로 STDOUT에 출력하여 (일부 변수에 출력을 저장하는 것만으로는 충분하지 않음) 실제 출력을 생성하거나 출력을 반환하는 함수 여야합니다.
Luis Mendo

5

,201 176 167 166 154 바이트

enum L{S(String),L(Vec<L>)}fn
h(n:u8,d:u8,s:&str)->L{if
d<1{L::S(s.into())}else{L::L((0..n).map(|i|h(n,d-1,&format!("{}{}",s,i))).collect())}}|n|h(n,n,"")

온라인으로 사용해보십시오!

출력 유형은 언어가 엄격하게 입력되므로 두 가지 변형이있는 합계 유형입니다. 그것은 일 수 L이 가산 형 또는 함유리스트 형식 인 S결과 유형 (문자열)이다. 결과는 다음과 같습니다.

L::L([
 L::L([ L::S("00"), L::S("01") ]),
 L::L([ L::S("10"), L::S("11") ]),
])

또한 다음을 사용하여 다시 포맷했습니다 rustfmt.

enum L {
    S(String),
    L(Vec<L>),
}
fn h(n: u8, d: u8, s: &str) -> L {
    if d < 1 {
        L::S(s.into())
    } else {
        L::L(
            (0..n)
                .map(|i| h(n, d - 1, &format!("{}{}", s, i)))
                .collect(),
        )
    }
}
|n| h(n, n, "")

4

R , 102 바이트

function(n,m=array(T,rep(n,n)))`if`(n<2,'1',{m[]=apply(which(m,T)[,`[<-`(1:n,1:2,2:1)],1,toString);m})

온라인으로 사용해보십시오!

  • 1 인덱스, 반전
  • 불행히도 R은 열 단위로 행렬을 저장합니다. 그렇지 않으면 우리는 73 바이트 로 줄어 듭니다.
  • which배열 인덱싱 을 사용하는 @Giuseppe 제안 덕분에 -9 바이트 절약

76 바이트 응답은 73 바이트 일 수 있습니다 . 이미 R 응답이 있는지 확인하기 전에 구현 한 방법입니다. 그래도 접근 방식 중 일부를 변경할 수 있습니까? 확실하지 않습니다.
Giuseppe

1
@Giuseppe :의 배열 색인은 which내가 찾던 것입니다, 감사합니다! 9 바이트 절약
digEmAll

4

자바 10, 144 바이트

해결책은 method f입니다. 배열의 문자열 표현을 생성합니다.

String h(int n,int d,String s){if(d<1)return s;var r="[";for(int i=0;i++<n;)r+=h(n,d-1,s+i)+",";return r+"]";}String f(int n){return h(n,n,"");}

온라인으로 사용해보십시오

언 골프

String h(int n, int d, String s) {
    if (d < 1)
        return s;
    var r = "[";
    for (int i = 0; i++ < n;)
        r += h(n, d - 1, s + i) + ",";
    return r + "]";
}
String f(int n) {
    return h(n, n, "");
}

감사의 말


1
Java 10에서는로 바꿀 수 Object[]있습니다 var. 또한, 나는이 생각하는 else당신이 가지고있는 블록이 필요하지 않습니다 returnif블록.
Konrad Borowski



3

MATLAB, 116 (108) 104 바이트

다차원 행렬에 대한 MATLAB의 선호도를 고려할 때 더 짧은 방법이 있어야한다고 생각합니다.

a=~(1:n)+n;c=cell(1,n);[c{:}]=ind2sub(a,1:n^n);reshape(arrayfun(@(varargin)[varargin{:}],c{:},'un',0),a)

설명

% For using twice, define the array of dimension sizes [n, n, .., n]
a=~(1:n)+n;
% To group variable number of outputs from ind2sub into a cell array
c=cell(1,n);   
% Convert linear indices to self-describing coordinates
[c{:}]=ind2sub(a,1:n^n);     
% reshape to make it the n-dimensional array
% arrayfun to loop over the numerous ind2sub outputs simultaneously
% varargin and {:} usage to account for various numbers of inputs
reshape(arrayfun(@(varargin)[varargin{:}],c{:},'uni',0),a)

출력값은 n 차원 셀형 배열이며 각 요소는 좌표 값의 배열입니다. 요소 형 배열이 RAM에 저장 될 수있는 n한, 숫자 형 배열 출력으로 인해 모호함이없는 경우에도 작동합니다 n^(n+1)!


3

, 26 바이트

Nθ≔EXθθ⪫⪪◧⍘ιθθ ¦0υFθ≔⪪υθυυ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Nθ

입력 n.

≔EXθθ⪫⪪◧⍘ιθθ ¦0υ

모든 nⁿ n자리 숫자를 기본으로 생성하십시오 n.

Fθ≔⪪υθυ

각 차원의 크기를 차원 배열 n로 나누십시오 .nn

υ

배열을 인쇄하십시오. 기본 출력 형식은 각 줄의 각 요소이며, 각 줄 블록은 n빈 줄로 끝나고, 각 줄 n블록은 n두 번째 빈 줄로 끝나며 n-1, 최상위 수준의 빈 줄까지 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.