Pfeil diese Variablen!

29

Herausforderung

Robin mag es, wenn seine Variablendeklaration die Form eines Pfeils hat. So macht er es:

  • Geben Sie eine beliebige Anzahl von Zeichenfolgen ein
  • Ordnen Sie sie nach aufsteigender Länge
  • Geben Sie sie in der Mitte sortiert aus, um ungefähr eine negative Pfeilspitze zu bilden (je nachdem, welche Reihenfolge am besten ist):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

Testfälle

Eingang:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Ausgabe:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Eingang:

a
bb
cc

Ausgabe (beide sind gültig):

bb
a
cc

cc
a
bb

Eingang:

one
four
seven
fifteen

Mögliche Ausgabe (die einzige andere gültige Ausgabe ist der vertikale Spiegel):

seven
one
four
fifteen

Anmerkungen

  • Die Zeichenfolgen befinden sich in camelCase und enthalten keine Zahlen oder Sonderzeichen, sondern nur Klein- und Großbuchstaben.

  • Die Eingabe kann beliebig sein: Kommagetrennt als eine Zeichenfolge, ein Array, ... Jedes E / A-Format ist zulässig.

  • Zwischen Saiten gleicher Länge wird jede Bestellung angenommen.
Ziege teleportieren
quelle
Ich habe das Gefühl, dass es vorher eine sehr ähnliche Herausforderung gab ... aber willkommen bei PPCG!
Giuseppe
@ Giuseppe Ja, das habe ich mir nach dem Posten gedacht. Es gibt keine Möglichkeit, wie es noch nie gemacht wurde. Würden Sie es in Ordnung finden, wenn ich es lösche, nachdem Sie es beantwortet haben?
Ziege
1
Nun, ich habe nach einem Betrüger gesucht, aber ich bin nicht sehr gut in der Suche ... Wir haben eine Sandbox für das Posten von Herausforderungen, die oft solche Dinge auffangen können. Ich bin vollkommen in Ordnung damit, dass du es löschst, wenn du dir Sorgen machst, dass es ein Betrug ist.
Giuseppe
1
Es ist in Ordnung, wir fangen alle von vorne an :-)
Giuseppe
1
Könnten Sie einen Testfall mit einer geraden Anzahl von Zeichenfolgen hinzufügen?
Sherlock9

Antworten:

15

Python 2 , 47 Bytes

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

Probieren Sie es online!

ovs
quelle
Sie müssen einige Dinge neu anordnen, aber Sie können [::-2]direkt verwenden, um 5 Bytes zu sparen.
Sherlock9
@ Sherlock9 Das habe ich versucht, aber dann musste ich nach der Länge suchen, da Listen mit geraden / ungeraden Längen unterschiedlich behandelt werden müssen.
OVS
Funktioniert auch für Python 3. Würde das Entfernen von "lambda l:" und "oder" und das Speichern von 11 Bytes in 2 Zeilen noch akzeptabel sein, da "Jedes E / A-Format zulässig ist"?
Kartoffel
9

R , 63 48 Bytes

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

Probieren Sie es online!

Sortieren Sie nach Zeichenfolgenlängen und kombinieren Sie dann die umgekehrte Liste mit der sortierten Liste. Nehmen Sie schließlich jedes zweite Element, beginnend mit 1-basiertem Index 1.

