CodeGolf - Abaikan derau # 1

15

Instruksi

Barry adalah pengembang backend tidak begitu baik yang bertanggung jawab atas API kecil yang harus memberi Anda informasi tentang pembelian yang dilakukan di toko klien. Namun, dia belum melakukan pekerjaan dengan baik dan bos Anda memberitahu Anda untuk memperbaikinya sisi klien. Idealnya Anda harus menerima nilai dipisahkan koma seperti 927,2,45,90yang sesuai dengan sesuatu seperti item_id, item_amount, unit_price,total

Dalam teka-teki pertama ini kita hanya peduli item_iddan item_amounttetapi kita membutuhkan bidang lain untuk menyajikan masalahnya. Barry kadang-kadang mendapat hal-hal yang bercampur dan kembali suara sebagai bagian dari output, ia juga mendapat urutan yang salah, kembali noise, noise, unit_price, total, item_id, item_amount.

Tugas Anda

Anda perlu menyimpan dalam peta (atau struktur serupa) pasangan item_iddan item_amountterlepas dari apakah Barry mengembalikannya dengan benar atau tidak dan mencetak setiap elemen dalam baris baru dengan jumlah karakter paling sedikit. (Menyimpan tidak wajib, kami hanya peduli dengan hasilnya)

Input sampel (format campuran benar dan berantakan)

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

Dengan kata lain input akan berada di a,b,x,xatau di x,x,x,x,a,btempat yang kita pedulikan a& b. Anda perlu memberikan kode dengan asumsi kita memiliki variabel yang dipanggil G(atau nama lain) dengan semua baris csv.

Output sampel

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

Toleransi

Ada batas tertentu untuk toleransi dalam hal jawaban. Jawaban dalam format yang serupa tetapi mematuhi nilai yang benar, juga akan diterima. Format suka [a,b], (a,b)atau {a,b}valid, tetapi a,blebih disukai.

Meskipun puzzle pertama memiliki penerimaan yang beragam karena fakta bahwa itu mudah dan cepat untuk dipecahkan, saya juga merasa bahwa beberapa orang juga menyukainya. Jadi saya akan terus membuat quickgolfs untuk saat ini

Juan Cortés
sumber
Apakah input akan selalu berupa format x,x,x,xdan di x,x,x,x,x,xmana xmenunjukkan angka?
Spikatrix
Ya, input akan mengikuti salah satu dari dua format itu, izinkan saya mengklarifikasi
Juan Cortés
Apakah kita perlu mengirimkan program atau fungsi atau yang lain? Juga, dari mana semua input dapat diambil?
Spikatrix
3
quick-golf pada dasarnya adalah tag kesulitan. Tampaknya konsensus adalah bahwa kami tidak menginginkan itu , jadi saya menghapus tag itu untuk saat ini. Jika Anda ingin agar tag kesulitan dievaluasi kembali, harap buat meta postingan untuk itu. Tapi itu akan menjadi upaya retagging besar-besaran, yang saya pikir harus terjadi secara terkoordinasi, daripada pengguna individu membuat tag baru yang sewenang-wenang untuk itu.
Martin Ender
2
@ CoolGuy Tidak ada hal seperti itu. Anda tidak seharusnya mengalahkan Pyth dengan C (karena Anda tidak akan pernah melakukannya). Kegembiraannya adalah mengalahkan kiriman lainnya dalam bahasa yang sama atau bahasa dengan verbositas yang sama. Jika sudah ada 50 byte pengajuan C saya bisa mengerti tidak memposting (walaupun demikian, saya mungkin mempostingnya jika pendekatannya berbeda dan menarik). Tetapi karena tidak ada, silakan posting jawaban Anda. Anda cukup dekat dengan JavaScript dan Python, jadi pasti tidak terlalu lama untuk C.
Martin Ender

Jawaban:

8

Pyth, 10 byte

FNG<.<N4 2

Cobalah secara online: Pyth Compiler / Executor

(4 karakter pertama =G.Qmembaca semua data dan menyimpannya di G)

Penjelasan

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements
Jakube
sumber
4
cantik, aku sudah mulai menyukai Pyth
Juan Cortés
3
@ JuanCortés: Ini mungkin sumber yang bagus jika Anda ingin memulai dengan Pyth.
Alex A.
7

Perl, 24

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

Contoh:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20
nutki
sumber
1
Ini akan menjadi 20 byte di Retina . ;)
Martin Ender
7

Python 3, 123 76 72 62 byte

Saya pendatang baru, harus mulai di suatu tempat ...

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

