CodeGolf-ノイズを無視する#1


15

説明書

Barryは、クライアントのショップで行われた購入に関する情報を提供する小さなAPIを担当するそれほど優れたバックエンド開発者ではありません。ただし、彼は素晴らしい仕事をしておらず、上司から代わりにクライアント側で修正するように言われています。理想的にはあなたのようなカンマ区切り値を受けるべき927,2,45,90のようなものに対応しますitem_iditem_amountunit_pricetotal

この最初のパズルでは我々だけを気にitem_idしてitem_amountいますが、問題を提示する代わりに他のフィールドを必要としています。バリーは、時々混ぜものとリターンノイズ出力の一部として、彼はまた戻って、順序が間違っを取得を取得しnoisenoiseunit_pricetotalitem_iditem_amount

あなたのタスク

あなたはのペアマップ(または類似の構造)に格納する必要があるitem_iditem_amountにかかわらず、バリーが正しくかどうか、それらを返し、可能な文字の最小数に新しい行の各要素を印刷するかどうか。(保存は必須ではなく、出力に注意するだけです)

サンプル入力(正しい形式と乱雑な形式の混合)

103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000

言い換えると、入力は、&が重要な場所のいずれかa,b,x,xまたはx,x,x,x,a,b場所になります。csvのすべての行で(または他の名前)と呼ばれる変数があると仮定して、コードを提供する必要があります。abG

サンプル出力

103,2
106,1
67,2 //This one was messy
4,20

公差

答えになると、許容範囲に一定のマージンがあります。同様の形式で正しい値に準拠した回答も受け入れられます。フォーマットは好き[a,b](a,b)または{a,b}有効であるが、a,b好ましいです。

最初のパズルは、簡単かつ迅速に解決できるという事実により、受け入れられていましたが、一部の人々もそれを気に入っていると感じました。それで、今のところクイックゴルフを続けます


入力は常に形式でx,x,x,xあり、x,x,x,x,x,xどこxが数字を示しますか?
スピカトリックス

はい、入力はこれらの2つの形式のいずれかに従います。
フアン・コルテス

プログラムや関数などを提出する必要がありますか?また、どこからすべての入力を取得できますか?
Spikatrix

3
クイックゴルフは本質的に難易度タグです。コンセンサスは、それらは必要ないということですので、今はそのタグを削除します。難易度タグを再評価したい場合は、メタタグを投稿してください。しかし、それは大規模なタグの変更作業であり、個々のユーザーが任意の新しいタグを作成するのではなく、調整された方法で行われるべきだと思います。
マーティンエンダー

2
@CoolGuyそのようなことはありません。CでPythに勝つことは想定されていません(決して行かないため)喜びは、同じ言語または同様の冗長性のある言語で他の提出物を打ち負かすことにあります。すでに50バイトのCの提出があった場合、投稿しないことを理解できました(それでも、アプローチが異なっていて興味深い場合は投稿するかもしれません)。ただし、存在しないため、回答を投稿してください。それはC.のために過度に長い間違いではありませんので、あなたは、かなり近いのJavaScriptとPythonのだ
マーティン・エンダー

回答:


8

Pyth、10バイト

FNG<.<N4 2

オンラインで試す:Pyth Compiler / Executor

(最初の4文字は=G.Qすべてのデータを読み取り、に保存しますG

説明

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements

4
美しい、私はすでにPythが好きになり始めています
フアンコルテス

3
@JuanCortés:これは、Pythを使い始めたい場合に役立つリソースです。
アレックスA.


7

Python 3、123 76 72 62バイト

私は新人です、どこかで始めなければなりません...

 for l in G:
  d=l.rstrip().split(',');x=[0,4][len(d)>5];print(d[x:x+2])

xnorとDLoscの提案(62バイト):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])

8
プログラミングパズルとコードゴルフへようこそ!これはコードとゴルフの競合であるため、コードをできるだけ短くする必要があります。できることの1つは、インデントに使用されるスペースの量を減らすことです。Pythonでは1つのスペースで十分です。この投稿にはPythonでのゴルフのヒントがリストされており、参考になるかもしれません。
アレックスA.

@アレックス、ありがとう-私は正確なルールが何であるかを理解しようとしていました、私はいくつかの空白を無視できることを望んでいましたが、そうではないと思います。
モンギン

いいえ、改行とスペースはどちらも文字数に影響します。
アレックスA.

実際、この場合、改行とインデントさえ必要ありません。forボディに別のブロックステートメントがない限り、Pythonのようなブロックステートメントはすべて同じ行に置くことができます。
DLosc

3
良いスタート。あなたは置くことができ、同じライン上にすべてをとしてforインデントを避けるために。boolsが0/1に等しいという事実を使用し[0,4][...] 4*(...)、条件をに短縮できます。また、d[x:x+2]として書くとd[x:][:2]、1文字長くなりますが、式をx変数に保存することを避けることができます。
xnor

4