Giuseppe
quelle
1
o<-L[...Der andere Weg zu 'Pfeilvariablen'. Eine weniger wichtige Seite, pryr::f(...)arbeitet hier für 46. Probieren Sie es online!
CriminallyVulgar
Die Verwendung zusätzlicher Bibliotheken durch @CriminallyVulgar macht dies zu einer eigenen Sprache, R + pryrweshalb ich es normalerweise vermeide, es zu tun, es sei denn, es gibt einen guten Grund - wie bei Fragen zur Zahlentheorie - numbersist unabdingbar.
Giuseppe
7

Javascript 77 Bytes

Nimmt Eingaben als ein Array von Zeichenfolgen und gibt ein pfeilsortiertes Array von Zeichenfolgen aus.

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

Erläuterung

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
quelle
1
Ich glaube nicht, dass du zählen musst f=. 77
dana
Das ist inkonsistent in den js Code Golf Einsendungen von dem, was ich gesehen habe. Ich schließe es gerne aus, wenn es nicht zählt.
Asgallant
2
Ich denke, es hängt davon ab, ob Ihre Funktion Rekursion verwendet. dh f=x=>x?f(x-1). In diesem Fall müssen Sie dies berücksichtigen, fda Sie es in Ihrer Funktion aufrufen. Da Sie jedoch keine Rekursion verwenden, sollten Sie diese nicht einbeziehen müssen f. Es gibt mehrere Posts in Meta, dieser scheint es ein bisschen besser zu erklären. codegolf.meta.stackexchange.com/a/9032/8340
dana
Das würde die Unstimmigkeiten erklären, die ich gesehen habe.
Asgallant
5

K (oK) , 24 Bytes

Lösung:

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

Probieren Sie es online!

Erläuterung:

Generieren Sie die 6 4 2 0 1 3 5Sequenz, verwenden Sie diese, um die aufsteigenden Längen der Eingabe zu indizieren, und verwenden Sie diese, um das ursprüngliche Array zu indizieren:

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
quelle
5

Gelee , 9 8 Bytes

LÞŒœm"-Ẏ

Probieren Sie es online!

LÞŒœṚ;¥/

ist auch 8 Bytes.

Vielen Dank an @EriktheOutgolfer und @JonathanAllan, die beide Golf anbieten, um ein Byte zu sparen.

Nick Kennedy
quelle
Nett! Cleveres Golfen: Ṛ€1¦kann werden m"-.
Erik der Outgolfer
Oder Sie könntenLÞŒœṚ;¥/
Jonathan Allan
5

05AB1E , 6 5 Bytes

Dank Kevin Cruijssen 1 Byte gespeichert

I / O ist eine Liste von Strings.
Der Link wurde für durch Zeilenumbrüche getrennte E / A geändert, um das Testen zu erleichtern.

éι`Rì

Probieren Sie es online!

Erläuterung

é       # 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
quelle
Sie können die erste entfernen Rund ersetzen «mit ieinem Byte zu speichern, da die dritte Kugel-Punkte - Regel beide Versionen können von uninterleaving.
Kevin Cruijssen
@ KevinCruijssen: Oh ja, danke!
Emigna
5

J , 11 Bytes

,~`,/@\:#&>

Probieren Sie es online!

Wir sortieren es zuerst.

Dann verkleinern wir die Listenform von rechts nach links, wechseln aber ab, auf welcher Seite wir das neue Element platzieren. Getan.

Jona
quelle
Sehr schön! Sie haben ein Leerzeichen am Ende, entfernen Sie es für 11 Bytes :)
Galen Ivanov
1
Danke Galen. Fest!
Jonah
4

PowerShell , 66 Byte

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

Probieren Sie es online!

Nimmt Eingaben über Splatting entgegen, die sich in TIO als separate Befehlszeilenargumente manifestieren. sorts on the length speichert dies in $aund erstellt einen Bereich von 1bis zu den countvon Eingabezeichenfolgen. Wir ziehen dann nur die ungeraden heraus ?{$_%2}und füttern diese in eine Schleife |%{...}. Bei jeder Iteration setzen wir das "letzte", dann das "drittletzte" und so weiter auf die Pipeline mit $a[-$_]. Separat akkumulieren wir auch in $xder "vorletzten", "vorletzten" usw. Aus der Schleife und die Pipeline wird geleert (diese Elemente werden also ausgegeben) und dann ausgegeben $x. In beiden Fällen werden bei der Standardausgabe automatisch Zeilenumbrüche zwischen Elementen erstellt.

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

