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.

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!


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.


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
  )

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



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

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.


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.


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 !


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


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

¹


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


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.



2

Japt, 8 Bytes

ñÊó g0_w

-3 Bytes dank Shaggy!

Versuch es


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




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

-1 s.sort()sortiert die Zeichenfolgen lexikografisch, nicht nach Zeichenfolgenlänge.
Asgallant

Richtig, (x, y) => x.length-y.length, sollte das beheben.
irgendwann



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


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.