Una danza di molte dimensioni


19

Sfida

Data una nmatrice tridimensionale di numeri interi e una permutazione dei primi nnumeri naturali, permuta le dimensioni della matrice di conseguenza.

Dettagli

Questa sfida è ispirata ai MATLAB permute. dimostrazione La permutazione è data come un elenco di numeri interi, ad esempio [1,3,2]significa che 1 viene mappato su 1, 2 viene mappato su 3 e 3 viene mappato su 2 (qui la ivoce è il valore su cui iviene mappata). Ma puoi usare altri formati che sono convenienti, ad esempio come cicli o come funzione. Se è più conveniente, puoi anche utilizzare l'indicizzazione basata su 0.

Si può presumere che l'array sia un array "rettangolare" m1 x m2 x ... x mncompleto (cioè si può presumere che non sia irregolare / frastagliato ).

Si può presumere che nnon sia troppo grande, poiché molte lingue hanno un limite del numero di dimensioni in un array nidificato.

Se la tua lingua non supporta array multidimensionali, puoi anche prendere una stringa che rappresenta l'array come input.

Esempi

  • Qualsiasi narray tridimensionale con permutazione dell'identità [1,2,3,...,n]rimarrà invariato.
  • L'array [[10,20,30],[40,50,60]]con la permutazione [2,1]viene mappato su [[10,40],[20,50],[30,60]].
  • L'array [[[1,2],[3,4]],[[5,6],[7,8]]]con la permutazione [2,3,1]viene mappato su [[[1,3],[5,7]],[[2,4],[6,8]]].

Risposte:



9

Haskell , 168 byte

pè una funzione (tipo classe polimorfica) che prende una permutazione come un elenco di Ints, e un elenco nidificato che rappresenta un array multidimensionale di Ints.

Chiama come p [2,1] [[10,20,30],[40,50,60]], tuttavia se il default del tipo non riesce, potrebbe essere necessario aggiungere un'annotazione del tipo come :: [[Int]](nidificato in modo appropriato) fornendo il tipo di risultato.

import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]

Provalo online!

Le sfide del golf con matrici annidate di profondità arbitraria sono un po 'imbarazzanti in Haskell, perché la tipizzazione statica tende a intralciarsi. Mentre gli elenchi di Haskell (con la stessa sintassi esatta nella descrizione della sfida) possono essere nidificati bene, gli elenchi con diverse profondità di annidamento sono di tipo incompatibile. Inoltre, le funzioni standard di analisi di Haskell richiedono la conoscenza del tipo di valore che si sta tentando di analizzare.

Di conseguenza, sembra inevitabile che il programma debba includere dichiarazioni relative al tipo, che sono relativamente dettagliate. Per la parte golfizzata, ho deciso di definire una classe di tipo P, tale da ppoter essere polimorfica rispetto al tipo di array.

Nel frattempo, il cablaggio di test del TIO mostra un modo per aggirare il problema di analisi.

Come funziona

  • Riassumendo l'essenza di questo algoritmo: esegue un ordinamento a bolle nell'elenco delle permutazioni, trasponendo le dimensioni vicine quando vengono scambiati gli indici di permutazione corrispondenti.

  • Come indicato dalla class P adichiarazione, in ogni caso, paccetta due argomenti, una permutazione (sempre di tipo [Int]) e una matrice.

  • La permutazione può essere data nella forma nella descrizione della sfida, sebbene il modo in cui l'algoritmo funziona, la scelta degli indici è arbitraria, ad eccezione del loro ordine relativo. (Quindi funzionano sia a 0 che a 1).
  • La base instance P Intgestisce le matrici della dimensione 1, che pritorna semplicemente invariata, poiché l'unica dimensione può essere mappata solo su se stessa.
  • L'altro instance P a => P [a]è definito in modo ricorsivo, chiamando pcon dimensione n subarrays per definirlo per matrici dimensione n + 1 .
    • p(x:r)mprima chiama in p rmodo ricorsivo su ogni elemento di m, dando un array di risultati nin cui tutte le dimensioni tranne la prima sono state permutate correttamente l'una rispetto all'altra.
    • La permutazione rimanente su cui deve essere eseguita nè data da x:y:z = x:sort r.
    • In x<ytal caso, la prima dimensione di nè già posizionata correttamente e nviene semplicemente restituita.
    • Se x>y, allora la prima e la seconda dimensione ndevono essere scambiate, il che viene fatto con la transposefunzione. Infine, p(x:z)viene applicato in modo ricorsivo a ogni elemento del risultato, assicurando che la prima dimensione originale venga trasposta nella posizione corretta.

3

Python 2 , 312 byte

Questo utilizza l'indicizzazione 0 per la permutazione

from numpy import*
from itertools import*
z=range
def f(i,r):
	l=array(i).shape;R={b:a for a,b in enumerate(r)};r=len(r);m=eval('['*r+'0'+q('for k in z(l[R[%s]])]',r-1,-1,-1))
	for d in product(*[z(p) for p in l]):exec'm'+q('[d[R[%s]]]',r)+'=i'+q('[d[%s]]',r)
	return m
q=lambda s,*j:''.join(s%(j)for j in z(*j))

Provalo online!

-2 byte grazie a @Jonathan Frech.


Non hai bisogno di parentesi per chiamare exec (salvare due byte) , in quanto è una dichiarazione in Python 2.
Jonathan Frech,

C'è anche uno spazio superfluo in z(p) for.
Jonathan Frech,

1
Utilizzato map(z,l), s%je printper 301 byte - Provalo in rete!
Mr. Xcoder,

3

Python 2 , 41 25 byte

import numpy
numpy.einsum

Provalo online!

Il vettore di permutazione pè dato come una stringa di lettere. Quindi [2,3,1]può essere dato come 'bca'.

Grazie a @EriktheOutgolfer ha salvato 16 byte!


Questo supporta più di 26 dimensioni?
Erik the Outgolfer,

In realtà non più di 52 dimensioni: maiuscolo + minuscolo.
rahnema1,

2

JavaScript (ES6), 136 132 byte

(a,p,v=[],r=[],g=(a,[d,...p],_,h=(r,[i,...v])=>1/v[0]?h(r[i]=r[i]||[],v):r[i]=a)=>1/d?a.map((e,i)=>g(e,p,v[d]=i)):h(r,v))=>g(a,p)&&r

0-indicizzati. Spiegazione: gricorre in modo ricorsivo sull'array acreando un array vdi indici riordinati usando la permutazione p. Una volta pesaurito, hinserisce ricorsivamente l'elemento nella matrice dei risultati rutilizzando gli indici permutati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.