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.

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!


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.


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
  )

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



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

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.


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.


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 !


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


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


@ 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

¹


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


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.


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

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


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




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;},[]);

-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

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).


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.