Seta essas variáveis!

29

Desafio

Robin gosta de ter sua declaração de variáveis ​​na forma de uma flecha. Aqui está como ele faz isso:

  • Insira qualquer número de strings
  • Encomende-os por comprimento crescente
  • Produza-os ordenados pelo meio para formar aproximadamente uma ponta de seta negativa, desta forma (o que for melhor para os jogadores):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

Casos de teste

Entrada:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Saída:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Entrada:

a
bb
cc

Saída (ambas são válidas):

bb
a
cc

cc
a
bb

Entrada:

one
four
seven
fifteen

Saída possível (a única outra saída válida é o seu espelho vertical):

seven
one
four
fifteen

Notas

  • As strings estão em camelCase e não têm números ou caracteres especiais, apenas letras minúsculas e maiúsculas.

  • A entrada pode ser o que você quiser: separada por vírgula como uma sequência, matriz, ... Qualquer formato de E / S é permitido.

  • Entre strings com o mesmo comprimento, qualquer pedido é aceito.
Teleporting Goat
fonte
Sinto que havia um desafio muito semelhante antes ... mas bem-vindo ao PPCG!
Giuseppe
@ Giuseppe Sim, foi o que pensei depois de postar, não tem como não ter sido feito antes. Você poderia concordar em excluí-lo agora que você respondeu?
Teleporting Goat
11
Bem, eu estive procurando por um idiota, mas não sou muito bom na busca ... nós temos uma caixa de areia para postar desafios que geralmente podem pegar coisas assim. Eu estou perfeitamente bem com você excluindo-o se você estiver preocupado com o fato de ser um idiota.
Giuseppe
11
Tudo bem, todos começamos do começo :-)
Giuseppe
11
Você poderia adicionar um caso de teste com um número par de strings?
Sherlock9

Respostas:

15

Python 2 , 47 bytes

lambda l:l.sort(key=len)or l[1::2][::-1]+l[::2]

Experimente online!

ovs
fonte
Você precisará reorganizar algumas coisas, mas pode usar [::-2]diretamente para salvar 5 bytes.
Sherlock9
@ Sherlock9 Eu tentei isso, mas tive que verificar o comprimento, pois as listas com comprimentos pares / irregulares devem ser tratadas de maneira diferente.
ovs 03/04
Também funciona para o Python 3. A remoção de "lambda l:" e "ou" e o tornaria em duas linhas para salvar 11 bytes ainda seria aceitável como "Qualquer formato de E / S é permitido"?
potato
9

R , 63 48 bytes

function(L)c(rev(o<-L[order(nchar(L))]),o)[!0:1]

Experimente online!

Classifique por comprimentos de sequência e, em seguida, combine a lista invertida com a lista classificada e, finalmente, pegue cada segundo elemento, começando no índice 1 baseado em 1.

