連結整数からの最大値と最小値


14

この問題は、すべてのソフトウェアエンジニアが1時間以内に解決できるはずの5つのプログラミング問題に由来しています。最初のいくつかの問題は些細なことですが、4番目の問題はもう少し興味深いものです。

標準入力で単一のスペースで区切られた整数のリストが与えられた場合、整数をそれぞれの行に連結することで取得できる最大値と最小値を出力します。

例えば:

入力:

5 56 50

出力:

50556
56550

さまざまな注文ポイント:

  • 結果の順序は最小から最大です。
  • 印刷できるのは最小値と最大値のみです(すべてのバリエーションを繰り返して印刷することは無効です)。
  • リストには常に2つ以上の整数があります。
  • 最大と最小の結果が同じになる可能性があります。inputの場合5 55、数値555を2回印刷する必要があります。
  • 整数は必ずしも明確ではありません。5 5有効な入力です。
  • 0整数の先頭のs 有効な入力ではありません。あなたはなりませんためのアカウントに必要05 55

これはコードゴルフであるため、最短のエントリーが勝ちです。


入力番号の1つに先頭の0(など05)が含まれている場合、05それを単純にまたは単純に考え5ますか?
オプティマイザー

@Optimizerの先行ゼロは有効な入力ではありません。

出力に先行0を使用できますか?
ティム

@Tim入力に先行ゼロがない場合、どこから来るのでしょうか?
マーティンエンダー

@MartinBüttnerああ、ばかげている!
ティム

回答:


8

CJam、14 13バイト

qS/e!:s$(N@W=

かなり簡単です。これがどのように機能するかです:

qS/                  e# Split the input on spaces
   e!                e# Get all permutations of the input numbers
     :s              e# Join each permutation order into a single string
       $             e# Sort them. This sorts the strings based on each digit's value
        (N@W=        e# Choose the first and the last out of the array separated by '\n'

こちらからオンラインでお試しください


1
OK、あきらめます。私は今はe!存在していませんでした(まだウィキに表示されていません)。
デニス

5
@デニスそこに行く
オプティマイザー

1
甘い読み。便利な新しいものがたくさん。
デニス

これらの追加のトリックを使用して、CJamでのゴルフのヒントを更新すると役立つ場合があります。

1
@MichaelTのヒントには、一般的に、言語の組み込み機能を説明する回答が含まれていると想定されていません。ただし、これらの新機能の恩恵を受ける可能性があるため、いくつかの回答を更新する必要があります。
オプティマイザー

5

Pyth、14 13バイト

hJSmsd.pcz)eJ

すべての順列を生成して並べ替え、最初と最後の要素を出力します。


Jインラインで割り当てる:hJSmsd.pcz)eJ
isaacg

@isaacgいいね!私たちはその不潔な不潔なCJamに劣らないことを知っていました!
orlp

4

Python 2、104 99バイト

うん。

from itertools import*;z=[''.join(x)for x in permutations(raw_input().split())];print min(z),max(z)

編集:-5バイトのxnorに感謝!


1
理解の内部には、sortedカッコなしで動作しますが、あなたはまた、ソートを回避することができ、ちょうど取るminmax
xnor

ええ、はい。ありがとうございました!
サーパーシバル

3

Mathematica、64 58バイト

