配列内で最大10個に一致


8

チャレンジ

1桁の数字の配列が与えられた場合、そのうちの2つが合計して10になる場合は計算して、それらを出力します。

例

入力

(1、2、3、4、5、5、6、7)

これは戻ります ((4,6),(5,5),(3,7))

入力

(1、2、3、4、5)

これはを返します()。5つしかないので

入力

(5、5、5、5、5)

((5,5),(5,5))5の奇数があり、各5は1回だけ使用できるため、これは戻ります

ルール

ここにルールがあります!

  • 入力は、正の1桁の整数のソートされていない配列のみであると想定します
  • 各番号は一度だけペアになります。つまり、5が3つある場合は、1つのペア(5,5)のみを形成します。(3,3,7)が存在する場合、1ペアのみを形成します(3,7)
  • 入力の場合:リーダーが入力が数値の単一の配列であることを認識できる限り、任意のタイプの括弧(または括弧なし)を使用できます。
  • 出力の場合:ペアの配列のように見える必要があります。配列が入力と同じ形式である場合(入力で括弧を使用しなかった場合は、リーダーが配列のペアであることをリーダーが認識できるように、ある種の記号を使用する必要があります)

テストケース

(1,2,3,4,5,5,6,7) =((4,6),(5,5),(3,7))
(1,2,3,4,5) = ()
(5,5,5,5,5) = ((5,5),(5,5))
(1,2,3,3,4,5,6,7)=((3,7),(4,6))
(9,8,7,6,4,4,3,1)=((9,1),(7,3),(6,4))

幸運を!

shorter答えは、より良い、です!

編集1:コメントからルールとテストケースを更新する

編集2:入力の形式を定義するためのルールを更新します。

編集3:ルールを更新して出力の形式を定義します。可能な限り対応しようとしています。


2
(5,5)最終テストケースには10の異なる組み合わせがあるべきではありませんか?
— ガレス

@Garethペアを作るときに値が使い果たされるようです
— Matt

さらにいくつかのテストケースを投稿できますか?おそらく次のようなものです(1,2,3,3,4,5,6,7)
— Matt

@マット編集。フィードバックをありがとう
— user1655072

入力には括弧を含める必要がありますか、それとも次のように入力でき1,2,3,4,5,5,6,7ますか?
— jdstankosky 2012年

回答:


7

GolfScript、45 42 37文字

~{([.~11+.])@{1$=.{2$p!\}*!},\;\;.}do

新しいアプローチでは、単一のアイテムを入力として持つ配列も使用します。さらに、それは数文字短くなります。

前のバージョン:

~{$(\)@.2$+10-.{0>{\}*;+}{;[\]p}if.,1>}do;

このコードで使用されるアルゴリズムは次のとおりです。

  • 配列をソートします。
  • 最初と最後の項目の合計を取る。
    • 合計が10の場合、両方の数値を出力し、配列から削除します。
    • 合計が10より大きい場合、大きい方の数字を破棄します。
    • 合計が10未満の場合は、小さい方の数字を破棄します。
  • 配列に1桁のみ、または空になるまでループします。

このコードでは、STDINに少なくとも2桁の配列が必要です。

例(オンラインを参照):

>[9 8 7 6 4 4 3 1]
[1 9]
[3 7]
[4 6]

>[5 5 5 5 5]
[5 5]
[5 5]

9

Python 2.7(70)

y=input()
while y:
 g=10-y.pop()
 if g in y:y.remove(g);print(g,10-g)

テストケース:

$ echo '[1, 2, 3, 4, 5, 5, 6, 7]' | python p.py
(3, 7)
(4, 6)
(5, 5)

$ echo '[1,2,3,4,5]' | python p.py

$ echo '[5,5,5,5,5]' | python p.py
(5, 5)
(5, 5)

$ echo '[1,2,3,3,4,5,6,7]' | python p.py
(3, 7)
(4, 6)

$ echo '[9,8,7,6,4,4,3,1]' | python p.py
(9, 1)
(7, 3)
(6, 4)

かっこを付けるために1バイト余分に。


私はこのメソッドをPHPで複製したと思いますが、時々しか機能せず、すべてのペアでは機能しません。なぜか?<?$a=fgetcsv(STDIN);while($a){$b=10-array_pop($a);if($a[$b]){unset($a[$b]);echo"($b,",10-$b,")";}}
— jdstankosky 2012年