Giuseppe
fonte
11
o<-L[...A outra maneira de 'variáveis ​​de seta'. Um aspecto menos importante, pryr::f(...)trabalha aqui por 46 anos. Experimente online!
CriminallyVulgar
O @CriminallyVulgar usando bibliotecas adicionais transforma isso em um idioma separado, R + pryrmotivo pelo qual eu normalmente evito fazê-lo, a menos que haja uma boa razão para - como em questões de teoria dos números, numbersseja indispensável.
Giuseppe
7

Javascript 77 bytes

Recebe a entrada como uma matriz de seqüências de caracteres, gera uma matriz de seqüências de caracteres classificada por setas.

s=>s.sort((a,b)=>a.length-b.length).reduce((m,x,i)=>i%2?[...m,x]:[x,...m],[])

Explicação

s =>                                 // take input as an array of strings s
  s.sort((a,b)=>a.length-b.length)   // sort input by string length
  .reduce(                           // reduce
    (m,x,i)=>i%2?[...m,x]:[x,...m],  // if index is even, stick string x at the end of the memo
                                     // array, else at the beginning
    []                               // memo initialized to empty array
  )
asgallant
fonte
11
Eu não acho que você precise contar f=. 77
dana
Isso é inconsistente nos envios de js code do que vi. Fico feliz em excluí-lo se não contar.
asgallant 04/04
2
Eu acho que depende se a sua função usa recursão. ie f=x=>x?f(x-1). Nesse caso, você precisa incluir fuma vez que está chamando em sua função. No entanto, como você não está usando recursão, não precisa incluir f. Existem vários posts no Meta, este parece explicar um pouco melhor. codegolf.meta.stackexchange.com/a/9032/8340
dana
Isso explicaria as inconsistências que eu já vi.
asgallant 04/04
5

K (oK) , 24 bytes

Solução:

x(<#:'x)(|&~w),&w:2!!#x:

Experimente online!

Explicação:

Gere a 6 4 2 0 1 3 5sequência, use-a para indexar os comprimentos crescentes de entrada e use-a para indexar na matriz original:

x(<#:'x)(|&~w),&w:2!!#x: / the solution
                      x: / save input as x
                     #   / count (#) of x
                    !    / range 0 to ...
                  2!     / modulo 2
                w:       / save as w
               &         / indices where true
              ,          / join with
        (    )           / do this together
           ~w            / not (~) w
          &              / indices where true
         |               / reverse
 (     )                 / do this together
   #:'x                  / count (#:) of each (') x
  <                      / indices to sort ascending
x                        / index into x
rua
fonte
5

Geléia , 9 8 bytes

LÞŒœm"-Ẏ

Experimente online!

LÞŒœṚ;¥/

também é 8 bytes.

Obrigado a @EriktheOutgolfer e @JonathanAllan por ambos oferecerem golfe para salvar um byte.

Nick Kennedy
fonte
Agradável! Golfe inteligente: Ṛ€1¦pode se tornar m"-.
Erik the Outgolfer
Ou você pode ir paraLÞŒœṚ;¥/
Jonathan Allan
5

05AB1E , 6 5 bytes

Guardado 1 byte graças a Kevin Cruijssen

E / S é uma lista de cadeias.
O link é modificado para E / S separada por nova linha para facilitar o teste.

éι`Rì

Experimente online!

Explicação

é       # sort by length ascending
 ι      # uninterleave into 2 parts, both sorted ascending
   `    # push the 2 parts separately to the stack
    R   # reverse the second part
     ì  # and append it to the first
Emigna
fonte
Você pode remover o primeiro Re substituir «por ipara salvar um byte, uma vez que a terceira regra de marcador permite as duas versões de desintercalação.
Kevin Cruijssen 04/04
@KevinCruijssen: Ah sim, obrigado!
Emigna 04/04
5

J , 11 bytes

,~`,/@\:#&>

Experimente online!

Separamos primeiro.

Em seguida, reduzimos o formulário da lista da direita para a esquerda, mas alternando de que lado colocamos o novo elemento. Feito.

Jonah
fonte
Muito agradável! Você tem um espaço no final, remova-o por 11 bytes :)
Galen Ivanov
11
Obrigado Galen. Fixo!
Jonah
4

PowerShell , 66 bytes

1..($a=$args|sort l*).count|?{$_%2}|%{$a[-$_];$x=,$a[-++$_]+$x};$x

Experimente online!

Recebe entrada por meio de splatting, que se manifesta no TIO como argumentos separados da linha de comando. sorts no lmecanismo, armazena isso em $ae constrói um intervalo de 1até as countcadeias de entrada. Depois, extraímos apenas os ímpares ?{$_%2}e os alimentamos em um loop |%{...}. A cada iteração, colocamos o "último", depois o "terceiro do último" e assim por diante $a[-$_]. Separadamente, também acumulamos $xo "segundo do último", o "quarto do último", etc. Fora do loop e o pipeline é liberado (para que esses elementos sejam gerados) e depois geramos $x. Nos dois casos, a saída padrão nos fornece novas linhas automaticamente entre os itens.

AdmBorkBork
fonte
4

PHP ,144 141 bytes

function($a){usort($a,function($b,$c){return strlen($b)-strlen($c);});$e=[];foreach($a as$d)(array_.[unshift,push][++$i%2])($e,$d);return$e;}

Experimente online!

-3 bytes graças a @Ismael Miguel !

640KB
fonte
Agradável. Onde posso ler mais sobre [array_unshift,array_push][++$i%2]($e,$d)?
abhig10 04/04
2
@ abhig10 com certeza. É uma matriz com os dois nomes de função ['array_push','array_unshift']com [++$i%2]como o índice da matriz alternada entre um 0ou 1então será avaliada como a outra função de cada vez. As "funções variáveis" do PHP permitem atribuir uma variável a uma função e executá-la chamando entre parênteses (ex: $f='array_push'; $f($e,$d);== array_push($e,$d)), para que ($e,$d)então chame o elemento avaliado da matriz. Apenas uma maneira mais curta de fazer if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Acho que havia algum açúcar sintático do PHP, afinal!
640KB 04/04
Ok, demorei algum tempo para entender isso. Impressionante.
abhig10 04/04
11
Você pode salvar 3 bytes substituindo [array_unshift,array_push][++$i%2]($e,$d)por (array_.[unshift,push][++$i%2])($e,$d). O que fiz foi remover o repetido array_, concatenado e, em seguida, o resultado é passado para a chamada.
Ismael Miguel
11
@IsmaelMiguel isso é brilhante. Obrigado!
640KB 5/04
4

MATLAB, 87 bytes

function f(y);[B,I]=sort(cellfun(@(x)length(x),y));{y{flip(I(1:2:end))},y{I(2:2:end)}}'

Recebe entrada como matriz de células, produz coluna de seqüências de caracteres (não tenho certeza se isso é legal)

> s = {'qweq qwe qw','qweqw','12132132131231231','asdasdasda','qwe','w'};
> f(s)
> >> 
> ans =
> 
>   6×1 cell array
> 
>     {'qweq qwe qw'      }
>     {'qweqw'            }
>     {'qwe'              }
>     {'1234'             }
>     {'asdasdasda'       }
>     {'12132132131231231'}

PS: Obrigado Sanchises por apontar para um bug com entradas de tamanho ímpar

aaaaa diz restabelecer Monica
fonte
Isso falha no número ímpar de strings de entrada, por exemplof({'loooooooong','medium','short'})
Sanchises
Também algumas dicas gerais de golfe: o endé opcional para a function. O uso function x=f(y);x={...}'é mais curto que function f(y);disp({...}').
Sanchises 04/04
Se você está preso, aqui está como eu faria isso.
Sanchises 04/04
@ Agradece por apontar o erro. Corrigi exatamente como você fez. Meu problema dispé que não tenho certeza de quais são as regras de saída. Deveria ser texto puro ou não? ou disp({...})está tudo bem ou mesmo x={...}como você sugere
aaaaa diz restabelecer Monica
11
Isso pode ter 58 bytes na oitava.
Giuseppe
3

APL (Dyalog Unicode) , SBCS de 18 bytes

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}

Experimente online!

Corrigido o erro graças a @ngn.

Explicação:

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}
{                }  Function. Takes a single argument: ⍵, list of strings
             ≢¨⍵    The length of each element in the list
           ⍋⍋       Sort the lengths
    -@(2∘|)         At (@) elements divisible by 2 (|), negate (-)
                        gives -1 2 -3 4 -5
                   Sort this list again, gives the indices of that list ^ sorted
 ⍵[             ]   Use these indices to index into the argument

¹

Ven
fonte
11
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)e fica ainda mais curto se você transformá-lo em um
dfn
11
no entanto, não tenho certeza se esse algoritmo está correto. devemos negar o comprimento de todas as outras strings em sua ordem classificada, não na ordem em que elas vêm da entrada
ngn
2

APL + WIN, 31 38 bytes

Ver comentário de Adams

⊃n[(⍳⍴n)~a],⌽n[a←2×⍳⌊.5×⍴n←n[⍒∊⍴¨n←⎕]]

Experimente online Cortesia de Dyalog Classic!

Solicita um vetor aninhado de strings

Graham
fonte
O APL + não tem o "registro" monádico para substituir ∊⍴?
Adám 03/04
11
Falha '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Claramente, o resultado deveria ter sido'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám 03/04
@ Adám Minha versão antiga do APL + não possui ≢. Acordado em seu segundo comentário, vou dar uma olhada amanhã.
Graham
2

Retina , 26 bytes

N$`
$.&
*\,2,^A`.+
,2,G`.+

Experimente online! Explicação:

N$`
$.&

Classifique as linhas em ordem crescente de comprimento ( $.&retorna o comprimento da linha).

*\,2,^A`.+

Exclua temporariamente as linhas alternativas e produza as linhas restantes na ordem inversa.

,2,G`.+

Mantenha as únicas linhas que foram excluídas temporariamente e as produza.

Neil
fonte
2

Gaia , 10 bytes

el∫v:v+2%ụ

Experimente online!

e		| eval as Gaia code (list of strings)
 l∫		| ∫ort by lengths (ascending)
   v:v		| reverse, dup, reverse
      +		| concatenate lists
       2%	| take every other element
         ụ	| join by newlines and output
Giuseppe
fonte
4
Eu gosto que seus comentários em código desembrulhado formem uma flecha de strings
aaaaa diz restabelecer Monica
2

Japonês, 8 bytes

ñÊó g0_w

-3 bytes graças a Shaggy!

Tente

Modalidade de ignorância
fonte
10 bytes com saída como uma matriz 2D, o que parece ser permitido.
Shaggy
Ou, talvez, 8 bytes ? No meu telefone, não o teste corretamente.
Shaggy
@ Shaggy Eu estava procurando por uma função para encontrar todos os enésimos elementos, mas não consegui encontrá-los. Obrigado!
Modalidade de ignorância
existe também, A.ë()mas não sei se isso levará a uma solução mais curta.
Shaggy
2

T-SQL, 84 bytes

Entrada é uma variável de tabela

SELECT a FROM(SELECT*,row_number()over(order by len(a))r
FROM @)x order by(r%2-.5)*r

Experimente online

t-clausen.dk
fonte
2

Perl 6 , 31 bytes

*.sort(&chars).sort:{$++%2*$--}

Experimente online!

Classifique por comprimento da sequência e depois pela sequência estática 0, -1, 0, -3, 0, -5, ...

Nwellnhof
fonte
1

Javascript 95 bytes

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);
somsom
fonte
-1 s.sort()classifica as strings lexicograficamente, não pelo comprimento da string.
asgallant 03/04
Certo, (x, y) => x.length-y.length, deve corrigir isso.
somsom 03/04
1

Vermelho , 116 101 bytes

func[b][sort/compare b func[x y][(length? x)> length? y]collect[forall b[keep take b]keep reverse b]]

Experimente online!

Galen Ivanov
fonte
1

perl 5 ( -p0777F/\n/ -M5.01), 59 bytes

for$x(sort{$b=~y///c-length$a}@F){--$|?$\="$x
".$\:say$x}}{

TIO

Nahuel Fouilleul
fonte
1

C (gcc) , 136 128 bytes

S(a,b)int**a,**b;{a=strlen(*b)-strlen(*a);}f(l,s,o,i,b,e)int**s,**o;{qsort(s,l,8,S);e=l-1;for(i=b=0;i-l;)o[i++%2?b++:e--]=s[i];}

Experimente online!

-8 bytes graças ao ceilingcat.

A função fé a solução. Ele usa o número de strings, as próprias strings e o buffer de saída como argumentos (mais quatro usados ​​internamente).

LambdaBeta
fonte
Por que está ./.bin.tiona saída ?
Teleporting Goat
@TeleportingGoat Provavelmente porque o rodapé deles está usando tudo argv, incluindo o nome do arquivo
Jo King
Exatamente, foi apenas um teste rápido. Pode-se construir qualquer dado que tenha o formato apropriado. Atualizarei o link do TIO mais tarde.
LambdaBeta 4/04
haha, o problema com esses nomes curtos de variáveis: você esquece o que deseja te mantém por perto mesmo quando não precisa!
LambdaBeta 10/04
122 bytes
ceilingcat
0

Japonês , 8 bytes

Input as an array of lines, output as an array of 2 arrays of lines, one for each half of the list.

ñÊó
hUÎÔ

Try it (Additional code to allow for I/O as newline separated string)

ñÊó      :Implicit input of array U
ñ        :Sort by
 Ê       :  Length
  ó      :Uninterleave

hUÎÔ     :Newline reassigns to U
h        :Set the first element in U to
 UÎ      :  The first element in U
   Ô     :  Reversed
Shaggy
fonte
0

Haskell, 104 96 bytes

import Data.List
f s=splitAt((length s+1)`div`2)s
g=sortOn length
h(x,y)=reverse(g x)++g y
z=h.f

Try it online!

bugs
fonte
Invalid, you have to sort before cutting list in half
ASCII-only
90
ASCII-only