Probieren Sie es online!

-3 Bytes dank @Ismael Miguel !

640 KB
quelle
Schön. Wo kann ich mehr darüber lesen [array_unshift,array_push][++$i%2]($e,$d)?
abhig10
2
@ abhig10 sicher. Es handelt sich um ein Array mit den beiden Funktionsnamen, ['array_push','array_unshift']wobei [++$i%2]der Index des Arrays bei jedem Wechsel zwischen etwa einer 0und einer 1anderen Funktion ausgewertet wird. Mit den "variablen Funktionen" von PHP können Sie einer Funktion eine Variable zuweisen und durch Aufrufen in Klammern (z. B. $f='array_push'; $f($e,$d);== array_push($e,$d)) ausführen, sodass ($e,$d)das ausgewertete Element des Arrays aufgerufen wird. Nur ein kürzerer Weg if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Schätze, es gab doch etwas syntaktischen PHP-Zucker!
640 KB,
Okay, ich habe einige Zeit gebraucht, um das zu verstehen. Genial.
abhig10
1
Sie können maximal 3 Bytes speichern durch Ersetzen [array_unshift,array_push][++$i%2]($e,$d)mit (array_.[unshift,push][++$i%2])($e,$d). Was ich getan habe war, das Wiederholte zu entfernen array_, es zu verketten und dann das Ergebnis an den Anruf weiterzuleiten.
Ismael Miguel
1
@IsmaelMiguel das ist genial. Vielen Dank!
640 KB,
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)}}'

Übernimmt Eingaben als Zellenarray von Zeichenfolgen und gibt eine Spalte mit Zeichenfolgen aus (nicht sicher, ob dies zulässig ist)

> 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: Vielen Dank an Sanchises für den Hinweis auf einen Fehler mit Eingaben ungerader Länge

aaaaa sagt wieder Monica
quelle
Dies schlägt bei einer ungeraden Anzahl von Eingabezeichenfolgen fehl, z. B.f({'loooooooong','medium','short'})
Sanchises
Auch einige allgemeine Golftipps: Das endist optional für a function. Verwenden function x=f(y);x={...}'ist kürzer als function f(y);disp({...}').
Sanchises
Wenn Sie nicht weiterkommen, würde ich das so machen.
Sanchises
@Sanchises danke für den Hinweis auf Fehler. Ich habe es genauso repariert wie Sie. Mein Problem mit dispist, ich bin nicht sicher, was Ausgaberegeln sind. Soll es reiner Text sein oder nicht? oder disp({...})ist okay oder auch nur, x={...}wie Sie vorschlagen
aaaaa sagt wieder Monica
1
Dies können 58 Bytes in Oktave sein.
Giuseppe
3

APL (Dyalog Unicode) , 18 Byte SBCS

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

Probieren Sie es online!

Der Fehler wurde dank @ngn behoben.

Erläuterung:

