Esse desafio está relacionado a alguns dos recursos da linguagem MATL, como parte do evento de linguagem do mês de maio de 2018 . Desafio associado: Área de transferência de funções: cópia .
Introdução
A área de transferência de funções do MATL armazena ("copia") as entradas das quatro chamadas mais recentes para funções normais de recebimento de entradas. Funções normais são o tipo mais comum de funções no MATL. Entrada de entrada significa que a função recebe pelo menos uma entrada. O conteúdo da área de transferência armazenada pode ser empurrado para a pilha ("colado").
Esse desafio terá o conteúdo da área de transferência como entrada. Será assumido que todas as funções que produziram esse estado da área de transferência usaram um ou mais números inteiros positivos como entradas. Portanto, o estado da área de transferência pode ser representado por uma lista de listas de números. (Para obter mais informações sobre como a área de transferência é realmente preenchida, consulte o desafio relacionado; mas isso não é necessário para o atual).
Interpretando o conteúdo da área de transferência
Exemplo 1
A primeira lista interna refere-se à chamada de função mais recente , etc. Assim, o estado da área de transferência
[[11, 28], [12, 16], [4], [5, 6]]
indica que a última chamada de função levou duas entradas, ou seja 11
, 28
; o segundo última chamada tomou entradas 12
, 16
; etc. (Este estado da área de transferência é produzido pelo código no primeiro exemplo do desafio relacionado).
Exemplo 2
Se não houver chamadas de função suficientes , algumas listas internas à direita na área de transferência estarão vazias:
[[7, 5], [], [], []]
(Isso é produzido por um programa que simplesmente adiciona 7
e 5
).
Exemplo 3
As chamadas de função podem ter qualquer número de entradas , mas sempre pelo menos 1
(funções que não recebem entradas não alteram o estado da área de transferência). Portanto, o seguinte também é possível.
[[3], [2, 40, 34], [7, 8, 15], []]
Acessando o conteúdo da área de transferência
O conteúdo da área de transferência da função é empurrado para a pilha usando a função MATL M
(que, a propósito, não é uma função normal, mas uma função da área de transferência). Essa função recebe um número inteiro positivo como entrada e empurra parte do conteúdo da área de transferência para a pilha, como segue. Com referência ao estado da área de transferência no exemplo 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
retorna todas as entradas para a chamada de função mais recente. Assim, por exemplo considerado, dá11
,28
.- Da mesma forma,
2M
,3M
e4M
retornar todas as entradas para o segundo, terceiro e chamadas de função quarta mais recentes. Então2M
dá12
,16
;3M
dá4
; e4M
dá5
,6
. - Números além de
4
selecionar entradas individuais para chamadas de função que receberam mais de uma entrada. Então,5M
retorna a última entrada para a chamada mais recente . No nosso caso, isso dá28
.6M
retorna a entrada individual anterior , que é11
.7M
retorna a última entrada da segunda última chamada, ou seja16
, e8M
fornece12
. Agora9M
dá6
. Observe como a entrada4
é ignorada porque foi a única entrada em sua chamada de função. Por fim,10M
dá5
.
Para o estado da área de transferência no exemplo 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
dá3
.2M
dá2
,40
,34
.3M
dá7
,8
,15
.4M
tem um comportamento indefinido (para os fins deste desafio), porque houve apenas três chamadas de função.5M
dá34
.6M
dá40
.7M
dá2
.8M
dá15
.9M
dá8
,10M
dá7
.11M
,12M
... também têm um comportamento indefinido .
O desafio
Entrada :
- o estado da área de transferência, como uma lista de listas ou qualquer outro formato razoável;
- um número inteiro positivo n .
Saída : o resultado da chamada da função M
com n como entrada. A saída será um ou vários números com um separador inequívoco ou em qualquer formato razoável, como uma lista ou matriz.
Esclarecimentos:
- O estado da área de transferência consiste em quatro listas de números. Algumas das listas finais podem estar vazias, como nos exemplos 2 e 3. Se preferir, você pode inserir a área de transferência sem essas listas vazias. Então, o exemplo 3 se tornaria
[[3], [2, 40, 34], [7, 8, 15]]
. - Todos os números na área de transferência serão números inteiros positivos, possivelmente com mais de um dígito.
- O número n é garantido como válido. Portanto, por exemplo 3 acima,
n
não pode ser4
ou11
.
Regras adicionais:
A entrada e a saída podem ser obtidas por qualquer meio razoável .
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas .
O menor código em bytes vence.
Casos de teste
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
fonte
Respostas:
Gelatina , 8 bytes
Experimente online!
fonte
ḊƇ
seleciona todos os não-singletons,U
inverte eẎ
achata. Para entrada que[[11, 28], [12, 16], [4], []]
obtém[16, 12, 28, 11]
, os valores de5M
through8M
. Agora, anexe a entrada original a esta lista⁸;
e indexe-a na lista resultante pela outra entrada⁹ị
.U
não inverte o resultadoḊƇ
, mas sim cada um de seus elementos. Só se eu pudesse de alguma forma reduzirḊƇUẎ⁸;
...Haskell ,
56 5147 bytes-5-9 bytes graças ao Laikoni (correspondência de padrão para garantir comprimento> 1 e usandodo
-notation sobre a compreensão da lista)!Experimente online!
Sem ponto,
5855 bytes-3 bytes graças ao Laikoni (movendo
([]:)
e substituindoid
)!Como alternativa, poderíamos usar esta versão pointfree
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
.fonte
APL (Dyalog Unicode) , 17 bytes
Experimente online!
fonte
JavaScript (Node.js) , 57 bytes
Experimente online!
Esta é uma função anônima com curry. Execute-o com
( function code )(clipboard)(n)
Explicação
fonte
JavaScript (ES6), 72 bytes
Recebe entrada na sintaxe de currying
(clipboard)(n)
.Experimente online!
fonte
Python 2 ,
6056 bytesgraças a Jonathan Allan por -4 bytes.
Experimente online!
fonte
Java 8, 110 bytes
Um lambda (com curry) assumindo o estado da área de transferência como um
int[][]
e o número comoint
e retornandoint
ouint[]
(um único número pode ser retornado por qualquer um dos tipos).Experimente Online
Ungolfed
fonte
05AB1E , 12 bytes
Experimente online!
Explicação
fonte
Casca , 12 bytes
Experimente online!
Explicação
Praticamente uma porta direta da resposta Haskell:
fonte
R , 58 bytes
Experimente online!
Toma
M
como umlist
dos vetoresc()
; portanto, substituir[[
porlist(
,[
porc(
e]
com)
deve transformar os casos de teste em R. casos de teste.Para entradas
n<=4
com "comportamento indefinido", retornosNULL
e para outras entradas inválidas, gera um erro "subscrito fora dos limites".fonte
[n]
vez de[[n]]
.Stax ,
121413 bytesExecute e depure
Explicação:
Stax, 12 bytes
Desembalado:
Este é um bloco, para que eu possa me livrar dele
]|u
, mas não sei se isso é válido, pois está compactando um bloco.fonte
J ,
3322 bytes-11 bytes (1/3 menor), graças à solução da FrownyFrog!
Experimente online!
Minha solução inicial:
J , 33 bytes
Não feliz - tenho certeza de que pode ser jogado muito mais longe.
Explicação:
Uma função diádica, tomando o estado da área de transferência como seu argumento rígido, o argumento da esquerda é
n
<:@[
subtrair 1 do argumento esquerdo{
seleciona oi
th elemento (calculado acima) da lista à direita(...)
a lista inteira#
cópia de]
da lista de estados da área de transferência(1<#)
os sublistas com comprimento maior que 1|.&.>
gire cada sub-lista copiada<"0@;
raze and box - coloca cada número em uma caixa separada,
anexar a nova lista à lista de estados da área de transferência@]
torna o verbo inteiro em (...) monádicoExperimente online!
fonte
0;
mais. Obrigado!Coreutils V + ,
53 45 43 4240 bytes-9 bytes graças a DJMcMayhem (usando
VGÇ /d
mais:,$g/^[^ ]*$/d
,D@"dd
mais"aDÀdd
e!!
mais:.!
)!Minha primeira tentativa de V (dicas bem-vindas!), O código abaixo está usando caracteres circulados (por exemplo,
ⓞ
for\xf
) para facilitar a leitura:Experimente online!
Hexdump
Explicação
A primeira linha contém n e as linhas abaixo contêm as entradas da área de transferência, cada entrada é separada por espaços se houver várias entradas:
fonte
Vermelho , 91 bytes
Experimente online!
fonte
C (gcc) , 176 bytes
Experimente online!
Toma a matriz como uma lista de 4 pares de ponteiros de início / fim e, em seguida, n.
Descrição:
fonte