5

ジャバスクリプト、188 183 181 153 141 121 123 112 105 98文字

JSでのゴルフはやや難しいですが、私はこの問題に打ち込みたいと思ったので、コードは次のとおりです。

for(a=eval(prompt(i=o=[]));k=a[j=++i];)for(;p=a[--j];)k+p-10||(k=a[i]=a[j]=-o.push([p,k]));console.log(o)

入力:例えば[1,2,3,3,4,5,6,7]。たとえば[[4,6],[3,7]]コンソールに出力します。

105-> 98:コードを完全に書き換えるためにダニエルの素晴らしいアルゴリズムを使用しました!読みやすいアルゴリズムについては、彼の回答を参照してください。ものを完全にめちゃくちゃにしたので、105文字に戻しました。

112-> 105:初期化されi、ゼロに、の使用される出力o.pushセットのk(k=a[i]=a[j]=-o.push...)とは、出力が代わりに除去するためにアラートのコンソールにログイン"["+し、+"]"うまく既にコンソール出力するからです。

123-> 112:ゴルフスクリプトが:)を削除する可能性があるため、出力の外側のブラケットを削除しました|=0。

121-> 123:(2つの文字を追加する:()に変更さo+="("+p+","+k+"),"れ、文字列(-> )の代わりに配列がo.push("("+[p,k]+")")作成されましoた。出力はもう間違っていません(など)。o=""o=[]((5,5),(5,5),)

> 121 141-:今から想定し、我々は言語の配列の形式で入力を得ることができることを意味し、質問、JSの場合であり、その上[a,b,c,...]と作られo、出力「アキュムレータ」の代わりに、配列の文字列(o.push(...),- > o+=...,)。

153-> 141:使用後にアレイエントリを削除するのではなく、リセットします。

181-> 153:に適用された変更u=[]、ループの再配置、a[i]&a[j]-> temp変数、ifロジックに変換され、intロジックがに変換されましたa[i]|=0。

183-> 181:置き換えi<=0とi+1とに対して同じj。

188-> 183:置きo=[]の内側prompt()(;)と交換しfor(j=i;てfor(j=i-1;(i==j&&)。

(mellamokb、Paul Walls、ライアンに感謝します!)


1
あなたは置き換えることができますi>=0とi+1してj>=0とのj+12つの文字を保存します。
— mellamokb

1
(のu=[]代わりにx)ビットフィールド配列に変更を適用し、ループを0から上に移動するように再配置し、繰り返し変数を保存するために一時変数に割り当てa[i]、a[j]変数の初期化を他のステートメントに移動し、ifロジックをチェーン||ロジックに変換し、変換しました。 intをより簡潔に解析してa[i]|=0、合計30文字の節約を実現します:)。これがソリューションの正確さを示す私のテストハーネスです:jsfiddle.net/GKUDb/8、そして151文字のゴルフで動作するソリューション:jsfiddle.net/DVtW2です。
— mellamokb

1
Array.toString()もいくつかの文字を節約します(つまりo+="("+[p,k]+")")。
— ポールウォールズ

1
Golfscriptのような出力で問題がなければ、これを実行できます: for(a=eval(prompt(o=[])),i=-1;k=a[j=++i]|=0;)for(;p=a[--j];)k+p-10||(o.push("["+[p,k]+"]"),k=a[i]=a[j]=-1);alert(o)、それを115に下げます
— Ryan

1
iを0に初期化するという提案を忘れました。忠実性を失うことなくフォールドa=eval(prompt(o=[])),i=-1しa=eval(prompt(i=o=[]))て、さらに3文字節約できます。
— mellamokb

3

J、54 53 50 46 45 44文字

(>:,.9&-)I.<.4({.,-:@{::)(<.|.)+/|:(1+i.9)=/

使用法:

   (>:,.9&-)I.<.4({.,-:@{::)(<.|.)+/|:(1+i.9)=/5 5 5 5 5
5 5
5 5
   (>:,.9&-)I.<.4({.,-:@{::)(<.|.)+/|:(1+i.9)=/9 8 7 6 4 4 3 1
1 9
3 7
4 6

アルゴリズムは基本的に次のとおりです。

  • 各数値のインスタンスを数える +/|:(1+i.9)=/
  • 10に加算される各ペアのカウントをペアにします(<.|.)(1と9、2と8など)。
  • それらのカウントの最小値を取り(つまり、9が3つで1つが1つしかない場合は、1 9ペアは1つだけです)、最初の5つのペアの後にすべてをドロップします
  • 5は特殊なケースなので、2で割り<.4({.,-:@{::)ます(前の両方のステップを実装します)
  • リストの最初の5つの項目を取得し、番号と10 -の番号を出力します(>:,.9&-)I.

3

パイソン(142)

入力は、角括弧ではなく角括弧で指定する必要があります。 http://ideone.com/p2QR11

from itertools import*
a=input()
c=lambda:[i for i in product(a,a[1:])if sum(i)==10]
d=c()
while d:print d[0];[a.remove(j)for j in d[0]];d=c()

アルゴリズム:

1. Get input
2. Generate all pairs of input where the sum is 10
3. If there are no pairs, then END PROGRAM
4. Take the first pair's items and remove them from the input
5. Go back to step 2

深刻な形式の出力が許可されている場合(90):http : //ideone.com/GR762f

a=input()
c=a.count
for i in range(6):print(`i`+`10-i`+' ')*(min(c(i),c(10-i))/(1+(i==5)))

3

C、142138、124

char*p,*q;
main(int a,char**s){
    for(p=s[1];*p;p++)
        if(q=strchr(p+1,106-*p))a=*q=printf("%c(%c,%c)",38+a,*p,*q);
    puts("()"+a/6);
}

テスト:

./a.out "(1,2,3,4,5,5,6,7)"
((3,7),(4,6),(5,5))

./a.out "(1,2,3,4,5)"
()

./a.out "(5,5,5,5,5)"
((5,5),(5,5))

./a.out "(1,2,3,3,4,5,6,7)"
((3,7),(4,6))

./a.out "(9,8,7,6,4,4,3,1)"
((9,1),(7,3),(6,4))

実装上の注意:

  • 最初はa = 2(プログラムには2つの引数があります)、一致が発生すると6に設定(printfは6文字を出力)
  • 106 = '0' + '0' + 10、つまりASCIIコードの合計を使用
  • 38 + aは44/40のいずれか、つまり「(」または「、」
  • 文字列文字を6に設定することにより、他のパスで106に追加されないことが保証されます
  • 「()」+ a / 6、「()」または「)」のいずれか

3

Perl 52

perl -ne '$a{$y=9-$_}&&0*$a{$y++}--*print"$y,$_"or$a{$_-1}++'

証明:

> cat test
1
2
3
4
5
5
6
7
> perl -ne '$a{$y=9-$_}&&0*$a{$y++}--*print"$y,$_"or$a{$_-1}++' < test
5,5
4,6
3,7

そして、ゴルフされていないコメント付きコードがあります:

while(<>) {     # made by the -n option

    # We are looking for (P,Q) pairs where P+Q=10
    # Each P entry will come in $_="P\n" (because $_ will not be chopped)
    # We choose to store the number of occurence of P in $a{P-1}
    # (For instance, if there have been five '3's in the input, then $a{2}=5)

    $y=9-$_;        # if Q=P-10, then $y=Q-1
    if ($a{$y}) {   # check if there was a Q (so $a{Q-1} != 0)
        $a{$y++}--;   # If so 'consume' this Q, and let $y=Q
        print"$y,$_"; # ... and output "Q,P\n"
    } else {
        $a{$_-1}++;   # P is not forming a new pair, so 'count it'.
                    # $a{$_} would not work because of the un-chopped \n, thus the '-1'
    }

}

説明はピジン語のフランス語のように見えるかもしれません(私はネイティブの英語のライターではありません)。誰かが編集して理解しやすくしたい場合は、そうしてください。


真剣に、このために、説明とすべての... :(でもない一点?
— Orabîg

3

ジャバスクリプト- 131の 129 125文字

for(i=eval(prompt(r=[])),k=j=i.length;j--;)for(m=k;m--;)if(m!=j&&i[j]+i[m]==10)r.push([i[j],i[m]]),i[j]=i[m]=0;console.log(r)

私は、ネストされた結果配列の順序とその中の順序は必須ではないと思います:)

評価されたテストケース:

[1,2,3,4,5,5,6,7] returns [[7,3],[6,4],[5,5]]
[1,2,3,4,5]       returns []
[5,5,5,5,5]       returns [[5,5],[5,5]]
[1,2,3,3,4,5,6,7] returns [[7,3],[6,4]]
[9,8,7,6,4,4,3,1] returns [[1,9],[3,7],[4,6]]

編集:問題の説明に「配列」とあるので、配列の言語固有の表記について話していますよね?


2

Mathematica 70

Cases[#//.{x___,n_,y___,d_,z___}/;n+d==10:>{x,y,z,n~f~d},a_~f~b_:>{a,b}]&

使用法

Cases[# //. {x___, n_, y___, d_, z___} /; n + d == 10 :> {x, y, z, n~f~d}, 
a_~f~b_ :> {a,b}] &[{1, 2, 3, 4, 5, 5, 6, 7}]

{{3、7}、{4、6}、{5、5}}


2

ポストスクリプト(46)

これは手動でコード化されたバイナリトークンを使用するため、以下に16進ダンプを示します。

00000000  7b 7b 92 1a 92 3f 7b 32  92 19 92 01 31 30 92 3d  |{{...?{2....10.=|
00000010  7b 32 92 09 92 0b 3d 3d  5b 92 40 7d 69 66 92 1a  |{2....==[.@}if..|
00000020  31 92 87 7d 92 83 92 75  7d 92 65 7d 92 a3        |1..}...u}.e}..|
0000002e

バイナリファイルをアップロードしてみました。

これは、数値がスタック上にあることを期待しています。コードの前に追加したり、コマンドラインで指定したりできます。たとえば、次のようにGhostscriptを使用する場合は、

gsnd -c 2 8 5 5 @ 10_golfed.ps

入力に配列構文を要求する場合aload popは、最初にさらに2つのトークン()が必要です。バイナリトークンでは、これはさらに4バイトです。

ゴルフをせず、コメント:

{ % stopped                   % we use stopped because we want to catch a
                              % stackunderflow when all numbers have been used up
  { % loop                    % repeat until all numbers have been popped off the stack
    % Test for all numbers on the stack whether they add up to 10 with the topmost number
    count{                    % ... nextNumber number currentTestNumber
      exch                    % ... nextNumber currentTestNumber number 
      2 copy add 10 eq{       % ... nextNumber currentTestNumber number
        2 array astore ==     % ... nextNumber
        % We push "[" on the stack because we want to pop the topmost object after each iteration.
        % As [ is a one byte self delimiting token, this is nice for golfing.
        [ exit                % ... nextNumber [
      }if                     % ... nextNumber currentTestNumber number
      count 1 roll            % number ... nextNumber currentTestNumber 
    }repeat                   % number ... nextNumber currentTestNumber
    pop                       % number ... nextNumber
  }loop                       
}stopped


2

PHP 150 149 148 146 142- > 140

PHP CLIで使用します。

<?$a=fgetcsv(STDIN);for($i=0;$i<$c=count($a);$i++){for($j=$i+1;$j<$c;$j++)if($a[$i]+$a[$j]==10){echo"({$a[$i]},{$a[$j]})";$a[$i]=$a[$j]=0;}}

入力: 1,2,3,4,5,5,6,7

出力: (3,7)(4,6)(5,5)

ゴルフなし:

<?php

$a = fgetcsv(STDIN);
$c = count($a);
for ($i = 0; $i < $c; $i++) {
    for ($j = ($i + 1); $j < $c; $j++) {
        if ($a[$i] + $a[$j] == 10) {
            echo "({$a[$i]},{$a[$j]})";
            $a[$i] = 0;
            $a[$j] = 0;
        }
    }
}

?>

1

SED、112文字

おそらく他のソリューションよりもやや単純です

s/.*/@&;12345678987654321/
:
s/\(@.*\)\(.\)\(.*\)\(.\)\(.*;.*\2.\{7\}\4\)/(\2,\4),\1\3\5/
t
s/^\(.*\),@.*/(\1)/

1

Perl、-pフラグ付き72

perl -p -e 's/^/@/;1while s/(@.*)(.)(.*)((??{10-$2}))/($2,$4)$1$3/;s/(.*)@.*/($1)/'

-p同等のものが追加されるので、これは数える必要があると思いますLINE: while (<ARGV>){...}continue{die "-p destination: $!\n" unless print $_}
— Brad Gilbert b2gills

すべての自動ゴルフサーバーでは、シバン#!perl -pと改行を必要とするため、これは80バイトとしてカウントされます。
— プリモ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.