Freccia quelle variabili!


29

Sfida

A Robin piace avere la dichiarazione delle sue variabili a forma di freccia. Ecco come lo fa:

  • Immettere un numero qualsiasi di stringhe
  • Ordinali per lunghezza crescente
  • Esegui l'output ordinato al centro in modo da formare approssimativamente una punta di freccia negativa, in questo modo (qualunque sia il golf migliore):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

Casi test

Ingresso:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Produzione:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Ingresso:

a
bb
cc

Output (entrambi sono validi):

bb
a
cc

cc
a
bb

Ingresso:

one
four
seven
fifteen

Possibile output (l'unico altro output valido è il suo mirror verticale):

seven
one
four
fifteen

Gli appunti

  • Le stringhe sono in camelCase e non hanno numeri o caratteri speciali, ma solo lettere minuscole e maiuscole.

  • L'input può essere quello che ti piace: separato da virgola come una stringa, matrice, ... È consentito qualsiasi formato I / O.

  • Tra stringhe della stessa lunghezza, viene accettato qualsiasi ordine.

Sento che prima c'era una sfida molto simile ... ma benvenuti in PPCG!
Giuseppe,

@Giuseppe Sì, è quello che ho pensato dopo aver pubblicato, non c'è modo che non sia mai stato fatto prima. Saresti d'accordo con me eliminandolo ora che hai risposto?
Teletrasporto Capra

1
beh, ho cercato un duplicato ma non sono molto bravo nella ricerca ... abbiamo una sandbox per pubblicare sfide che spesso possono catturare cose del genere. Sono perfettamente d'accordo con te che lo elimini se sei preoccupato che sia un imbecille.
Giuseppe,

1
Va bene, iniziamo tutti dall'inizio :-)
Giuseppe,

1
Potresti aggiungere un caso di test con un numero pari di stringhe?
Sherlock9,

Risposte:


15

Python 2 , 47 byte

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

Provalo online!


Dovrai riordinare alcune cose, ma puoi usarle [::-2]direttamente per salvare 5 byte.
Sherlock9,

@ Sherlock9 L'ho provato, ma poi ho dovuto verificare la lunghezza, poiché gli elenchi con lunghezze pari / irregolari devono essere gestiti in modo diverso.
Ovs

Funziona anche con Python 3. Rimuovere "lambda l:" e "o" e farlo su 2 righe per salvare 11 byte sarebbe comunque accettabile in quanto "È consentito qualsiasi formato I / O"?
Patata

9

R , 63 48 byte

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

Provalo online!

Ordina per lunghezza delle stringhe, quindi combina l'elenco invertito con l'elenco ordinato, infine, prendi ogni 2 ° elemento, iniziando dall'indice 1 in base 1.


1
o<-L[...L'altro modo di "variabili freccia". A parte meno importante, pryr::f(...)funziona qui per 46. Provalo online!
CriminallyVulgar

@CriminallyVulgar utilizzando librerie aggiuntive trasforma questo in un linguaggio separato, R + pryrmotivo per cui in genere evito di farlo a meno che non ci sia una buona ragione per - come per le domande sulla teoria dei numeri, numbersè indispensabile.
Giuseppe

7

Javascript 77 byte

Accetta l'input come una matrice di stringhe, genera una matrice di stringhe ordinata da una freccia.

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

Spiegazione

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
  )

1
Non penso che tu debba contare f=. 77
dana,

Ciò è incoerente nelle osservazioni di golf di js code da quello che ho visto. Sono felice di escluderlo se non conta.
asgallant

2
Penso che dipenda se la tua funzione utilizza la ricorsione. vale a dire f=x=>x?f(x-1). In tal caso, è necessario includere fpoiché lo si chiama nella propria funzione. Tuttavia, poiché non si utilizza la ricorsione, non è necessario includere f. Ci sono molti post in Meta, questo sembra spiegarlo un po 'meglio. codegolf.meta.stackexchange.com/a/9032/8340
dana

Ciò spiegherebbe le incongruenze che ho visto.
asgallant


5

K (oK) , 24 byte

Soluzione:

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

Provalo online!

Spiegazione:

Genera la 6 4 2 0 1 3 5sequenza, usala per indicizzare le lunghezze ascendenti dell'input e usale per indicizzare l'array originale:

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



5

05AB1E , 6 5 byte

Salvato 1 byte grazie a Kevin Cruijssen

L'I / O è un elenco di stringhe.
Il collegamento viene modificato per l'I / O separato da una nuova riga per test più facili.

éι`Rì

Provalo online!

Spiegazione

é       # 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

È possibile rimuovere il primo Re sostituirlo «con iper salvare un byte, poiché la terza regola del punto elenco consente entrambe le versioni di non-foglia.
Kevin Cruijssen,

@KevinCruijssen: Oh sì, grazie!
Emigna,

5

J , 11 byte

,~`,/@\:#&>

Provalo online!

Prima lo ordiniamo.

Quindi riduciamo il modulo elenco da destra a sinistra, ma alternando il lato su cui inseriamo il nuovo elemento. Fatto.


Molto bella! Alla fine hai uno spazio, rimuovilo per 11 byte :)
Galen Ivanov

1
Grazie Galeno. Fisso!
Giona

4

PowerShell , 66 byte

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

Provalo online!

Accetta input tramite splatting, che si manifesta su TIO come argomenti della riga di comando separati. sorts sul length, lo memorizza in $ae costruisce un intervallo da 1fino alle countstringhe di input. Quindi estraiamo solo quelli dispari ?{$_%2}e li inseriamo in un ciclo |%{...}. Ad ogni iterazione, mettiamo "l'ultimo", quindi il "terzo dall'ultimo" e così via sulla pipeline $a[-$_]. Separatamente, ci accumuliamo anche nel $x"secondo dall'ultimo", "quarto dall'ultimo", ecc. Fuori dal circuito e la pipeline viene svuotata (quindi quegli elementi vengono emessi) e quindi emettiamo $x. In entrambi i casi, l'output predefinito ci fornisce automaticamente nuove righe tra gli elementi.


