これらの変数に矢印を付けてください!


29

チャレンジ

ロビンは、変数宣言を矢印の形にすることが好きです。彼のやり方は次のとおりです。

  • 任意の数の文字列を入力してください
  • 長さを昇順に並べる
  • 次のように、中央で順序付けられた出力を出力し、おおよそマイナスの矢印を形成します(ゴルフの順序が最も良い場合)。

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

テストケース

入力:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

出力:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

入力:

a
bb
cc

出力(両方とも有効):

bb
a
cc

cc
a
bb

入力:

one
four
seven
fifteen

可能な出力(他の有効な出力は垂直ミラーのみです):

seven
one
four
fifteen

ノート

  • 文字列はcamelCaseにあり、数字や特殊文字は使用せず、小文字と大文字のみを使用します。

  • 入力には任意の名前を指定できます。1つの文字列、配列などとしてコンマで区切られます...任意のI / O形式が許可されます。

  • 同じ長さの文字列の間では、任意の順序が受け入れられます。

以前と同様の課題があったように感じます...しかし、PPCGへようこそ!
ジュゼッペ

@Giuseppeええ、投稿後に考えたことです。これまでにない方法はありません。回答したので削除しても大丈夫ですか?
ヤギのテレポート

1
まあ、私は馬鹿を探していましたが、私は検索があまり得意ではありません...私たちはそのようなことをしばしばキャッチできるチャレンジを投稿するためのサンドボックスを持っています。あなたがそれがだまされているのではないかと心配しているなら、私はあなたがそれを削除しても大丈夫です。
ジュゼッペ

1
大丈夫です、私たちは皆最初から始めます:-)
ジュゼッペ

1
偶数の文字列でテストケースを追加できますか?
Sherlock9

回答:


15

Python 2、47バイト

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

オンラインでお試しください!


いくつかのものを再配置する必要がありますが、[::-2]直接使用して5バイトを節約できます。
Sherlock9

@ Sherlock9私はそれを試してみましたが、偶数/不均等な長さのリストは異なる方法で処理する必要があるため、長さを確認する必要がありました。
ovs

Python 3でも動作します。「lambda l:」と「or」を削除し、11行を節約するために2行にすると、「任意のI / O形式が許可されます」として受け入れられますか?
ポテト

9

R63 48バイト

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

オンラインでお試しください!

文字列の長さで並べ替え、逆のリストと並べ替えられたリストを組み合わせ、最後に1から始まるインデックス1から2番目の要素をすべて取得します。


1
o<-L[...「矢印変数」への別の方法。それほど重要ではありませんが、pryr::f(...)46でここで動作します。オンラインで試してください!
CriminallyVulgar

追加のライブラリを使用する@CriminallyVulgarはこれを別の言語に変えます。R + pryrそのため、数論の質問のように、正当な理由がない限り、私は通常それを行うことを避けnumbersます。
ジュゼッペ

7

Javascript 77バイト

入力を文字列の配列として受け取り、矢印でソートされた文字列の配列を出力します。

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

説明

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
数える必要はないと思うf=77
ダナ

それは私が見たものからのjsコードゴルフの提出物と矛盾しています。カウントされない場合は除外できます。
アスガルント

2
関数が再帰を使用するかどうかに依存すると思います。すなわちf=x=>x?f(x-1)。その場合f、関数で呼び出すため、含める必要があります。ただし、再帰を使用していないため、を含める必要はありませんf。Metaにはいくつかの投稿がありますが、これはもう少しよく説明しているようです。codegolf.meta.stackexchange.com/a/9032/8340
dana

それは私が見た矛盾を説明するでしょう。
アスガルント


5

K(oK)、24バイト

溶液:

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

オンラインでお試しください!

説明:

6 4 2 0 1 3 5シーケンスを生成し、それを使用して入力の昇順の長さにインデックスを付け、それを使用して元の配列にインデックスを付けます。

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

ゼリー9 8バイト

LÞŒœm"-Ẏ

オンラインでお試しください!

LÞŒœṚ;¥/

また、8バイトです。

@EriktheOutgolferと@JonathanAllanに、バイトを節約するためのゴルフを提供してくれてありがとう。


いいね!賢いゴルフ:にṚ€1¦なることができm"-ます。
エリック・ザ・アウトゴルファー

それとものために行くことができるLÞŒœṚ;¥/
ジョナサン・アラン


5

05AB1E6 5バイト

Kevin Cruijssenのおかげで1バイト節約

I / Oは文字列のリストです。
テストを簡単にするために、リンクは改行で区切られたI / O用に変更されます。

éι`Rì

オンラインでお試しください!

説明

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

3番目の箇条書き規則では両方のバージョンのインターリーブ解除が許可されているため、最初のバイトを削除してR置換«iてバイトを保存できます。
ケビンクルーッセン

@KevinCruijssen:そうそう、ありがとう!
エミグナ

5

J、11バイト

,~`,/@\:#&>

オンラインでお試しください!

まず整理します。

次に、リスト形式を右から左に縮小しますが、新しい要素をどちら側に配置するかを交互に変えます。できた


非常に素晴らしい!ただし、最後にスペースがあります。11バイト削除してください:)
Galen Ivanov

1
ガレン、ありがとう。一定!
ジョナ

4

PowerShell、66バイト

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

オンラインでお試しください!

