CodeGolf - Bỏ qua tiếng ồn # 1


15

Hướng dẫn

Barry là một nhà phát triển phụ trợ không giỏi phụ trách một API nhỏ sẽ cung cấp cho bạn thông tin về các giao dịch mua được thực hiện trong cửa hàng của khách hàng. Tuy nhiên, anh ta đã không làm một công việc tuyệt vời và sếp của bạn nói với bạn để sửa nó ở phía khách hàng. Lý tưởng nhất là bạn sẽ nhận được giá trị bằng dấu phẩy như 927,2,45,90tương ứng với cái gì đó như item_id, item_amount, unit_price,total

Trong câu đố đầu tiên này, chúng tôi chỉ quan tâm item_iditem_amountnhưng chúng tôi cần các lĩnh vực khác để trình bày vấn đề. Barry đôi khi được điều trộn lên và trả về tiếng ồn như một phần của đầu ra, ông cũng bị sai trật tự, trở về noise, noise, unit_price, total, item_id, item_amount.

Nhiệm vụ của bạn

Bạn cần lưu trữ trong một bản đồ (hoặc cấu trúc tương tự) các cặp item_iditem_amountbất kể Barry có trả lại chúng chính xác hay không và in từng phần tử trong một dòng mới với số lượng ký tự ít nhất có thể. (Lưu trữ là không bắt buộc, chúng tôi chỉ quan tâm đến đầu ra)

Đầu vào mẫu (định dạng hỗn hợp chính xác và lộn xộn)

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

Nói cách khác, đầu vào sẽ là a,b,x,xhoặc x,x,x,x,a,bnơi mà chúng ta quan tâm là a& b. Bạn cần cung cấp mã giả sử chúng ta có một biến được gọi G(hoặc bất kỳ tên nào khác) với tất cả các dòng của csv.

Sản lượng mẫu

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

Lòng khoan dung

Có một giới hạn nhất định cho sự khoan dung khi nói đến câu trả lời. Câu trả lời trong các định dạng tương tự nhưng tuân thủ các giá trị chính xác, cũng sẽ được chấp nhận. Các định dạng như [a,b], (a,b)hoặc {a,b}hợp lệ, nhưng a,bđược ưa thích.

Mặc dù câu đố đầu tiên có sự chấp nhận hỗn hợp do thực tế là nó dễ dàng và nhanh chóng để giải quyết, tôi cũng cảm thấy rằng một số người cũng thích điều đó. Vì vậy, bây giờ tôi sẽ tiếp tục làm quickgolf


Đầu vào sẽ luôn có định dạng x,x,x,xx,x,x,x,x,xnơi xbiểu thị một số?
Spikatrix

Có, đầu vào sẽ tuân theo một trong hai định dạng đó, hãy để tôi làm rõ
Juan Cortés

Chúng ta có cần gửi một chương trình hoặc một chức năng hoặc cái gì khác không? Ngoài ra, tất cả các đầu vào có thể được lấy từ đâu?
Spikatrix

3
golf nhanh về cơ bản là một thẻ khó khăn. Đồng thuận dường như là chúng tôi không muốn những thứ đó , vì vậy tôi sẽ xóa thẻ đó ngay bây giờ. Nếu bạn muốn đánh giá lại các thẻ khó, vui lòng tạo một bài đăng meta cho nó. Nhưng đó sẽ là một nỗ lực thử lại lớn, mà tôi nghĩ nên xảy ra theo cách phối hợp, thay vì người dùng cá nhân tạo ra các thẻ mới tùy ý cho nó.
Martin Ender

2
@CoolGuy Không có chuyện đó. Bạn không cần phải đánh bại Pyth bằng C (vì bạn sẽ không bao giờ tham gia). Niềm vui là trong việc đánh bại các bài nộp khác trong cùng một ngôn ngữ hoặc các ngôn ngữ có độ dài tương tự. Nếu đã có một bài nộp 50 byte C tôi có thể hiểu là không đăng (mặc dù sau đó, tôi có thể đăng nó nếu cách tiếp cận khác và thú vị). Nhưng vì không có, xin vui lòng gửi câu trả lời của bạn. Bạn khá gần gũi với JavaScript và Python, vì vậy nó chắc chắn không quá dài đối với C.
Martin Ender

Câu trả lời:


8

Bình thường, 10 byte

FNG<.<N4 2

Dùng thử trực tuyến: Trình biên dịch / thực thi Pyth

(4 ký tự đầu tiên =G.Qđọc tất cả dữ liệu và lưu trữ dữ liệu đó G)

Giải trình

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

4
đẹp quá, tôi bắt đầu thích Pyth rồi
Juan Cortés

3
@ JuanCortés: Đây có thể là một tài nguyên tốt nếu bạn đang muốn bắt đầu với Pyth.
Alex A.

7

Perl, 24

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

Thí dụ:

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

1
Đây sẽ là 20 byte trong Retina . ;)
Martin Ender

7

Python 3, 123 76 72 62 byte

Tôi là người mới, phải bắt đầu ở đâu đó ...

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

Với đề xuất của xnor và DLosc (62 byte):

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

8
Chào mừng bạn đến với Câu đố lập trình và Code Golf! Vì đây là một cuộc thi đánh gôn , bạn sẽ muốn làm cho mã của mình càng ngắn càng tốt. Một điều bạn có thể làm là giảm lượng không gian được sử dụng cho các vết lõm; một không gian duy nhất đủ trong Python. Bài đăng này liệt kê các mẹo để chơi gôn trong Python và có thể là một tài liệu tham khảo tốt.
Alex A.

