ค่าที่ใหญ่ที่สุดและน้อยที่สุดจากจำนวนเต็มที่ตัดแบ่ง


14

ปัญหานี้เกิดจากปัญหาการเขียนโปรแกรมห้าปัญหาวิศวกรซอฟต์แวร์ทุกคนควรจะสามารถแก้ไขได้ในเวลาน้อยกว่า 1 ชั่วโมงซึ่งตัวมันเองนั้นน่าสนใจในการอ่าน ปัญหาสองสามข้อแรกนั้นเล็กน้อย แต่ปัญหาที่สี่นั้นน่าสนใจกว่าเล็กน้อย

รับรายการจำนวนเต็มคั่นด้วยช่องว่างเดียวบนอินพุตมาตรฐานพิมพ์ค่าที่ใหญ่ที่สุดและน้อยที่สุดที่สามารถรับได้โดยการเชื่อมต่อจำนวนเต็มเข้าด้วยกันในบรรทัดของตนเอง

ตัวอย่างเช่น:

การป้อนข้อมูล:

5 56 50

เอาท์พุท:

50556
56550

จุดสั่งซื้อต่างๆ:

  • ลำดับของผลลัพธ์นั้นเล็กที่สุดแล้วก็ใหญ่ที่สุด
  • เฉพาะค่าที่เล็กที่สุดและใหญ่ที่สุดเท่านั้นที่สามารถพิมพ์ออกมาได้ (การวนซ้ำในรูปแบบทั้งหมดและการพิมพ์ออกมานั้นไม่ถูกต้อง)
  • จะมีจำนวนเต็มสองตัวหรือมากกว่าในรายการ
  • เป็นไปได้สำหรับผลลัพธ์ที่ใหญ่ที่สุดและเล็กที่สุดเหมือนกัน ในกรณีของการป้อนข้อมูลควรพิมพ์5 55หมายเลข555สองครั้ง
  • จำนวนเต็มไม่จำเป็นต้องชัดเจน 5 5เป็นอินพุตที่ถูกต้อง
  • การนำหน้า0s บนจำนวนเต็มไม่ใช่อินพุตที่ถูกต้อง คุณจะไม่05 55จำเป็นต้องบัญชี

เช่นนี้เป็นรหัสกอล์ฟรายการที่สั้นที่สุดชนะ


หากหนึ่งในหมายเลขอินพุตมี 0 นำหน้า (เช่น05) เราจะพิจารณาว่าเป็น05หรือเพียงแค่5?
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer เลขศูนย์นำเข้าไม่ถูกต้อง

0s ชั้นนำได้รับอนุญาตในการส่งออกหรือไม่
ทิม

@Tim ผู้ที่มาจากที่ใดถ้าไม่มีเลขศูนย์นำหน้าในอินพุต
Martin Ender

@ 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
ตกลงฉันยอมแพ้ ตอนนี้ฉันยังไม่มีตัวe!ตน (ยังไม่ปรากฏในวิกิ)
เดนนิส


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)

แก้ไข: ขอบคุณ xnor สำหรับ -5 ไบต์!


1
ภายในเข้าใจsortedทำงานโดยไม่ต้องวงเล็บ แต่คุณยังสามารถหลีกเลี่ยงการเรียงลำดับและเพียงแค่ใช้เวลาและmin max
xnor

ฮะใช่ ขอขอบคุณ!
sirpercival

3

Mathematica, 64 58 ไบต์

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

ฟังก์ชันนี้กำหนดฟังก์ชันที่ไม่มีชื่อโดยใช้สตริงและพิมพ์สองบรรทัด มันค่อนข้างตรงไปตรงมาเหมือนคนอื่น ๆ : รับพีชคณิตทั้งหมดเข้าร่วมพวกเขาเรียงลำดับแล้วพิมพ์ผลลัพธ์แรกและสุดท้าย

บันทึกหกไบต์ด้วย alephalpha


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

@alephalpha บางครั้งง่ายกว่าดีกว่า ขอบคุณ! : D
Martin Ender

2

JavaScript (ES6) 54 72 85

ง่ายกว่าที่คิด เพียงเรียงลำดับตามพจนานุกรม ข่าวดีก็คือ: นั่นเป็นวิธีการเรียงลำดับจาวาสคริปต์ธรรมดา อืม ... ไม่นะนั่นผิด ... ยังคงมีการเปรียบเทียบพจนานุกรมศัพท์ (ที่ซับซ้อนมากขึ้น) ที่สามารถทำงานได้

หมายเหตุ: การมี a และ b เป็นตัวเลข a + [b] เป็นทางลัดสำหรับ + ​​'' + b เนื่องจากเราต้องการการต่อสตริงเข้าด้วยกันและไม่ใช่ผลรวม
หมายเหตุ 2: บรรทัดใหม่ภายใน `` มีความสำคัญและจะต้องนับ

แก้ไขอย่าเถียงกับผู้ดูแล (... ล้อเล่น)

Edit2คง I / O รูปแบบการใช้ป๊อปอัพ (ดูเริ่มต้นสำหรับรหัสกอล์ฟ: วิธีการ Input / Output )

// 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 36 , 42ไบต์

แรงเดรัจฉานง่าย:

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

Julia, 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
ทำได้ดีมาก combinat::permnคุณสามารถบันทึกไบต์โดยใช้เวลาเพียงสองทวิภาคแม้ว่าคือ
Alex A.

ผมคิดว่า::จำเป็นต้องใช้แพคเกจที่จะโหลด (ผ่านlibraryหรือrequire) :::แต่ไม่ ฉันอาจผิด จำเป็นต้องอ่านเพิ่มเติมเล็กน้อยเกี่ยวกับเรื่องนี้ ขอบคุณ
flodel

หากห้องสมุดโหลดแล้วคุณไม่จำเป็นต้องใช้โคลอนเลย คุณสามารถเรียกใช้ฟังก์ชันได้โดยตรงเนื่องจากแพ็คเกจจะแนบกับเนมสเปซ หากติดตั้งแพคเกจแล้ว แต่ไม่ได้โหลดคุณสามารถอ้างอิงฟังก์ชั่นในแพคเกจเฉพาะที่มีเครื่องหมายโคลอนสองตัว
Alex A.

ดังนั้นมันจึงเป็น 58 ฉันจะไม่ยอมให้ตัวเองใช้โดยตรงโดยไม่ต้องpermnlibrary(combinat)
flodel

ใช่เพราะคุณต้องโหลดห้องสมุดด้วยlibrary(combinat)ก่อนจึงจะสามารถใช้งานpermnได้ ;)
Alex A.

1

ทับทิม 75

ไม่ใช่ภาษา 'พื้นเมือง' ของฉัน แต่มีฉันคิดว่าฉันจะลอง ... ดังนั้นนี่อาจเป็นไปได้ที่จะใช้เคล็ดลับการเล่นกอล์ฟ ยังไม่ใช่ผู้เข้าร่วมที่ไม่ดี

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

ฉันไม่อยากจะบอกว่ามันเป็นสง่างามอื่น ๆ ที่ทุกอย่างจะถูกสร้างขึ้นในภาษา มันควรจะค่อนข้างชัดเจนว่าวิธีการทำงานนี้


คุณสามารถแทนที่{|x|x.join}ด้วย(&:join)การประหยัด 3 ไบต์
แอนดรู

ทางลัด ruby ​​อีกไม่กี่รายการสำหรับ 48 ไบต์:puts$<.read.split.permutation.map(&:join).minmax
blutorange


ได้รับจะยิ่งสั้นลงสำหรับการอ่านอินพุต: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.