N crianças, sem duas que compartilhem seu tamanho exato, estão alinhadas em alguma ordem. Cada um só pode comparar alturas com seus vizinhos imediatos. Quando o professor grita "levante a mão se você for o mais alto", ele o fará se for mais alto que os vizinhos e o fará simultaneamente. Se apenas um deles levanta a mão, ele vence. Se mais de uma pessoa levantar a mão, todas elas são eliminadas da linha (preservando a ordem do restante das crianças) e repetem o processo.
Escreva um programa, que utilize uma matriz de números inteiros distintos (você pode assumir que eles são estritamente positivos) e produza o vencedor deste jogo. Isso é código-golfe, então o código mais curto vence.
Exemplos (com estágios intermediários mostrados):
5 3 9 8 7 → 3 8 7 → 8
1 2 9 4 → 9
9 3 8 7 4 12 5 → 3 7 4 5 → 3 4 → 4
Líderes atuais:
- Geléia: 17 bytes [de Dennis ♦]
- MATL: 20 bytes [de Luis Mendo]
- APL: 28 bytes [voidhawk]
- k: 40 bytes [de Paul Kerrigan]
Há também uma batalha de Pythons em andamento. Ainda estou esperando mais idiomas de golfe aparecerem.
No momento, aceitei a resposta de Dennis - se houver novos vencedores, atualizarei a seleção.
fonte
Respostas:
Geléia , 17 bytes
Entrada é uma sequência de números inteiros separados por vírgula.
Experimente online!
Os créditos vão para @Xanderhall, @Sherlock e @ErikGolfer por lançar as bases.
Como funciona
fonte
JavaScript (ES6),
787672 bytesObrigado a @ edc65 por -4 bytes
Recebe uma matriz de números inteiros e gera uma matriz contendo apenas o vencedor.
Snippet de teste
Mostrar snippet de código
Aqui estão algumas outras tentativas, usando
.filter
e comprehensions de matriz:Ou um loop for duplo, terrivelmente longo:
Explicação
A maneira como isso funciona é bem simples: constrói uma matriz daqueles que são relativamente mais altos (
r
) e uma matriz daqueles que não são (q
), depois retornar
se tiver apenas um item; caso contrário, ele executa automaticamenteq
e retorna o resultado disso.fonte
q
er
. Você evita que a&&r
expressão e do filtro também seja um byte mais curto.MATL , 20 bytes
Entrada é um vetor de coluna, usando
;
como separador.Experimente online! Ou verifique todos os casos de teste .
Explicação
Esta é uma implementação direta do procedimento descrito no desafio. Um loop
do
...while
continua removendo elementos até que apenas um seja removido; e esse é o resultado.Os elementos a serem removidos são detectados através da tomada de diferenças, signum e diferenças novamente. Aqueles que dão um valor negativo são os que devem ser removidos.
fonte
Python3,
265260248243203121117112111 bytesObrigado @ZacharyT, @orion e @mathmandan para salvar
545um monte de bytes!fonte
Haskell, 85 bytes
Exemplo de uso:
f [9,3,8,7,4,12,5]
->4
.Como funciona:
Uma variante, também 85 bytes:
Ligue a lista de
b
(veja acima) para n e retorne o elementos
sex\\n
for uma lista de singleton ouf n
não.fonte
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
ainda precisa da importação. Btw,tails
também pode ser substituído por...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108 bytesExplicação
Primeiro, defina
x
ey
igual à entradaList
. O loop continua atéLength@y==1
.x~Split~Less
é a lista de listas de elementos consecutivos crescentes,Split[x,#>#2&]
é a lista de listas de elementos consecutivos decrescentes. Tomar a listaMax
de todas as listas anteriores fornece a lista de crianças mais altas que a criança à direita (junto com a criança mais à direita). Tomar o primeiro argumento (#&
) de todas as listas deste último fornece a lista de filhos mais altos que o filho à sua esquerda (junto com o filho mais à esquerda). A interseção desses dois será a lista de crianças que levantaram a mão. Defina isso igual ay
.x=DeleteCases[x,#|##&@@y]
remove dex
qualquer elemento correspondente a um elemento dey
(#|##&
é equivalente aAlternatives
) Quando o loop terminar, retorne (+4 bytes).y
. Se a saída deve ser um número inteiro (em vez de uma lista que contém um único número inteiro), retorne#&@@y
Agradeço a Martin Ender por salvar 2 bytes e me fazer cumprir as regras. Aberto a sugestões.
fonte
!Less
funcione como você espera, já que isso não é avaliado como uma função. Você provavelmente precisará usarGreater
(ou#>#2&
) lá. Você pode usarx~Split~Less
para o primeiroSplit
e>
para aLength
condição.Clear@y
entre chamadas de função, receio que isso não seja válido . Você precisará redefini-lo, escopo melhor ou transformar isso em um programa completo comInput
ePrint
.Perl 6 , 111 bytes
Expandido:
fonte
Python 2,
10098 bytesUsa o retorno em curto-circuito como na resposta de Yodle (por Zachary T)
fonte
+=b,
vez de+=[b]
(credit to mathmandan), uset=[0]
to uset
to add toA
e, como agora começamos com 0 int
, a verificaçãot[-2]<1
é mais curta quelen(t)<2
e,t[1]
como resultado, nesse caso.return t[-2]and f(l)or t[1]
.Mathematica, 101 bytes
Função recursiva sem nome, obtendo uma lista de números como entrada e retornando uma lista com um único número (o vencedor) como saída.
O núcleo do algoritmo é
Max/@Partition[#,3,1,{2,2},0]
, que calcula a matriz de (o máximo de mim e meus vizinhos) s na lista de entrada.a=Position[...-#,0]
subtrai a lista original e retorna onde estão os 0s; estes são os filhos que levantam as mãos.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
ramificações, dependendo se todos os elementos dea
são iguais ou não (nesse caso, eles serão apenas sea
for um singleton); se sim, então essa criança é a vencedora e nós produzimos o número dela; caso contrário, chamamos recursivamente essa função na lista com todos os elementos nas posiçõesa
removidas.fonte
Python 2, 99 bytes
fonte
PHP, 131 bytes
Obtém números dos argumentos da linha de comando. Falha se o nome do arquivo começar com um número positivo.
demolir
fonte
k, 40 bytes
Explicação:
$ é um if-else.
A condição é se 1 é a soma de B, que é definida como o mínimo de duas listas geradas, verificando se x é maior que as posições anterior e posterior (o tubo é reverso).
Se isso for verdade, retornamos x onde B é verdadeiro.
Caso contrário, recorreremos sem as posições verdadeiras.
fonte
Scala 129 bytes
Golfe
Ungolfed
Ao preencher a lista com os zeros à esquerda e à direita, é possível agrupar conjuntos de 3 e particionar a lista para aqueles em que a mão está para cima, os elementos esquerdo e direito se comparam a 0 no exterior, para obter o número correto (assumindo a altura de ninguém é negativo!)
fonte
C ++ 14, 182 bytes
Aprendeu que o operador ternário pode ser usado com objetos C ++. Requer a entrada para ser um recipiente de acesso aleatório com
push_back
, comovector
,deque
elist
.Cria dois contêineres
t
es
do mesmo tipo e anexa o local mais alto at
e o restante as
. Se houver apenas 1 elemento emt
troca desse elemento , caso contrário, a chamada recursiva será chamadas
.Ungolfed:
fonte
R, 83 bytes
Duas versões diferentes:
Este pega um vetor N:
Este cria uma função F definida recursivamente:
fonte
APL (Dyalog Unicode) , SBCS de 28 bytes
Experimente online!
fonte