長さmのn個の文字列を長さnのm個の文字列に変換する


16

「m」の長さの「n」個の文字列を指定すると、次の条件で「m」個の「n」長の文字列を返すプログラムを作成します。

すべての新しい文字列には、他の文字列と同じインデックスの文字が含まれている必要があります

たとえば、最初の出力文字列にはすべての入力文字列の最初の文字が含まれている必要があり、2番目の出力文字列にはすべての入力文字列の2番目の文字が含まれている必要があります。

例(文字の下の数字は文字列のインデックスです):

input: "car", "dog", "man", "yay"
        012    012    012    012
output: "cdmy", "aoaa", "rgny"
         0000    1111    2222

input: "money", "taken", "trust"
        01234    01234    01234
output: "mtt", "oar", "nku", "ees", "ynt"
         000    111    222    333    444

入力が毎回正しいと仮定する

最短バイトのコードが勝ちます!

編集:

多くのプログラミング言語があり、それぞれに多くの解決策がある可能性があるため、各プログラミング言語とそれを提供したユーザーに最も短い解決策を投稿します。コーディングを続けてください!

再編集:

ユーザーDennisのおかげで、リーダーボードにスニペットを挿入しました。


2
我々は持っているリーダーボードスニペットを使用すると、あなたの質問本体に追加することができます。手作業で行う必要はありません。
デニス


申し訳ありませんが、「転置」と呼ばれることは知りませんでした
ここに名前を入力してください

6
他の質問では不規則な転置といくつかの奇妙な空白の処理に違いがあるため、これらの課題は重複しているとは思わない。一部の言語では回答が非常に似ている場合がありますが、ほとんどの場合、それらは重複しないように十分に異なると思います。
FryAmTheEggman

回答:



9

Python、36 29バイト

zip(*s) 転置された各文字のタプルのリストを返します。

lambda s:map(''.join,zip(*s))

オンラインで試す


出力に"cdmy", "aoaa", "rgny"は、リスト["cdmy", "aoaa", "rgny"]またはタプルがあります("cdmy", "aoaa", "rgny")
-mbomb007

map(''.join,zip(*s))また、文字列変換(パイソン2のみ)のために働く、とPython 3のために、[*map(''.join,zip(*s))]私の知る限り動作
値インク

@ KevinLau-notKenny map(''.join,zip(*s))はPython 3でも有効です-デフォルトでリストの代わりにイテレーター/ジェネレーターを許可します。
メゴ



7

PowerShell v2 +、66 54バイト

param($n)for($x=0;$n[0][$x];$x++){-join($n|%{$_[$x]})}

Yo ... no map、no zip、no transpose、など。ビッグに小道具@DarthTwon 12バイトのゴルフのために。

入力を受け取り$nforループを設定します。初期化はに設定さ$x0、テストはwordにまだ文字があるかどうかで、各反復$n[0][$x]をインクリメントし$x++ます。

ループ内で、文字列の配列を取得し、各単語から適切な文字を吐き出す内部ループにパイプします。それは-join文字列を形成するためにカプセル化され、その文字列はパイプラインに残ります。実行が終了すると、パイプライン上の文字列が暗黙的に出力されます。

PS C:\Tools\Scripts\golfing> .\convert-n-strings.ps1 "Darth","-Twon","Rocks"
D-R
aTo
rwc
tok
hns

1
私が見てみたかったの答えのようなものだニース、;)それはあまりにも簡単な書き込みだ,答え程度ではなく、思考
ここで入力名

whileループを使用すると、それをさらに削減できますparam($n)$x=0;while($n[0][$x]){-join($n|%{$_[$x]});$x++}。ここにエラーはありません:D
ThePoShWolf

@DarthTwonすばらしい。または、for別の2つのループを使用します。;-)
AdmBorkBork

うーん...私はそれを試しましたが、実際にwhileループを切り詰めた後ではありません。お疲れ様でした!
ThePoShWolf

PowershellでLinqを使用できますか?
aloisdgは、モニカーを復活させる

7

Vim、37 36キーストローク

他のすべての答えは退屈で、退屈なシングルバイト組み込みを使用しています。プログラミング言語ではないもので、すべてを手動で行うハックの答えは次のとおりです。

Gmaqqgg:s/./&<cr>d<C-v>`aGo<esc>pvGgJ@qq@q`adgg

説明:

G                                   "move to the end of this line
     ma                             "And leave mark 'a' here
       qq                           "Start recording in register 'q'
         gg                         "Move to the beginning
           :s/./&<cr>               "Assert that there is atleast one character on this line
                      d             "Delete
                       <C-v>        "Blockwise
                            `a      "Until mark 'a'

    G                               "Move to the end of the buffer
     o<esc>                         "Open a newline below us
           p                        "And paste what we deleted
            vG                      "Visually select everything until the end
              gJ                    "And join these without spaces
                @q                  "Call macro 'q'. The first time, this will do nothing,
                                    "The second time, it will cause recursion.
                  q                 "Stop recording
                   @q               "Call macro 'q' to start it all

これですべてが正常になりましたが、バッファーには余分なテキストが残っています。だから私たちは:

`a                              "Move to mark 'a'
  dgg                           "And delete everything until the first line



4

網膜45 43バイト

バイトカウントはISO 8859-1エンコードを前提としています。

O$#`.(?<=(.+))|¶
$.1
!`(?<=(¶)+.*)(?<-1>.)+

主要な改行は重要です。入力と出力は、印刷可能なASCII文字列の改行で終わるリストです(両方に単一の末尾改行があることに注意してください)。

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

私はしばらくの間、長方形のブロックの転置がRetinaの苦痛になることを知っていましたが(正方形の転置はそれほど悪くない)、実際に試したことはありませんでした。最初の解決策は実際には110バイトという途方もない長さでしたが、アプローチにいくつかの大幅な変更を加えた後、結果の45バイトは私が思ったほど悪くはありません(しかしまだ...)。明日は説明が続きます。

説明

ステージ1:並べ替え

O$#`.(?<=(.+))|¶
$.1

これは、入力内の文字を並べ替える主な作業を行いますが、最終的に行の区切りを台無しにします。興味深いことに、を削除すると、正方形の入力を転置するために必要なコードが取得されます。