スプラッティングを介して入力を受け取ります。スプラッティングは、TIOに個別のコマンドライン引数として現れます。sortlさで$a、それをに格納し、入力文字列1までの範囲を構築しcountます。次に、奇数のもののみを引き出し、?{$_%2}それらをループに送ります|%{...}。反復ごとに、「最後」、次に「最後から3番目」などをパイプラインに配置し$a[-$_]ます。それとは別に、$x「最後から2番目」、「最後から4番目」などにも蓄積します。ループからパイプラインがフラッシュされ(これらの要素が出力される)、それからを出力します$x。どちらの場合も、デフォルトの出力はアイテム間の改行を自動的に提供します。


4

PHP144 141バイト

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

オンラインでお試しください!

@Ismael Miguelのおかげで-3バイト!


良いですね。どこでもっと読むことができ[array_unshift,array_push][++$i%2]($e,$d)ますか?
abhig10

2
@ abhig10確かに。これは、2つの関数名を['array_push','array_unshift']持つ[++$i%2]配列であり、配列のインデックスとして交互に1 01ずつ交互に他の関数に評価されます。PHPの「変数関数」を使用すると、関数に変数を割り当てて、かっこ(ex:$f='array_push'; $f($e,$d);== array_push($e,$d))を呼び出すことで実行できるため($e,$d)、配列の評価された要素を呼び出すことができます。簡単な方法ですif (++$i%2) array_push($e,$d); else array_unshift($e,$e);。結局、PHPの構文糖衣があったと思います!
640KB

さて、これを理解するのに時間がかかりました。驚くばかり。
abhig10

1
に置き換える[array_unshift,array_push][++$i%2]($e,$d)と、3バイト節約できます(array_.[unshift,push][++$i%2])($e,$d)。私がしたことは、繰り返されたものを削除し、array_それを連結し、結果が呼び出しに渡されることでした。
イスマエルミゲル

1
@IsmaelMiguelそれは素晴らしいです。ありがとうございました!
640KB

4

MATLAB、87バイト

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

入力を文字列のセル配列として受け取り、文字列の列を出力します(正当かどうかはわかりません)

> 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:奇数長入力のバグを指摘してくれたSanchisesに感謝


これは、入力文字列の奇数、例えば上の失敗f({'loooooooong','medium','short'})
Sanchises

また、いくつかの一般的なゴルフのヒント:はのendオプションですfunction。を使用するfunction x=f(y);x={...}'よりも短いですfunction f(y);disp({...}')
Sanchises

あなたが立ち往生している場合、ここに私がそれをする方法があります。
Sanchises

@Sanchisesはバ​​グを指摘してくれてありがとう。あなたと同じように修正しました。私の問題dispは、出力ルールがわからないことです。純粋なテキストかどうか またはdisp({...})大丈夫、あるいはx={...}あなたが示唆する
とおり

1
これは、Octave で58バイトです。
ジュゼッペ

3

APL(Dyalog Unicode)、18 バイトSBCS

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

オンラインでお試しください!

@ngnのおかげでバグを修正しました。

説明:

{⍵[⍋-@(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*⍳∘⍴-> (⊢∘-\≢¨)dfnに変換するとさらに短くなります
ngn

1
ただし、このアルゴリズムが正しいかどうかはわかりません。我々は彼らのソート順ではなく、彼らは入力から来るために、他のすべての文字列の長さを否定すべきである
NGN

2

APL + WIN、31 38バイト

アダムスのコメントを見る

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

Dyalog Classicのおかげでオンラインで試してみてください!

文字列のネストされたベクトルのプロンプト


APL + に代わるMonadicの「集計」機能はありません∊⍴か?
アダム

1
失敗し'12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'ます。明らかに、結果がされている必要があります'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
アダム

@Adám旧バージョンのAPL +にはnotがありません。2番目のコメントに同意し、明日それを見ていきます。
グラハム

2

網膜、26バイト

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

オンラインでお試しください!説明:

N$`
$.&

行を長さの昇順で並べ替え$.&ます(行の長さを返します)。

*\,2,^A`.+

代替行を一時的に削除し、残りの行を逆の順序で出力します。

,2,G`.+

一時的に削除された行のみを保持して出力します。



2

Japt、8バイト

ñÊó g0_w

シャギーのおかげで-3バイト!

それを試してみてください


2D配列として出力される10バイト。これは許可されているようです。
シャギー

または、多分、8バイト?私の携帯電話では、適切にテストしていません。
シャギー

@Shaggy n番目の要素をすべて見つける関数を探していましたが、見つけることができませんでした。ありがとう!
無知の具現化

ありA.ë()ますが、それがより短いソリューションにつながるかどうかはわかりません。
シャギー




1

Javascript 95バイト

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()は、ストリングの長さではなく、辞書式にストリングをソートします。
19:34の

右、(x、y)=> x.length-y.length、それを修正する必要があります。
somsom



1

C(gcc)136 128バイト

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

オンラインでお試しください!

ceilingcatのおかげで-8バイト。

機能fが解決策です。文字列の数、文字列自体、および出力バッファを引数として取ります(さらに内部で使用される4つ)。


なぜ./.bin.tio出力
ヤギ

@TeleportingGoatおそらく彼らのフッターがすべて使用されているのでargv、ファイル名を含む、
ジョー・キング

まさに、簡単なテストでした。適切な形式のデータを作成できます。TIOリンクは後で更新します。
ラムダベータ

ハハ、これらの短い変数名の問題:tそもそも自分が嫌いなものを忘れて、それが必要でないときでもそれを保持してください!
ラムダベータ


0

Japt、8バイト

入力は行の配列として、出力はリストの半分ごとに1つずつの2つの行の配列として出力されます。

ñÊó
hUÎÔ

試してみてください(I / Oを改行区切り文字列として許可する追加コード)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.