CodeGolf - 1 numaralı gürültüyü yoksay


15

Talimatlar

Barry, bir müşterinin mağazasında yapılan satın alımlar hakkında size bilgi vermesi gereken küçük bir API'den sorumlu çok iyi bir arka uç geliştiricisidir. Ancak, o iyi bir iş yapmadı ve patronunuz bunu müşteri tarafında düzeltmenizi söylüyor. İdeal gibi virgülle ayrılmış değerler alması gereken 927,2,45,90gibi bir şey karşılık hangi item_id, item_amount, unit_price,total

Bu ilk bulmacada sadece önemsiyoruz item_idve item_amountsorunu sunmak için diğer alanlara ihtiyacımız var. Barry bazen karışık şeyler ve getiri elde gürültü çıkışı bir parçası olarak, o da alır sipariş yanlış, dönen noise, noise, unit_price, total,item_id , item_amount.

Senin görevin

Bir haritanın deposunda (veya benzer yapıda) çiftleri gerek item_idveitem_amount ne olursa olsun Barry doğru ya da değil, onları döndüren ve olası karakterlerin az sayıda yeni hat her bir öğeyi yazdırmak olsun. (Depolama zorunlu değildir, sadece çıktıya önem veriyoruz)

Örnek giriş (karışık doğru ve dağınık formatlar)

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

Diğer bir deyişle, girdi ya olacak ya a,b,x,xda değer x,x,x,x,a,bverdiğimiz şey a&b . GTüm csv satırlarıyla adlandırılan (veya başka bir ad) değişkenimiz olduğunu varsayarak kod sağlamanız gerekir .

Örnek çıktı

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

Hoşgörü

Cevap söz konusu olduğunda belli bir hoşgörü payı vardır. Benzer biçimlerdeki ancak doğru değerlere bağlı kalan yanıtlar da kabul edilecektir. Biçimleri gibi [a,b], (a,b)ya da {a,b}geçerlidir, ancak a,btercih edilir.

İlk bulmacanın çözülmesi kolay ve hızlı olması nedeniyle karışık bir kabul görmesine rağmen, bazı insanların da bunu sevdiğini hissettim. Şimdilik çabuk golf yapmaya devam edeceğim


Girdi her zaman biçimdedir x,x,x,xve x,x,x,x,x,xnerede xbir sayı gösterir?
Spikatrix

Evet, girdi bu iki biçimden birini izleyecek, açıklığa kavuşturalım
Juan Cortés

Bir program, işlev veya başka bir şey göndermemiz gerekiyor mu? Ayrıca, tüm girdiler nereden alınabilir?
Spikatrix

3
hızlı golf aslında bir zorluk etiketi. Fikir birliği, biz istemiyoruz gibi görünüyor , bu yüzden şimdilik bu etiketi kaldırıyorum. Zorluk etiketlerinin yeniden değerlendirilmesini istiyorsanız, lütfen bunun için bir meta yayın yapın. Ancak bu, rastgele yeni etiketler oluşturan bireysel kullanıcılar yerine koordineli bir şekilde gerçekleşmesi gerektiğini düşündüğüm büyük bir yeniden etiketleme çabası olurdu.
Martin Ender

2
@CoolGuy Böyle bir şey yok. Pyth'i C ile yenmemelisin (çünkü asla yapmayacaksın). Sevinç, aynı dilde veya benzer ayrıntılara sahip dillerdeki diğer gönderimleri yenmektir. Zaten 50 baytlık bir gönderim olsaydı, göndermemeyi anlayabilirdim (o zaman bile, yaklaşım farklı ve ilginçse gönderebilirim). Ama olmadığından, lütfen cevabınızı gönderin. JavaScript ve Python'a oldukça yakınsınız, bu yüzden C için kesinlikle çok uzun değil
Martin Ender

Yanıtlar:


8

Pyth, 10 bayt

FNG<.<N4 2

Çevrimiçi deneyin: Pyth Derleyici / Yönetici

(İlk 4 karakter =G.Qtüm verileri okur veG )

açıklama

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

4
güzel, zaten Pyth'i sevmeye başlıyorum
Juan Cortés

3
@ JuanCortés: Bu size Pyth başlamak için arıyorsanız iyi bir kaynak olabilir.
Alex A.

7

Perl, 24

perl -pe's/(\d+,){4}|,\d+,\d+$//'

Misal:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20

1
Bu, Retina'da 20 bayt olacaktır . ;)
Martin Ender

7

Python 3, 123 76 72 62 bayt

Ben yeni geliyorum, bir yerden başlamalıyım ...

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

Xnor ve DLosc'un önerileriyle (62 bayt):

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

8
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Bu bir kod golf yarışması olduğundan, kodunuzu mümkün olduğunca kısa yapmak istersiniz. Yapabileceğiniz bir şey, girintiler için kullanılan alan miktarını azaltmaktır; Python'da tek bir alan yeterlidir. Bu yazı Python'da golf için ipuçları listeliyor ve iyi bir referans olabilir.
Alex A.

@Alex, teşekkürler - Kuralların tam olarak ne olduğunu anlamaya çalışıyordum, bazı boşlukları görmezden gelebileceğimi umuyordum, ama sanmıyorum.
monguin

