Strzałki te zmienne!

29

Wyzwanie

Robin lubi mieć deklarację zmiennych w kształcie strzałki. Oto jak to robi:

  • Wprowadź dowolną liczbę ciągów
  • Uporządkuj je według rosnącej długości
  • Wyjmij je uporządkowane pośrodku, aby z grubsza utworzyć ujemny grot strzałki, taki jak ten (w zależności od tego, która kolejność jest najlepsza):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

Przypadki testowe

Wkład:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Wydajność:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Wkład:

a
bb
cc

Dane wyjściowe (oba są prawidłowe):

bb
a
cc

cc
a
bb

Wkład:

one
four
seven
fifteen

Możliwe wyjście (jedynym innym prawidłowym wyjściem jest jego lustro pionowe):

seven
one
four
fifteen

Notatki

  • Ciągi znaków są w camelCase i nie mają cyfr ani znaków specjalnych, tylko małe i wielkie litery.

  • Dane wejściowe mogą być dowolne: rozdzielone przecinkami jako jeden ciąg, tablica, ... Dowolny format we / wy jest dozwolony.

  • Między ciągami o tej samej długości akceptowane jest każde zamówienie.
Teleportacja kozy
źródło
Wydaje mi się, że wcześniej było bardzo podobne wyzwanie ... ale witamy w PPCG!
Giuseppe
@Giuseppe Tak, właśnie tak myślałem po opublikowaniu, nie ma mowy, żeby nie zostało to zrobione wcześniej. Czy zgadzasz się na to, że usunę to teraz, gdy odpowiedziałeś?
Teleportacja Kozła
1
Cóż, szukałem dupku, ale nie jestem zbyt dobry w wyszukiwaniu ... mamy piaskownicę do publikowania wyzwań, które często mogą złapać takie rzeczy. Nie mam nic przeciwko usuwaniu go, jeśli martwisz się, że to duplikat.
Giuseppe
1
Jest OK, wszyscy zaczynamy od początku :-)
Giuseppe
1
Czy możesz dodać przypadek testowy z parzystą liczbą ciągów?
Sherlock9

Odpowiedzi:

15

Python 2 , 47 bajtów

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

Wypróbuj online!

ovs
źródło
Będziesz musiał zmienić niektóre elementy, ale możesz użyć [::-2]bezpośrednio, aby zapisać 5 bajtów.
Sherlock9
@ Sherlock9 Próbowałem tego, ale potem musiałem sprawdzić długość, ponieważ listy o parzystych / nierównych długościach muszą być obsługiwane w inny sposób.
ovs
Działa również dla Pythona 3. Czy usunięcie „lambda l:” i „lub” i sprawienie, że w dwóch wierszach zapisanych zostanie 11 bajtów, będzie nadal dopuszczalne, ponieważ „Dowolny format we / wy jest dozwolony”?
ziemniak
9

R , 63 48 bajtów

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

Wypróbuj online!

Sortuj według długości łańcucha, a następnie połącz listę odwróconą z listą posortowaną, w końcu weź co drugi element, zaczynając od indeksu 1.

Giuseppe
źródło
1
o<-L[...Drugi sposób na „zmienne strzałkowe”. Mniej ważne, pryr::f(...)działa tutaj dla 46. Wypróbuj online!
CriminallyVulgar
@CriminallyVulgar przy użyciu dodatkowych bibliotek przekształca to w osobny język, R + pryrdlatego zazwyczaj unikam tego, chyba że istnieje dobry powód - jak w przypadku pytań z teorii liczb, numbersjest niezbędny.
Giuseppe
7

Javascript 77 bajtów

Pobiera dane wejściowe jako tablicę ciągów, wyświetla tablicę ciągów posortowaną strzałkami.

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

Wyjaśnienie

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
  )
asgalant
źródło
1
Nie sądzę, że musisz liczyć f=. 77
dana
Jest to niespójne w zgłoszeniach golfa kodu js z tego, co widziałem. Z przyjemnością go wykluczę, jeśli się nie liczy.
asgallant
2
Myślę, że to zależy, czy twoja funkcja używa rekurencji. tj f=x=>x?f(x-1). Jeśli tak, musisz dołączyć, fponieważ wywołujesz go w swojej funkcji. Ponieważ jednak nie używasz rekurencji, nie musisz tego uwzględniać f. W Meta jest kilka postów, ten wydaje się nieco lepiej to wyjaśniać. codegolf.meta.stackexchange.com/a/9032/8340
dana
To by tłumaczyło niespójności, które widziałem.
asgallant
5

K (oK) , 24 bajty

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Wygeneruj 6 4 2 0 1 3 5sekwencję, użyj jej do indeksowania rosnących długości danych wejściowych i użyj tej do indeksowania do oryginalnej tablicy:

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
Streetster
źródło
5

Galaretka , 9 8 bajtów

LÞŒœm"-Ẏ

Wypróbuj online!

LÞŒœṚ;¥/