@Alex, cảm ơn - Tôi đã cố gắng tìm ra các quy tắc chính xác là gì, tôi đã hy vọng tôi có thể bỏ qua một số khoảng trắng, nhưng tôi đoán là không.
cào cào

Không, dòng mới và không gian cả hai yếu tố vào số lượng nhân vật của bạn.
Alex A.

Trong thực tế, trong trường hợp này, bạn thậm chí không cần dòng mới và thụt lề. Chặn các câu lệnh nhưfor có thể là tất cả trên cùng một dòng trong Python, miễn là không có câu lệnh chặn nào khác trong phần thân.
DLosc

3
Một khởi đầu tốt. Bạn có thể đặt tất cả mọi thứ trên cùng một dòng như forđể tránh indents. Các điều kiện [0,4][...] có thể được rút ngắn 4*(...) , sử dụng thực tế là các bool bằng 0/1. Ngoài ra, nếu bạn viết d[x:x+2]dưới dạng d[x:][:2], mặc dù dài hơn một ký tự, cho phép bạn tránh lưu biểu thức cho xmột biến.
xnor

4

Sed, 32 byte

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

Điều này xóa mọi thứ lên đến dấu phẩy thứ 4 nếu có. Sau đó, nó xóa mọi thứ từ dấu phẩy thứ 2 (có thể trước đó là thứ 6).

Và tôi thậm chí đã xoay sở để biện minh đúng!


Bất kỳ cơ hội để xem một bản demo?
Juan Cortés

Tôi không chắc chắn những gì bạn muốn từ một bản demo - Tôi đã chạy đầu vào thử nghiệm được cung cấp của bạn và nhận được đầu ra cần thiết.
Toby Speight

4

Javascript, 44 byte

Giả sử đầu vào trong biến G.

Chỉnh sửa: Tôi mới nhận ra, điều này trông rất giống giải pháp perl của nutki.

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

Đoạn giới thiệu:

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 byte

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

- MrBones

Scala, 46 70 byte

Chỉnh sửa: In ra kết quả

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

Bản giới thiệu


1
Ít hơn 1 byte, bằng cách sử dụng bản đồ thay thếG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly

1
một byte khác được lưu bằng cách bỏ liên kết:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Squidly

3

CJam, 18 15 14 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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

Vỏ POSIX, 30 byte

Giả sử POSIX sedcutcó mặt:

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

Sao chép dòng, để lại dữ liệu quan tâm sẵn sàng để được trích xuất từ ​​các trường 5 và 6.


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])

Fiddle


1
Vui lòng gửi một câu đố hoặc bản demo
Juan Cortés

Bạn có thể loại bỏ hai b bằng cách thay thế ;bằng ,trong thân vòng lặp và do đó loại bỏ niềng răng {}
Juan Cortés

@ JuanCortés - cảm ơn, không biết điều đó. Lý thuyết đằng sau đó là gì?
RichieAHB

Nếu không có dấu ngoặc nhọn, phần thân của vòng lặp sẽ là biểu thức đầu tiên sau dấu ngoặc đơn đóng. Một biểu thức kết thúc bằng dấu chấm phẩy. Việc tách các biểu thức bằng dấu phẩy làm cho chúng giống như một nhóm biểu thức nếu bạn có thể, kết thúc biểu thức sau chúng
Juan Cortés

1
Sử dụng for ofbạn có thể tiết kiệm 3 byte. Nó hoạt động trong bất kỳ trình duyệt hiện đại. 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

Sử dụng -lcờ, cung cấp đầu ra dưới dạng danh sách các số được phân tách bằng dấu cách trên mỗi dòng. *

_@[4 5]Mg^',

Giải trình:

  • Danh sách các số dự kiến ​​trong g. Vì gthường được khởi tạo từ các đối số dòng lệnh, bạn cũng có thể đặt đầu vào ở đó để có kết quả tương tự.
  • ^', chia nhỏ (mỗi chuỗi trong) danh sách trên dấu phẩy.
  • M ánh xạ một chức năng cho từng yếu tố trong kết quả.
  • _@[4 5]định nghĩa hàm lambda. Đối số của hàm được biểu diễn bởi _; @[4 5]trả về một danh sách các yếu tố thứ 4 và thứ 5 của nó. Nếu danh sách có sáu yếu tố, đây sẽ là hai yếu tố cuối cùng. Nếu nó có bốn, các chỉ số quấn quanh, và do đó, kết quả là hai chỉ số đầu tiên. (Ví dụ "abcd"@4 == "abcd"@0 == "a".)
  • Bây giờ chúng tôi có một danh sách các danh sách, như [[103 2] [106 1] [67 2]], được in tự động vào cuối chương trình. Các -lcờ tham gia mỗi sub-list trên không gian và sau đó toàn bộ điều trên xuống dòng, vì vậy kết quả như sau:
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

* Hiện tại. Tôi có thể thay đổi hành vi này, nhưng tôi vẫn dự định có một số cờ thực hiện điều tương tự.


1

Perl, 37

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

35nhân vật +2cho -p-l. Tôi không chắc liệu có một cách tiếp cận nào trong Perl sẽ đánh bại giải pháp của @ nutki hay không , nhưng tôi đoán rằng tôi sẽ đăng ý tưởng này bằng mọi cách.

Chạy với:

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

Mã rất đơn giản. Đây là phiên bản chưa được chỉnh sửa:

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
}

Kiểm tra nó ở đây


0

Ruby, 53

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

hoặc là tốt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.