Dengan saran xnor dan DLosc (62 byte):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])
monguin
sumber
8
Selamat Datang di Programming Puzzles dan Code Golf! Karena ini adalah kompetisi kode-golf , Anda harus membuat kode sesingkat mungkin. Satu hal yang bisa Anda lakukan adalah mengurangi jumlah ruang yang digunakan untuk indentasi; satu ruang cukup dengan Python. Posting ini mencantumkan tip untuk bermain golf dengan Python dan mungkin merupakan referensi yang bagus.
Alex A.
@Alex, terima kasih - Saya mencoba mencari tahu apa aturan sebenarnya, saya berharap bisa mengabaikan beberapa spasi, tapi saya rasa tidak.
monguin
Tidak, baris baru, dan spasi keduanya menjadi faktor penghitungan karakter Anda.
Alex A.
Bahkan, dalam hal ini, Anda bahkan tidak perlu baris baru dan indentasi. Pernyataan blok seperti forbisa semua berada pada baris yang sama dengan Python, selama tidak ada pernyataan blok lain di dalam tubuh.
DLosc
3
Awal yang bagus. Anda dapat meletakkan semuanya di baris yang sama dengan foruntuk menghindari indentasi. Persyaratan [0,4][...] dapat disingkat 4*(...) , menggunakan fakta bahwa bools sama dengan 0/1. Selain itu, jika Anda menulis d[x:x+2]sebagai d[x:][:2], meskipun satu karakter lebih panjang, Anda dapat menghindari menyimpan ekspresi untuk xvariabel.
xnor
4

Sed, 32 byte

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

Ini menghapus semuanya hingga koma ke-4 jika ada. Kemudian menghapus semuanya dari koma ke-2 (yang sebelumnya mungkin ke-6).

Dan saya bahkan berhasil membenarkan!

Toby Speight
sumber
Apakah ada peluang melihat demo?
Juan Cortés
Saya tidak yakin apa yang Anda inginkan dari demo - Saya menjalankan input tes yang disediakan dan mendapatkan output yang diperlukan.
Toby Speight
4

Javascript, 44 byte

Mengasumsikan input dalam variabel G.

Sunting: Saya baru sadar, ini sangat mirip dengan solusi perl nutki.

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

Demo cuplikan:

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>

nderscore
sumber
4

Scala, 68 byte

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

- Tuan tulang

Scala, 46 70 byte

Sunting: Cetak hasilnya

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

Demo

Gabriel Jones
sumber
1
1 byte lebih sedikit, dengan menggunakan petaG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly
1
byte lain disimpan dengan menjatuhkan ikatan:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Squidly
3

CJam, 18 15 14 byte

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

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

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.
Dennis
sumber
3

Shell POSIX, 30 byte

Dengan asumsi POSIX seddan cuthadir:

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

Gandakan baris, biarkan data yang menarik siap diekstraksi dari bidang 5 dan 6.

Toby Speight
sumber
3

Javascript, 117 112 99 95 84 76 71 byte

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

JS Fiddle

RichieAHB
sumber
1
Silakan kirim biola, atau demo
Juan Cortés
Anda dapat menghapus dua b dengan mengganti ;dengan ,di badan loop dan karena itu menghapus kawat gigi {dan}
Juan Cortés
@ JuanCortés - terima kasih, tidak tahu itu. Apa teori di balik itu?
RichieAHB
Jika tidak ada kawat gigi yang ditambahkan, badan loop akan menjadi ekspresi pertama setelah kurung tutup. Ekspresi diakhiri dengan tanda titik koma. Memisahkan ekspresi dengan koma membuat mereka seperti grup ekspresi jika Anda bisa, mengakhiri ekspresi setelah mereka
Juan Cortés
1
Menggunakan for ofAnda dapat menyimpan 3 byte. Ini berfungsi di semua browser modern. for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65
2

Pip , 12 + 1 = 13 byte

Menggunakan -lbendera, yang memberikan output sebagai daftar angka yang dipisahkan oleh spasi pada setiap baris. *

_@[4 5]Mg^',

Penjelasan:

  • Daftar angka diharapkan dalam g . Karena gbiasanya diinisialisasi dari argumen baris perintah, Anda juga dapat memasukkan input untuk hasil yang sama.
  • ^', membagi (setiap string dalam) daftar pada koma.
  • M memetakan fungsi ke setiap elemen dalam hasil.
  • _@[4 5]mendefinisikan fungsi lambda. Argumen untuk fungsi diwakili oleh _; @[4 5]mengembalikan daftar elemen ke-4 dan ke-5. Jika daftar memiliki enam elemen, ini akan menjadi dua elemen terakhir. Jika memiliki empat, indeks membungkus, dan hasilnya adalah dua yang pertama. (Misalnya"abcd"@4 == "abcd"@0 == "a" .)
  • Kami sekarang memiliki daftar daftar, seperti [[103 2] [106 1] [67 2]], yang dicetak secara otomatis di akhir program. The -lbendera bergabung masing-masing sub-daftar pada ruang dan kemudian semuanya pada baris baru, sehingga hasilnya adalah sebagai berikut:
C: \> pip.py -le "_ @ [4 5] Mg ^ '," 103,2,50,100 106,1,900,900 459,40,150,300,67,2
103 2
106 1
67 2

* Saat ini. Saya mungkin mengubah perilaku ini, tetapi saya masih berencana untuk memiliki beberapa bendera yang melakukan hal yang sama.

DLosc
sumber
1

Perl, 37

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

35karakter +2untuk -pdan -l. Saya tidak yakin apakah ada pendekatan di Perl yang akan mengalahkan solusi @ nutki , tapi saya pikir saya akan tetap mengirim ide ini.

Jalankan dengan:

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

bash, 54

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

C, 95 byte

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

Kode itu sederhana. Ini adalah versi yang tidak dikoleksi:

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
}

Uji di sini

Spikatrix
sumber
0

Ruby, 53

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

atau bagus.

MegaTom
sumber