Hayır, yeni satırlar ve boşluklar karakter sayınızı etkiler.
Alex A.

Aslında, bu durumda, yeni satıra ve girintiye bile ihtiyacınız yoktur. Gibi forblok ifadeleri, gövdede başka bir blok ifadesi olmadığı sürece Python'da aynı satırda olabilir.
DLosc

3
İyi bir başlangıç. Sen koyabilirsiniz aynı satırda her şeyi olarak forgirintiler önlemek için. Koşullar [0,4][...] , 4*(...) bools 0/1 eşit olduğu gerçeği kullanılarak kısaltılabilir . Eğer yazarsanız Ayrıca d[x:x+2]olarak d[x:][:2], uzun bir karakter olsa da, sizin için ifade tasarrufu önlemek sağlayan xbir değişkene.
xnor

4

Sed, 32 bayt

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

Bu, varsa 4. virgüle kadar her şeyi siler. Sonra (daha önce 6. olmuş olabilir) 2. virgül her şeyi siler.

Ve hatta haklı gerekçelendirmeyi başardım!


Bir demo izleme şansınız var mı?
Juan Cortés

Bir demodan ne istediğinizden emin değilim - verilen test girişinizi çalıştırdım ve gerekli çıktıyı aldım.
Toby Speight

4

Javascript, 44 bayt

Değişkende giriş olduğu varsayılır G.

Düzenleme: Sadece fark ettim, bu nutki'nin perl çözümüne çok benziyor.

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

Snippet Demosu:

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 bayt

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

- BayBones

Scala, 46 70 bayt

Düzenle: Sonucu yazdırın

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

gösteri


1
1 bayt daha az, bunun yerine haritayı kullanarakG.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(",")))
Bağlamayı

3

CJam, 18 15 14 bayt

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

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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 kabuğu, 30 bayt

POSIX varsayıldığında sedve cutmevcut:

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

Çizgiyi çoğaltır ve ilgilenilen verileri alan 5 ve 6'dan çıkarılmaya hazır bırakır.


3

JavaScript, 117 112 99 95 84 76 71 bayt

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

JS Fiddle


1
Lütfen bir keman veya demo gönderin
Juan Cortés

Sen değiştirerek iki b kaldırabilirsiniz ;ile ,döngü gövdesinde ve bu nedenle parantez kaldırılması {ve}
Juan Cortes

@ JuanCortés - teşekkürler, bunu bilmiyordum. Bunun arkasındaki teori nedir?
RichieAHB

Herhangi bir diş teli eklenmezse, döngü gövdesi kapanış parantezinden sonraki ilk ifade olacaktır. Bir ifade noktalı virgülle biter. İfadeleri virgülle ayırmak , ifadeyi onlardan sonra sona erdirebilirseniz, onları bir ifade grubu gibi yapar
Juan Cortés

1
Kullanarak for of3 bayt kaydedebilirsiniz. Herhangi bir modern tarayıcıda çalışır. for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65

2

bip , 12 + 1 = 13 bayt

-lÇıktıyı her satırda boşlukla ayrılmış sayı listeleri olarak veren bayrağı kullanır . *

_@[4 5]Mg^',

Açıklama:

  • İçinde sayıların listesi bekleniyor g. Dan berig normalde komut satırı argümanları olarak başlatılmış olan, ayrıca aynı sonuçlar için oraya girdi koyabilirsiniz.
  • ^', listeyi virgülle böler.
  • M bir işlevi sonuçtaki her öğeyle eşleştirir.
  • _@[4 5]lambda fonksiyonunu tanımlar. İşlevin argümanı _; @[4 5]4. ve 5. öğelerinin bir listesini döndürür. Listede altı öğe varsa, bunlar son iki öğe olacaktır. Dört tane varsa, endeksler etrafa sarılır ve böylece sonuç ilk ikisidir. (Örneğin"abcd"@4 == "abcd"@0 == "a" .)
  • Şimdi [[103 2] [106 1] [67 2]], programın sonunda otomatik olarak yazdırılan gibi bir liste listemiz var . -lSonuç olarak şu bu yüzden bayrak, uzay her alt listesi ve yeni satır üzerinde daha sonra her şeyi katılır:
C: \> pip.py -le "_ @ [4] Mg ^ '," 103,2,50,100 106,1,900,900 459,40,150,300,67,2
103 2
106 1
67 2

* Şu anda. Bu davranışı değiştirebilirim, ama yine de aynı şeyi yapan bir bayrağa sahip olmayı düşünüyorum.


1

Perl, 37

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

35ve +2için karakterler . Perl'de @ nutki'nin çözümünü yenecek bir yaklaşım olup olmadığından emin değilim , ama yine de bu fikri paylaşacağımı düşündüm.-p-l

Şununla çalıştır:

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

1

bash, 54

while IFS=, read {a..f};do echo ${e:-$a},${f:-$b};done

0

C, 95 bayt

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);}

Kod basit. İşte ungolfed sürümü:

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
}

Burada test edin


0

Yakut, 53

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

ya da iyidir.

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.