Birleştirilmiş tamsayılardan en büyük ve en küçük değerler


14

Bu problem, her Yazılım Mühendisinin 1 saatten daha kısa sürede çözebilmesi gereken beş programlama probleminden kaynaklanmaktadır ki bu da ilginç bir okumadır. İlk birkaç sorun önemsiz, ancak dördüncü sorun biraz daha ilginç olabilir.

Standart girdi üzerinde tek bir boşlukla ayrılmış tamsayıların bir listesi verildiğinde, tamsayıları kendi satırlarında birleştirerek elde edilebilecek en büyük ve en küçük değerleri yazdırın.

Örneğin:

Giriş:

5 56 50

Çıktı:

50556
56550

Çeşitli sipariş noktaları:

  • Sonuçların sırası en küçükten daha küçüktür.
  • Yalnızca en küçük ve en büyük değerler yazdırılabilir (tüm varyasyonları yineleme ve bunları yazdırma geçerli değildir).
  • Listede her zaman iki veya daha fazla tamsayı olacaktır.
  • En büyük ve en küçük sonuçların aynı olması mümkündür. Giriş durumunda 5 55, numara 555iki kez yazdırılmalıdır.
  • Tam sayılar mutlaka farklı değildir. 5 5geçerli girdi.
  • Öncü 0tamsayılar üzerinde ler vardır değil geçerli giriş. Sen olacak değil hesaba gerek 05 55.

Bu kod golf olduğundan, en kısa giriş kazanır.


Giriş numaralarından biri baştaki 0 ​​(gibi 05) içeriyorsa , bunu 05basit 5mi yoksa basit olarak mı değerlendiriyoruz?
Doktor

@Optimizer başındaki sıfırlar geçerli giriş değil.

Çıktıda önde gelen 0'lara izin veriliyor mu?
Tim

@Tim Girdide önde gelen sıfır yoksa bunlar nereden gelirdi?
Martin Ender

@ MartinBüttner oh evet, aptallık!
Tim

Yanıtlar:


8

CJam, 14 13 bayt

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

Oldukça düz ileri. Bu nasıl çalışır:

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'

Buradan çevrimiçi deneyin


1
Tamam pes ediyorum. Şimdi e!var değildim (henüz wiki'de görünmüyor).
Dennis

5
@Dennis oraya gidiyorsunuz
Optimizer

1
Tatlı okudum. Yararlı yeni şeyler.
Dennis

Güncellenmesi yararlı olabilir CJam içinde golf için ipuçları bu ek hileler ile.

1
@MichaelT ipuçları genellikle bir dilin yerleşik özelliklerini açıklayan bir cevap içermez. Yine de bu yeni özelliklerden yararlanabilecekleri için birkaç cevabın güncellenmesi gerekebilir.
Doktor

5

Pyth, 14 13 bayt

hJSmsd.pcz)eJ

Tüm permütasyonları oluşturur ve ilk ve son elemanı yazdırarak sıralar.


JSatır içi ata :hJSmsd.pcz)eJ
isaacg

@isaacg İyi biri! Sadece o pis pis CJam'den daha aşağı olmayacağını biliyordum!
orlp

4

Python 2, 104 99 bayt

Evet.

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

Düzenleme: -5 bayt için xnor sayesinde!


1
İçerideki kavrama sortedparantez olmadan çalışır, ancak sıralamayı önleyebilir ve sadece minve alabilirsiniz max.
xnor

hah, evet. teşekkür ederim!
sirperkival

3

Mathematica, 64 58 bayt

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

Bu, bir dize alan ve iki satırı basan isimsiz bir işlevi tanımlar. Diğerleri gibi oldukça basittir: tüm permütasyonları alın, birleştirin, sıralayın ve ilk ve son sonucu yazdırın.

Halepalfa sayesinde altı bayt kurtarıldı.


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

@alephalpha Bazen daha basit daha iyidir. Teşekkürler! : D
Martin Ender

2

JavaScript (ES6) 54 72 85