{⍵[⍋-@(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
quelle
1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)und es wird noch kürzer, wenn du es
ngn verwandelst
1
Ich bin mir jedoch nicht sicher, ob dieser Algorithmus korrekt ist. Wir sollten die Länge aller anderen Zeichenfolgen in ihrer sortierten Reihenfolge negieren, nicht in der Reihenfolge, in der sie von der Eingabe stammen
ngn
2

APL + WIN, 31 38 Bytes

Siehe Adams Kommentar

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

Probieren Sie es online mit freundlicher Genehmigung von Dyalog Classic!

Fordert zur Eingabe eines verschachtelten Zeichenfolgenvektors auf

Graham
quelle
Hat APL + nicht Monadic "Tally" zu ersetzen ∊⍴?
Adám
1
Scheitert an '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Klar, das Ergebnis hätte sein sollen'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám
@ Adám Meine alte Version von APL + hat kein ≢. Da ich mich auf Ihren zweiten Kommentar geeinigt habe, werde ich ihn mir morgen ansehen.
Graham
2

Netzhaut , 26 Bytes

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

Probieren Sie es online! Erläuterung:

N$`
$.&

Sortieren Sie die Zeilen in aufsteigender Reihenfolge der Länge ($.& gibt die Länge der Zeile zurück).

*\,2,^A`.+

Löschen Sie vorübergehend alternative Zeilen und geben Sie die verbleibenden Zeilen in umgekehrter Reihenfolge aus.

,2,G`.+

Behalten Sie die einzigen Zeilen bei, die vorübergehend gelöscht wurden, und geben Sie sie aus.

Neil
quelle
2

Gaia , 10 Bytes

el∫v:v+2%ụ

Probieren Sie es 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
quelle
4
Ich
finde es gut,
2

Japt, 8 Bytes

ñÊó g0_w

-3 Bytes dank Shaggy!

Versuch es

Verkörperung der Ignoranz
quelle
10 Bytes bei Ausgabe als 2D-Array, was anscheinend erlaubt wäre.
Shaggy
Oder vielleicht 8 Bytes ? Auf meinem Handy habe ich es also nicht richtig getestet.
Shaggy
@ Shaggy Ich suchte nach einer Funktion, um jedes n-te Element zu finden, konnte es aber nicht finden. Vielen Dank!
Verkörperung der Ignoranz
Es gibt auch, A.ë()aber ich weiß nicht, ob das zu einer kürzeren Lösung führen wird.
Shaggy
2

T-SQL, 84 Bytes

Die Eingabe ist eine Tabellenvariable

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

Probieren Sie es online aus

t-clausen.dk
quelle
2

Perl 6 , 31 Bytes

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

Probieren Sie es online!

Nach Stringlänge sortieren, dann nach statischer Reihenfolge 0, -1, 0, -3, 0, -5, ...

nwellnhof
quelle
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;},[]);
irgendjemand
quelle
-1 s.sort()sortiert die Zeichenfolgen lexikografisch, nicht nach Zeichenfolgenlänge.
Asgallant
Richtig, (x, y) => x.length-y.length, sollte das beheben.
irgendwann
1

Rot , 116 101 Bytes

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

Probieren Sie es online!

Galen Ivanov
quelle
1

Perl 5 ( -p0777F/\n/ -M5.01), 59 Bytes

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

TIO

Nahuel Fouilleul
quelle
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];}

Probieren Sie es online!

-8 bytes dank ceilingcat.

Die Funktion fist die Lösung. Die Anzahl der Zeichenfolgen, die Zeichenfolgen selbst und der Ausgabepuffer werden als Argumente verwendet (plus vier weitere, die intern verwendet werden).

LambdaBeta
quelle
Warum ist ./.bin.tioin der Ausgabe ?
Ziege
@ TeleportingGoat Wahrscheinlich, weil ihre Fußzeile alle verwendet argv, einschließlich des Dateinamens
Jo King
Genau, es war nur ein kurzer Test. Man kann beliebige Daten erstellen, die ein geeignetes Format haben. Ich werde den TIO-Link später aktualisieren.
LambdaBeta
haha, das problem mit diesen kurzen variablennamen: du vergisst was du eigentlich willst tund behältst es auch dann bei, wenn du es nicht brauchst!
LambdaBeta
122 Bytes
Ceilingcat
0

Japt , 8 Bytes

Eingabe als ein Array von Zeilen, Ausgabe als ein Array von 2 Arrays von Zeilen, eines für jede Hälfte der Liste.

ñÊó
hUÎÔ

Probieren Sie es aus (zusätzlicher Code für E / A als durch Zeilenumbrüche getrennte Zeichenfolge)

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

Probieren Sie es online!

Bugs
quelle
Ungültig, Sie müssen sortieren, bevor Sie die Liste in zwei
Hälften
90
Nur ASCII