ソートステージ(で示されるO)は次のように機能します。指定された正規表現(の後ろのもの`)のすべての一致を見つけ、それらの一致を並べ替えて、一致が見つかった場所に再挿入します。たまたま、この正規表現はすべての単一文字に一致します:.(?<=(.*))代替による非改行とによる改行。したがって、入力内のすべての文字をソートします。より興味深い部分は、それらがソートされるものです。

この$オプションは、「ソートバイ」モードをアクティブにします。このモードでは、各一致が2行目の置換パターンに置き換えられ、一致の比較に使用されます。さらに、#置換の結果を整数に変換し、それらの整数を(文字列として扱う代わりに)比較するようにRetinaに指示します。

最後に、正規表現と置換を調べる必要があります。最初の選択肢が一致する場合(つまり、1 (?<=(.*))行内の任意の文字に一致した場合)、その行のその文字までのすべてをgroupにキャプチャします1$.1置換パターン内でこれを置き換えるグループの1。したがって、各文字列の最初の文字はになり1、2番目の文字はになり2、3 番目の文字は次の3ようになります。これが正方形の入力をどのように転置するかが明確になるはずです:行の最初のすべての文字が最初に来てすべてが一番上の行になり、次にすべての2番目の文字が2行目になります。しかし、これらの長方形の入力については、改行も一致しています。グループ以来1この場合、未使用の場合、置換は空ですが、#オプションの目的上、これは考慮され0ます。つまり、すべての改行が前にソートされます。

したがって、最初の文字(各文字列の最初の文字、各文字列の2番目の文字など)の文字と、最初のすべての改行があります。

ステージ2:試合

!`(?<=(¶)+.*)(?<-1>.)+

ここで、文字を正しい長さの行に分割する必要があります。この長さは、元の入力の行数に対応しています。これは、文字列の先頭にある改行の数に対応しています。

ここで分割は、指定された正規表現のすべての一致を検索し、!オプションを使用してそれらの一致を出力する一致ステージの助けを借りて行われます(デフォルトでは代わりにカウントされます)。したがって、正規表現の目標は、一度に1行を一致させることです。

後読みで数を「数える」ことから始め(?<=(¶)*.*)ます。1前面の改行ごとにグループで1つのキャプチャを生成します。

次に、これらのキャプチャのそれぞれについて、単一の文字をと一致させ(?<-1>.)+ます。


4

x86マシンコード、19バイト

16進数で:

fc89d35651a401dee2fb91aa595e464a75f1c3

入力::ECX文字列の数(n)、: EDX個々の文字列の長さ(m)ESI、:入力文字列の配列、EDI:文字列の配列を受け取る出力バッファ。配列はchar src[n][m+1]入力およびchar dst[m][n+1]出力として定義されていると想定され、すべての文字列はNULLで終了します。

0:  fc                  cld
1:  89 d3               mov ebx,edx   ;EDX is the counter for the outer loop
_outer:
3:  56                  push esi
4:  51                  push ecx
_inner:
5:  a4                  movsb         ;[EDI++]=[ESI++]
6:  01 de               add esi,ebx   ;Same char, next string
8:  e2 fb               loop _inner   ;--ECX==0 => break
a:  91                  xchg eax,ecx  ;EAX=0
b:  aa                  stosb         ;NULL-terminate just completed string
c:  59                  pop ecx
d:  5e                  pop esi       ;First string,
e:  46                  inc esi       ;...next char
f:  4a                  dec edx
10: 75 f1               jnz _outer
12: c3                  ret

3

Brachylog、5バイト

z:ca.

入力として文字列のリストを期待します。例えば run_from_atom('z:ca.',["money":"taken":"trust"],Output).

説明

z       Zip the strings in the Input list
 :ca.   output is the application of concatenation to each element of the zip

3

05AB1E、3バイト

ø€J

説明した

     # implicit input, eg: ['car', 'dog', 'man', 'yay']
ø    # zip, producing [['c', 'd', 'm', 'y'], ['a', 'o', 'a', 'a'], ['r', 'g', 'n', 'y']]
 €J  # map join, resulting in ['cdmy', 'aoaa', 'rgny']

オンラインで試す



2

JavaScriptのES6、48の、46バイト

a=>[...a[0]].map((n,x)=>a.map(a=>a[x]).join``)

取り残されたように感じますが、組み込みのzip機能はありません。タイプエラーを指摘してくれたnicaelに感謝します。

使用法

(a=>[...a[0]].map((n,x)=>a.map(a=>a[x])))(["asd","dsa"]); //or whatever is above, might change due to edits

戻り値

["ad","ss","da"]

例外:TypeError:a [0] .mapは関数ではありません
edc65

1
配列ではないため[...a[0]].map、必要a[0]です。
ニカエル

@nicaelありがとう。タイプを台無しにしました。これは、私がこれを早朝にゴルフしてはならない理由を証明しています。
チャーレッドグラス

@nicael .joinその問題を修正するためにそれらを編集しました。
チャーレッドグラス

1
join`` join('')2バイトを節約する代わりに。Downvote撤回
-edc65

2

Bash + BSDユーティリティ、27

sed s/./\&:/g|rs -c: -g0 -T

STDIN / STDOUT改行区切り文字列を介したI / O。

あなたはインストールする必要があるかもしれませんrssudo apt install rs、または類似しました。OS Xでそのまま使用できます。

-Tオプションは、rs移調の力仕事を行います。残りは単なる書式設定です。

  • このsedコマンドは:、すべての文字の後に単に挿入します
  • -c:入力列を:区切ることを指定します
  • -g0 出力列の幅がゼロであることを指定します

私のrsマンページの読みが正しい場合、次のスコアは12で機能するはずですが、残念ながら機能しません-以下の注を参照してください:

rs -E -g0 -T

出力例:

$ printf "%s\n" car dog man yay |sed s/./\&:/g|rs -c: -g0 -T
cdmy
aoaa
rgny
$

入力がすべて印刷可能なASCIIであると予想される場合、印刷:できない文字、たとえば0x7で置き換えることができますBEL


注意

-Eは、sed前処理を取り除くためのオプションを取得できなかった理由を理解したかったのです。rsここでソースコードを見つけました。ご覧のとおり、このオプションを指定すると、ONEPERCHARフラグが。ただし、このフラグの状態を実際にチェックするコードには何もありません。ですから、オプションが文書化されているにもかかわらず、実装されていないと言えます。

実際、このオプションはLinux rsマンページに記載されています。

-E入力の各文字を配列エントリと見なします。

OS Xバージョンではありません。


2

PHP、82バイト

function f($a){foreach($a as$s)foreach(str_split($s)as$i=>$c)$y[$i].=$c;return$y;}

文字列の配列を受け取って返します

壊す

function f($a)
{
    foreach($a as$s)                    // loop through array $a
        foreach(str_split($s)as$i=>$c)  // split string to array, loop through characters
            $y[$i].=$c;                 // append character to $i-th result string
    return$y;
}

$samples=[
    ["asd","dsa"], ["ad","ss","da"],
    ["car", "dog", "man", "yay"], ["cdmy", "aoaa", "rgny"],
    ["money", "taken", "trust"], ["mtt", "oar", "nku", "ees", "ynt"]
];
echo '<pre>';
while ($samples)
{
    echo '<b>in:</b> ';         print_r($x=array_shift($samples));
    echo '<b>out:</b> ';        print_r(f($x));
    echo '<b>expected:</b> ';   print_r(array_shift($samples));
    echo '<hr>';
}

2

APL、3バイト

↓⍉↑

入力文字列を受け取り、char行列に変換します。 行列を転置します。 結果の行列の行を文字列に分割します。



1

Mathematica、26バイト

""<>#&/@(Characters@#)&

匿名関数。入力として文字列リストを受け取り、出力として文字列リストを返します。Unicode文字はU + F3C7で、を表し\[Transpose]ます。文字マトリックスへの変換、転置、および文字列リストへの変換によって機能します。入力/出力形式が拡張されている場合、単純な5バイトの転置が機能します。

#&

+1パンチで私を打ちました!(しかし、Transposeシンボルを使用できませんでした。)ところで、なぜTが画面に表示されないのですか?(あなたのコードをMathematicaにコピーするとそこにあります)。
DavidC

Unicode Mathematicaのフォントはたまたまこの文字を上付き文字Tとしてレンダリングし、として解釈し\[Transpose]ます。
LegionMammal978

@DavidCなぜ使用しないのですか?
アダム

アダムIDK @、あなたがない私、そのことについてWolfram Researchに依頼する必要があるだろう
LegionMammal978

@ LegionMammal978いや、APLが明らかな限りは嬉しいです
アダム

1

MATLAB /オクターブ、4バイト

@(x)x'

これは、匿名関数を定義します。入力形式は['car'; 'dog'; 'man'; 'yay']です。

ここで試してみてください


このソリューションへの入力はどのような形式ですか?私はあなたが、Matlabbyの方法で入力彼らにしようとした場合、それは仕方Matlabのハンドル文字列で動作するとは思わない例えばf = @(x)x'f([{'abcd'},{'abcd'},{'abcd'}])出力ANS =「ABCD」「ABCD」「ABCD」
sintax

@sintax入力形式は、回答でリンクされている例のように、2D char配列でなければなりません。文字列のセル配列(シングルトンセル配列を連結することで取得)を使用しています。次のようになりますf(['abcd';'abcd';'abcd'])。入力形式を指定するために回答を編集しました
ルイスメンドー

1

Haskell、41バイト

f l=zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0

またはもう少し空気を入れて:

f l = zipWith ($) [map (!! n) | n <- [0..]] $
                  l <$ (l !! 0)

2番目のリストは、「単語の長さ」回繰り返される単語のリストです。単語の各リストで、各単語のn番目の文字を選択して結果を出します。


1
「プログラム」は「プログラムまたは機能」を意味するため、完全なプログラムは必要ありません。したがって、機能で十分です。文字列のリストを渡して返すことができるためwords、andを省略できunwordsます。さらに、map(\_->l)(l!!0)ですl<*l!!0ので、に要約され\l->zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0ます。
-nimi

ああ、ありがとう:)私は更新しています。
villou24