Sed、32バイト

s/,/=/4
s/.*=//
s/,/:/2
s/:.*//

これにより、4番目までのコンマがあればそれがすべて削除されます。次に、2番目のコンマ(以前は6番目だった可能性がある)からすべてを削除します。

そして、私はなんとか正当化することさえできました!


デモを見る可能性はありますか?
フアンコルテス

デモに何が欲しいのかわかりません-提供されたテスト入力を実行し、必要な出力を得ました。
トビースパイト

4

Javascript、44バイト

変数に入力があると仮定しますG

編集:私はちょうど気づいた、これはnutkiのperlソリューションによく似ています。

alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))

スニペットデモ:

function run(){
    G = input.value;
    /* start solution */
    alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))
    /* end solution */
}
<textarea id="input" cols="25" rows="6">103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000</textarea><br />
<button id="run" onclick="run();">Run</button>


4

Scala、68バイト

G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))

- MrBones

Scala、46 70バイト

編集:結果を印刷する

for{l<-G;r=l.split(",");x=(r++r).slice(4,6).mkString(",")}{println(x)}

デモ


1
代わりにマップを使用することにより、1バイト少なくなりますG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
-Squidly

1
バインディングをドロップすることで保存された別のバイト:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
イカリー

3

CJam、18 15 14バイト

r{',/4m<2<pr}h

でオンラインでお試しください CJamインタープリター

使い方

r      e# Read a whitespace separated token from STDIN.
{      e# Do-while loop:
  ',/  e#    Split at commas.
  4m<  e#    Rotate the resulting array 4 units to the left.
  2<   e#    Discard everything but the first 2 elements.
  p    e#    Print the array.
  r    e#    Read a whitespace separated token from STDIN.
}h     e# If the token is a nonempty string, repeat the loop.

3

POSIXシェル、30バイト

POSIXを仮定sedしてcut存在しています:

sed 's/.*/&,&/'|cut -d, -f5,6

行を複製し、対象のデータをフィールド5および6から抽出できる状態にします。


3

Javascript、117 112 99 95 84 76 71バイト

for(r of G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])

JSフィドル


1
フィドルまたはデモを投稿してください
フアンコルテス

あなたは置き換えることによって、2件のBを削除することができ;,、ループ本体に、したがって、中括弧を削除{し、}
フアン・コルテス

@JuanCortés-ありがとう、知らなかった。その背後にある理論は何ですか?
-RichieAHB

中括弧が追加されていない場合、ループの本体は、閉じ括弧の後の最初の式になります。式はセミコロンで終わります。式をコンマで区切ると、可能であれば式グループのようになり、式の後に終了します
フアンコルテス

1
を使用for ofすると、3バイト節約できます。最新のブラウザで動作します。for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65

2

ピップ、12 + 1 = 13バイト

-lフラグを使用します。これにより、各行にスペースで区切られた数字のリストとして出力されます。*

_@[4 5]Mg^',

説明:

  • 番号のリストはに期待されていgます。以来g、通常はコマンドライン引数から初期化され、あなたも同じ結果のためにそこに入力を置くことができます。
  • ^', リストをカンマで分割します(各文字列)。
  • M 結果の各要素に関数をマップします。
  • _@[4 5]ラムダ関数を定義します。関数の引数はで表され_ます。@[4 5]4番目と5番目の要素のリストを返します。リストに6つの要素がある場合、これらは最後の2つになります。4つある場合、インデックスは折り返されるため、結果は最初の2つになります。(例"abcd"@4 == "abcd"@0 == "a"
  • [[103 2] [106 1] [67 2]]これで、プログラムの最後に自動印刷されるのようなリストのリストができました。-lフラグは、スペースや改行の後、全体のことで、各サブリストを結合し、その結果は次のようになります
C:\> pip.py -le "_ @ [4 5] Mg ^ '、" 103,2,50,100 106,1,900,900 459,40,150,300,67,2
103 2
106 1
67 2

* 現在。この動作を変更することもありますが、私はまだ同じことをするフラグを立てる予定です。


1

Perl、37

@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]

35文字+2のために-p-l。Perlに@nutkiのソリューションに勝るアプローチがあるかどうかはわかりませんが、とにかくこのアイデアを投稿するつもりでした。

で実行:

cat input.txt | perl -ple'@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]'


0

C、95バイト

f(a,b,c,d){scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2?printf("%d,%d",c,d):printf("%d,%d",a,b);}

コードは簡単です。以下は、バージョン化されていないバージョンです。

f(a,b,c,d){                                    //Four int variables
    scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2 //Scan input
        ?                                      //If scanf returned a value > 2
        printf("%d,%d",c,d)                    //Print last two values
        :                                      //else 
        printf("%d,%d",a,b);                   //Print first two values
}

ここでテストしてください


0

ルビー、53

G.each_line{|x|g=x.split',';p[g[4]||g[0],g[5]||g[1]]}

または良いです。

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