Print/@Sort[""<>#&/@Permutations@StringSplit@#][[{1,-1}]]&

これは、文字列を取得して2行を出力する名前のない関数を定義します。他のアプリケーションと同じように簡単です。すべての順列を取得し、それらを結合し、並べ替えて、最初と最後の結果を出力します。

alephalphaのおかげで6バイト節約されました。


{#&@@#,Last@#}=>#[[{1,-1}]]
alephalpha

@alephalpha時にはシンプルな方が良い場合があります。ありがとう!:D
マーティンエンダー

2

JavaScript(ES6)54 72 85

見た目よりも簡単です。辞書順に並べ替えるだけです。良いニュースは次のとおりです。それがまさにJavaScriptの単純な並べ替えの仕組みです。まあ...いいえ、それは間違っています...まだ(より複雑な)辞書式比較が仕事をすることができます。

注:aとbが数値であるため、a + [b]はa + '' + bのショートカットです。合計ではなく、文字列の連結が必要です。
注2: ``内の改行は重要であり、カウントする必要があります

編集モデレーターと議論しないでください(...冗談です)

Edit2ポップアップを使用したI / O形式の修正(コードゴルフのデフォルト:入出力メソッドを参照)

// Complete program with I/O
// The sorting function is shorter as input are strings

alert((l=prompt().split(' ')).sort((a,b)=>a+b>b+a).join('')+`
`+l.reverse().join(''))

// Testable function (67 chars)
// With an integer array parameter, the sorting function must convert to string 

F=l=>(l.sort((a,b)=>a+[b]>b+[a]).join('')+`
`+l.reverse().join(''))

Firefox / FireBugコンソールでテストする

F([50, 2, 1, 9])
F([5,56,50])
F([52,36,526])
F([52,36,525])
F([52,36,524]

12509
95021

50556
56550

3652526
5265236

3652525
5255236

3652452
5252436


1
入力形式が間違っていると思います。「標準入力で単一のスペースで区切られた整数」である必要があります。
nimi

@nimi正しい。修正済み
edc65

2

J、34 3642バイト

単純なブルートフォース:

h=:3 :'0 _1{/:~;"1":&.>y A.~i.!#y'

h 5 50 56
50556 
56550

h 50 2 1 9
12509
95021

1

Haskell、98バイト

import Data.List
g=sort.map concat.permutations.words
h i=unlines[g i!!0,last$g i]
main=interact h

入力文字列をスペースで分割し、すべての順列を連結して並べ替えます。最初と最後の要素を印刷します。


1

ジュリア、77バイト

v->(Q=extrema([int(join(x)) for x in permutations(v)]);print(Q[1],"\n",Q[2]))

これにより、入力としてベクトルを受け入れ、結合された要素の順列の最小値と最大値を出力する名前のない関数が作成されます。それを呼び出すには、名前を付けます、例えばf=v->...ます。

Ungolfed +説明:

function f(v)
    # Create an integer vector of the joined permutations using comprehension,
    # then get the minimum and maximum as a tuple using extrema().

    Q = extrema([int(join(x)) for x in permutations(v)])

    # Print the minimum and the maximum, separated by a newline.
    print(Q[1], "\n", Q[2])
end

提案を歓迎します!


1

Javascript(ES6)134

悲しいことに、JSには組み込みの置換関数はありません:(

f=(o,y,i,a)=>y?o.concat(a[1]?a.filter((k,j)=>j^i).reduce(f,[]).map(z=>y+z):y):(q=o.split(' ').reduce(f,[])).sort().shift()+`
`+q.pop()
<!-- Snippet Demo (Firefox only) -->

<input id="input" value="5 56 50" />
<input type="button" onclick="output.innerHTML=f(input.value)" value="Run" />
<pre id="output"></pre>


1

R、59バイト

write(range(combinat:::permn(scan(),paste,collapse="")),"")

1
よくやった。ただし、コロンを2つだけ使用することで1バイトを保存できますcombinat::permn
アレックスA.

::パッケージは(libraryまたはを介してrequire)ロードする必要がありますが、必要ではないと考えました:::。私は間違っている可能性があります。それについてもう少し読む必要があります。ありがとう。
flodel

ライブラリがロードされている場合、コロンはまったく必要ありません。パッケージは名前空間にアタッチされているため、関数を直接呼び出すことができます。パッケージがインストールされているがロードされていない場合、2つのコロンを使用して特定のパッケージの関数を参照できます。
アレックスA.

したがって、58になります。をpermn使わずに直接使用することはできませんlibrary(combinat)
flodel

ええ、とにかくlibrary(combinat)使用する前にライブラリをロードする必要があるからpermnです。;)
アレックスA.

1

ルビー75

私の「母国語」ではなく、試してみたいと思った言語です。したがって、これは(おそらく)ゴルフのヒントをいくつか使用できます。それでも、悪い参加者ではありません。

puts STDIN.read.split(" ").permutation.map{|x|x.join}.sort.values_at(0,-1)

すべてが言語に組み込まれていることはエレガントだとは言いません。これがどのように機能するかは、正確に明確でなければなりません。


に置き換え{|x|x.join}(&:join)、3バイト節約できます。
アンドリュー

48バイトのルビーショートカットをさらにいくつかputs$<.read.split.permutation.map(&:join).minmax
15年


入力を読み取るための取得はさらに短くなりますputs gets.split.permutation.map(&:join).minmax
。– blutorange

1

Perl、79 70B(68 + 2)

use Math::Combinatorics;say for(sort map{join'',@$_}permute@F)[0,-1]

で呼び出しecho 13 42 532 3 6|perl -M5.10.0 -an scratch.plます。には+2バイトのペナルティがあり-anます。モジュール名の長さについて恥ずかしい...


0

JavaScript(ES6)、85バイト

F=a=>(c=a.split(" ").sort((b,a)=>b+a-(a+b)),`${c.join("")}
${c.reverse().join("")}`)

使用法:

F("50 2 1 9")
/*
    12509
    95021
*/

1
テンプレート文字列に恋をしないでください。a + `` + bは `$ {a} $ {b}`より短い
-edc65
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.