ma również 8 bajtów.

Podziękowania dla @EriktheOutgolfer i @JonathanAllan za oboje oferowanie golfa w celu zaoszczędzenia bajtu.

Nick Kennedy
źródło
Miły! Sprytny golf: Ṛ€1¦może się stać m"-.
Erik the Outgolfer
Lub możesz iśćLÞŒœṚ;¥/
Jonathan Allan
5

05AB1E , 6 5 bajtów

Zaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi

I / O to lista ciągów.
Link został zmodyfikowany dla I / O oddzielonego znakiem nowej linii dla łatwiejszego testowania.

éι`Rì

Wypróbuj online!

Wyjaśnienie

é       # 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
źródło
Można usunąć pierwszy Ri wymienić «z izapisać bajt, ponieważ zasada trzecia bullet-punkt pozwala obie wersje uninterleaving.
Kevin Cruijssen
@KevinCruijssen: O tak, dzięki!
Emigna
5

J , 11 bajtów

,~`,/@\:#&>

Wypróbuj online!

Najpierw uporządkujemy.

Następnie zmniejszamy formularz listy od prawej do lewej, ale naprzemiennie po której stronie umieszczamy nowy element. Gotowy.

Jonasz
źródło
Bardzo dobrze! Na końcu masz spację, usuń ją na 11 bajtów :)
Galen Iwanow
1
Dzięki Galen. Naprawiony!
Jonasz
4

PowerShell , 66 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe przez rozpryskiwanie, które manifestuje się w TIO jako osobne argumenty wiersza poleceń. sorts na length, zapamiętuje to $ai konstruuje zakres od 1do countciągów wejściowych. Następnie wyciągamy tylko te nieparzyste ?{$_%2}i wprowadzamy je do pętli |%{...}. W każdej iteracji umieszczamy „ostatnią”, a następnie „trzecią od ostatniej” i tak dalej na rurociągu z $a[-$_]. Oddzielnie kumulujemy się również w $x„drugim od ostatniego”, „czwartym od ostatniego” itp. Poza pętlą i rurociąg jest opróżniany (więc te elementy są wyprowadzane), a następnie wyprowadzamy $x. W obu przypadkach domyślny wynik automatycznie podaje nam nowe wiersze między elementami.

AdmBorkBork
źródło
4

PHP ,144 141 bajtów

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

Wypróbuj online!

-3 bajty dzięki @Ismael Miguel !

640 KB
źródło
niezłe. Gdzie mogę przeczytać więcej na temat [array_unshift,array_push][++$i%2]($e,$d)?
abhig10
2
@ abhig10 na pewno. Jest to tablica z dwiema nazwami funkcji, ['array_push','array_unshift']których [++$i%2]indeks na przemian między a 0lub podobną 1będzie za każdym razem oceniać na inną funkcję. „Funkcje zmiennych” PHP pozwalają przypisać zmienną do funkcji i wykonać przez wywołanie z nawiasami (np .: $f='array_push'; $f($e,$d);== array_push($e,$d)), aby ($e,$d)następnie wywoływał oceniany element tablicy. To tylko krótszy sposób if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Zgadnij, w końcu było trochę cukru syntaktycznego PHP!
640 KB
Ok, zajęło mi to kiedyś zrozumienie. Niesamowite.
abhig10
1
Możesz zapisać 3 bajty, zastępując [array_unshift,array_push][++$i%2]($e,$d)je (array_.[unshift,push][++$i%2])($e,$d). To, co zrobiłem, to usunięcie powtarzającego się array_, konkatenacji, a następnie wynik jest przekazywany do połączenia.
Ismael Miguel
1
@ IsmaelMiguel, który jest genialny. Dziękuję Ci!
640 KB
4

MATLAB, 87 bajtów

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

Pobiera dane wejściowe jako tablicę komórek ciągów, wypisuje kolumnę ciągów (nie jestem pewien, czy jest to zgodne z prawem)

> 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: Dzięki Sanchises za wskazanie błędu z nieparzystymi danymi wejściowymi

aaaaa mówi o przywróceniu Moniki
źródło
Nie udaje się to w przypadku nieparzystej liczby ciągów wejściowych, np.f({'loooooooong','medium','short'})
Sanchises
Również kilka ogólnych wskazówek golfowych: endjest opcjonalny dla function. Używanie function x=f(y);x={...}'jest krótsze niż function f(y);disp({...}').
Sanchises
Jeśli utkniesz, oto jak bym to zrobił.
Sanchises
@ Dziękuję za zwrócenie uwagi na błąd. Naprawiłem to dokładnie tak jak ty. Mam problem z disptym, że nie jestem pewien, jakie są reguły wyjściowe. Czy powinien to być czysty tekst, czy nie? lub disp({...})jest w porządku, a nawet tak, x={...}jak sugerujesz
aaaaa mówi, że przywróć Monikę
1
W Octave może to być 58 bajtów .
Giuseppe
3