Göründüğünden daha kolay. Onları sözlükbilimsel olarak sıralayın. İyi haber şu: Düz javascript sıralaması tam olarak böyle çalışıyor. Şey ... hayır, bu yanlış ... hala (daha kıvrımlı) bir sözlükbilim karşılaştırması işi yapabilir.

Not: a ve b sayısal değerine sahip olan a + [b], bir toplam değil, bir dize birleşimine ihtiyaç duyduğumuz için + '' + b için bir kısayoldur.
Not 2: `` içindeki yeni satır önemlidir ve sayılmalıdır

Düzenle Bir moderatörle tartışma (... sadece şaka yapıyorum)

Düzenle2 Açılır pencereler kullanarak sabit G / Ç biçimi (bkz . Code Golf için Varsayılan: Giriş / Çıkış yöntemleri )

// 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 konsolunda test et

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
Giriş formatınızın yanlış olduğunu düşünüyorum. "Tamsayılar standart girdi üzerinde tek bir boşlukla ayrılmış" olmalıdır.
nimi

@nimi haklısın Sabit
edc65

2

J, 34 36 , 42 bayt

basit kaba kuvvet:

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 bayt

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

Giriş dizesini boşluklara ayırın, her permütasyonu ve sıralamayı birleştirin. İlk ve son elemanı yazdır.


1

Julia, 77 bayt

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

Bu, bir vektörü girdi olarak kabul eden ve birleştirilmiş öğelerin permütasyonlarının minimum ve maksimumlarını bastıran adsız bir işlev oluşturur. Aramak için bir ad verin, örn.f=v->... .

Ungolfed + açıklaması:

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

Öneriler bekliyoruz!


1

Javascript ( ES6 ) 134

Ne yazık ki, JS'de yerleşik permütasyon işlevi yoktur :(

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 bayt

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

1
İyi iş. Bununla birlikte, sadece iki sütunu kullanarak bir bayt kaydedebilirsiniz, yani combinat::permn.
Alex A.

::Paketin ( libraryveya yoluyla require) yüklenmesi gerektiğini düşündüm ama değil :::. Yanlış olabilirim; bunun hakkında biraz daha okumaya ihtiyacım var. Teşekkürler.
flodel

Kütüphane yüklüyse, iki nokta üst üste işaretine ihtiyacınız yoktur; paket ad alanına eklendiğinden işlevi doğrudan çağırabilirsiniz. Paket yüklenmiş ancak yüklenmemişse, belirli bir paketteki işlevlere iki nokta üst üste ile başvurabilirsiniz.
Alex A.

Yani 58 olabilir. Bir permnolmadan doğrudan kullanmama izin vermezdim library(combinat).
flodel

Evet, çünkü zaten library(combinat)kullanabilmeniz için kütüphaneyi yüklemeniz gerekiyor permn. ;)
Alex A.

1

Yakut 75

Benim anadilim değil, denediğimi düşündüğüm bir dil ... bu yüzden (muhtemelen) bazı golf ipuçlarını kullanabilir. Yine de kötü bir katılımcı değil.

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

Her şeyin dilde yerleşik olmasının zarif olduğunu söyleyemem . Bunun tam olarak nasıl çalıştığı oldukça açık olmalıdır.


Sen yerini alabilir {|x|x.join}ile (&:join)3 bayt tasarrufu için.
Andrew

48 bayt için birkaç yakut kısayol:puts$<.read.split.permutation.map(&:join).minmax
blutorange


alır okumak için daha da kısadır:puts gets.split.permutation.map(&:join).minmax
blutorange 13:05

1

Perl, 79 70B (68 + 2)

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

İle arayın echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. İçin +2 baytlık bir ceza var -an. Modül adının uzunluğu hakkında utanç ...


0

JavaScript (ES6), 85 bayt

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

kullanımı:

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

1
Şablon dizelerine aşık olmayın. a + `` + b, $ {a} $ {b} `dan daha kısadır
edc65
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.