おっと、タイプミス:(l<$l!!0最初は間違っていて、2回目は正しい)が、とにかく正しくなった。
nimi

1

Common Lisp、62バイト

(lambda(s)(apply'map'list(lambda(&rest x)(coerce x'string))s))

このmap関数は、結果の型(ここではlist)、適用する関数f、および1つ以上のシーケンスs1、...、snを取ります。すべてのシーケンスは並行して繰り返されます。これらのシーケンスから取得した要素の各タプル(e1、...、en)に対して(f e1 ... en)を呼び出し、結果が目的のタイプのシーケンスに蓄積されます。

という文字列のリストを取得し("car" "dog" "man" "yay")、を使用してapplyを呼び出しますmap。入力リストがに対するより多くの引数として使用されるように、これを行わなければなりませんmap。より正確には、これ:

(apply #'map 'list fn '("car" "dog" "man" "yay"))

...は次と同等です:

(map 'list f "car" "dog" "man" "yay")

また、文字列はシーケンスであるため、最初のすべての文字、次に2番目の文字などすべてを並列に繰り返します。たとえば、最初の繰り返しではfを次のように呼び出します。

(f #\c #\d #\m #\y)

匿名ラムダは、指定された引数のリストを取得して、文字列に強制的に戻します。



0

ルビー、46バイト

処理する前に文字列を配列にマッピングしなければならなかったので、おそらく「Ruby文字列はEnumerablesではありません」というのは初めてです。(通常、使用するString#charsだけでは問題になるほどのバイト損失ではありませんが、それらをマップする必要があるため、より多くのことを刺します)

->s{s.map!(&:chars).shift.zip(*s).map &:join}

0

Clojure、68バイト

#(map(fn[g](reduce(fn[a b](str a(nth b g)))""%))(range(count(% 0))))

reduce0から最初の文字列の長さの範囲にある(リストの要素に1つずつ進み、文字列のn番目の文字を結合する)関数をマッピングします。

オンラインで見る:https : //ideone.com/pwhZ8e


0

C#、53バイト

t=>t[0].Select((_,i)=>t.Aggregate("",(a,b)=>a+b[i]));

C#lambda(Func)ここで、出力はでIList<string>あり、出力はIEnumerable<string>です。私zipは他の言語でどのように機能するかわかりませんが、ここでC#のものを使用する方法を見つけることができません。Aggregateニーズにうまく適合します。C#でのいかなる転置は、ありません1 Excelで、私はそれを使用して文句を言いません。

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

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