APL (Dyalog Unicode) , 18 bajtów SBCS

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

Wypróbuj online!

Naprawiono błąd dzięki @ngn.

Wyjaśnienie:

{⍵[⍋-@(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
źródło
1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)i staje się jeszcze krótszy, jeśli zmienisz go w
dfn
1
nie jestem jednak pewien, czy ten algorytm jest poprawny. powinniśmy zanegować długość każdego innego łańcucha w kolejności posortowanej, a nie w kolejności, w jakiej pochodzą z wejścia
ngn
2

APL + WIN, 31 38 bajtów

Zobacz komentarz Adamsa

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

Wypróbuj online Dzięki uprzejmości Dyalog Classic!

Monituje o zagnieżdżony wektor ciągów

Graham
źródło
Czy APL + nie ma monadycznego „licznika” do zastąpienia ∊⍴?
Adám
1
Nie działa '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Oczywiście wynik powinien był być'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám
@ Adám Moja starożytna wersja APL + nie ma ≢. Zgadzam się na twój drugi komentarz, przyjrzę się mu jutro.
Graham
2

Siatkówka , 26 bajtów

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

Wypróbuj online! Wyjaśnienie:

N$`
$.&

Sortuj linie w porządku rosnącym według długości ( $.&zwraca długość linii).

*\,2,^A`.+

Tymczasowo usuń alternatywne linie i wyślij pozostałe linie w odwrotnej kolejności.

,2,G`.+

Zachowaj jedyne wiersze, które zostały tymczasowo usunięte i wyślij je.

Neil
źródło
2

Gaia , 10 bajtów

el∫v:v+2%ụ

Wypróbuj 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
źródło
4
podoba mi się, że twoje komentarze w nieopakowanym kodzie tworzą strzałkę ciągów znaków
aaaaa mówi, że przywróć Monikę
2

Japt, 8 bajtów

ñÊó g0_w

-3 bajty dzięki Shaggy!

Spróbuj

Wcielenie ignorancji
źródło
10 bajtów z danymi wyjściowymi w postaci tablicy 2D, co wydaje się być dozwolone.
Kudłaty
A może 8 bajtów ? Na moim telefonie nie przetestowałem go poprawnie.
Kudłaty
@Shaggy Szukałem funkcji do znalezienia każdego n-tego elementu, ale nie mogłem go znaleźć. Dzięki!
Wcielenie nieznajomości
jest też, A.ë()ale nie wiem, czy to doprowadzi do krótszego rozwiązania.
Kudłaty
2

T-SQL, 84 bajty

Dane wejściowe to zmienna tabelowa

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

Wypróbuj online

t-clausen.dk
źródło
2

Perl 6 , 31 bajtów

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

Wypróbuj online!

Sortuj według długości łańcucha, a następnie według sekwencji statycznej 0, -1, 0, -3, 0, -5, ...

nwellnhof
źródło
1

JavaScript 95 bajtów

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);
somsom
źródło
-1 s.sort()sortuje ciągi leksykograficzne, a nie według długości.
asgallant
Racja, (x, y) => x.length-y.length, powinno to naprawić.
somsom
1

Czerwony , 116 101 bajtów

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

Wypróbuj online!

Galen Iwanow
źródło
1

perl 5 ( -p0777F/\n/ -M5.01), 59 bajtów

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

TIO

Nahuel Fouilleul
źródło
1

C (gcc) , 136 128 bajtów

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

Wypróbuj online!

-8 bajtów dzięki pułapkowi cat.

Funkcja fjest rozwiązaniem. Jako argumenty przyjmuje liczbę ciągów, same ciągi i bufor wyjściowy (plus cztery dodatkowe używane wewnętrznie).

LambdaBeta
źródło
Dlaczego jest ./.bin.tiow wyjściu ?
Teleportacja Kozła
@TeleportingGoat Prawdopodobnie dlatego, że ich stopka używa wszystkich argv, w tym nazwy pliku
Jo King
Dokładnie, to był tylko szybki test. Można konstruować dowolne dane o odpowiednim formacie. Zaktualizuję link TIO później.
LambdaBeta
haha, problem z tymi krótkimi nazwami zmiennych: tw pierwszej kolejności zapominasz, o co ci chodzi, i trzymasz się ich nawet wtedy, gdy ich nie potrzebujesz!
LambdaBeta
122 bajty
ceilingcat
0

Japt , 8 bajtów

Dane wejściowe jako tablica wierszy, dane wyjściowe jako tablica 2 tablic wierszy, po jednej na każdą połowę listy.

ñÊó
hUÎÔ

Wypróbuj (Dodatkowy kod, aby zezwolić na operacje we / wy jako ciąg rozdzielany znakiem nowej linii)

ñÊó      :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
Kudłaty
źródło
0

Haskell , 104 96 bajtów

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

Wypróbuj online!

robaki
źródło
Nieprawidłowe, musisz posortować przed przecięciem listy na pół
tylko ASCII
90
Tylko ASCII