4

PHP ,144 141 byte

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;}

Provalo online!

-3 byte grazie a @Ismael Miguel !


Ben fatto. Dove posso leggere di più [array_unshift,array_push][++$i%2]($e,$d)?
abhig10

2
@ abhig10 certo. È un array con i due nomi di funzione ['array_push','array_unshift']con [++$i%2]come l'indice dell'array che si alterna tra una 0o 1così valuterà ogni volta l'altra funzione. Le "funzioni variabili" di PHP consentono di assegnare una variabile a una funzione ed eseguirla chiamando tra parentesi (es: $f='array_push'; $f($e,$d);== array_push($e,$d)) in modo che ($e,$d)quindi venga chiamato l'elemento valutato dell'array. Solo un modo più breve di fare if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Immagino che dopo tutto ci fosse dello zucchero sintattico PHP!
640 KB

Ok, mi ci è voluto un po 'di tempo per capirlo. Eccezionale.
abhig10

1
È possibile salvare 3 byte sostituendoli [array_unshift,array_push][++$i%2]($e,$d)con (array_.[unshift,push][++$i%2])($e,$d). Quello che ho fatto è stato rimuovere il ripetuto array_, concatenarlo e quindi il risultato è passato alla chiamata.
Ismael Miguel,

1
@IsmaelMiguel è geniale. Grazie!
640 KB

4

MATLAB, 87 byte

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

Accetta input come array di celle di stringhe, genera colonne di stringhe (non sono sicuro che sia legale)

> 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: Grazie Sanchises per aver indicato un bug con input di lunghezza dispari


Questo non riesce su un numero dispari di stringhe di input, ad esf({'loooooooong','medium','short'})
Sanchises

Anche alcuni consigli generali sul golf: endè facoltativo per a function. L'uso function x=f(y);x={...}'è più breve di function f(y);disp({...}').
Sanchises

Se sei bloccato, ecco come lo farei.
Sanchises

@Sanchise grazie per aver segnalato il bug. L'ho risolto esattamente come hai fatto tu. Il mio problema dispè che non sono sicuro di quali siano le regole di output. Dovrebbe essere puro testo o no? o disp({...})va bene o anche solo x={...}come suggerisci tu
dice aaaaa reintegrare Monica il

1
Questo può essere di 58 byte in Octave.
Giuseppe,

3

APL (Dyalog Unicode) , 18 byte SBCS

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

Provalo online!

Risolto il bug grazie a @ngn.

Spiegazione:

{⍵[⍋-@(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

¹


1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)e diventa ancora più breve se lo trasformi in un dfn
ngn il

1
tuttavia, non sono sicuro che questo algoritmo sia corretto. dovremmo negare la lunghezza di ogni altra stringa nel loro ordine ordinato, non nell'ordine in cui provengono dall'input
ngn

2

APL + WIN, 31 38 byte

Vedi il commento di Adams

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

Provalo online per gentile concessione di Dyalog Classic!

Richiede un vettore nidificato di stringhe


APL + non ha "tally" Monadic da sostituire ∊⍴?
Adám,

1
Non funziona '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Chiaramente, il risultato avrebbe dovuto essere'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám

@ Adám La mia antica versione di APL + non ha ≢. D'accordo sul tuo secondo commento, lo darò un'occhiata domani.
Graham,

2

Retina , 26 byte

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

Provalo online! Spiegazione:

N$`
$.&

Ordina le linee in ordine crescente di lunghezza ( $.&restituisce la lunghezza della linea).

*\,2,^A`.+

Elimina temporaneamente le linee alternative e stampa le righe rimanenti in ordine inverso.

,2,G`.+

Conservare le uniche righe che sono state temporaneamente eliminate e produrle.


2

Gaia , 10 byte

el∫v:v+2%ụ

Provalo 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

4
mi piace che i tuoi commenti in codice non imballato formino una freccia di stringhe
aaaaa dice di reintegrare Monica il



2

T-SQL, 84 byte

L'input è una variabile di tabella

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

Provalo online



1

Javascript 95 byte

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);

-1 s.sort()ordina le stringhe lessicograficamente, non in base alla lunghezza della stringa.
asgallant

A destra, (x, y) => x.length-y.length, dovrebbe risolverlo.
somsom


1

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

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

TIO


1

C (gcc) , 136 128 byte

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];}

Provalo online!

-8 byte grazie a ceilingcat.

La funzione fè la soluzione. Prende il numero di stringhe, le stringhe stesse e il buffer di output come argomenti (più altri quattro utilizzati internamente).


Perché è ./.bin.tioin uscita ?
Teletrasporto Capra

@TeleportingGoat Probabilmente perché il loro piè di pagina sta usando tutto argv, che include il nome del file
Jo King

Esatto, è stato solo un test veloce. Si può costruire qualsiasi dato che abbia il formato appropriato. Aggiornerò il link TIO più tardi.
LambdaBeta,

ahah, il problema con questi nomi di variabili brevi: tin primo luogo dimentichi ciò che ti odia e tienilo in giro anche quando non ne hai bisogno!
LambdaBeta,


0

Japt , 8 byte

Input come una matrice di linee, output come una matrice di 2 matrici di linee, una per ogni metà dell'elenco.

ñÊó
hUÎÔ

Provalo (Codice aggiuntivo per consentire l'I / O come stringa separata da nuova riga)

ñÊó      :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

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.