Số lần xuất hiện


12

Đầu vào:

Danh sách các số nguyên (sẽ không bao giờ chứa số 0)

Đầu ra:

Một danh sách có cùng kích thước với số lượng dựa trên các điều sau đây:

  • Nếu mục hiện tại là âm: Xem tất cả các mục trước mục này và đếm số lần các chữ số xuất hiện trong các số khác đó
  • Thay vào đó, nếu mặt hàng hiện tại là dương: Hãy xem tất cả các mặt hàng sau mặt hàng này và đếm số lần xuất hiện của các chữ số trong các số khác đó

Có một vòng xoắn: Nếu kích thước của danh sách là chẵn, chúng tôi chỉ đếm mỗi số một lần (ngay cả khi nó khớp với nhiều chữ số) và nếu kích thước là số lẻ, chúng tôi sẽ đếm từng chữ số của mỗi chữ số cho mỗi chữ số của mục hiện tại (trùng lặp chữ số được tính nhiều lần).

Hãy đưa ra một số ví dụ để làm rõ điều này một chút:

Ví dụ với danh sách chẵn:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Kích thước của danh sách là chẵn , vì vậy chúng tôi chỉ đếm mỗi số một lần.

  • 4: Đó là tích cực, vì vậy chúng tôi mong đợi. Có ba số chứa các chữ số 4( 42, -942, 8374). Vì vậy, chúng tôi bắt đầu với một 3.
  • 10: Đó là tích cực, vì vậy chúng tôi mong đợi. Có hai số chứa chữ số 1và / hoặc 0( -10, -200). Vì vậy, đầu ra thứ hai là 2.
  • 42: Một lần nữa tích cực, vì vậy chuyển tiếp. Có bốn số có chứa một trong hai chữ số 4và / hoặc 2( -942, 8374, 728, -200). Vì vậy, đầu ra thứ ba là 4.
  • -10: Lần này là tiêu cực, vì vậy chúng tôi nhìn về phía sau. Chỉ có một số chứa chữ số 1và / hoặc 0(chúng tôi bỏ qua dấu trừ) ( 10). Vì vậy, đầu ra thứ tư là 1.
  • Vân vân.

Ví dụ với danh sách lẻ:

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Kích thước của danh sách là số lẻ , vì vậy chúng tôi đếm từng chữ số.

  • 382: Đó là tích cực, vì vậy chúng tôi mong đợi. Có một 3trong các số khác ( 381), sáu 8trong các số khác ( -82, -8, 381, 228, 28, -28) và sáu 2trong các số khác ( -82, 228, 28, -28, 2). Vì vậy, chúng tôi bắt đầu với một 13.
  • -82: Đó là tiêu cực, vì vậy ngược. Có một 3trong số khác ( 382) và một 8trong số khác ( 382). Vì vậy, đầu ra thứ hai là 2.
  • ...
  • 228: Đó là tích cực, vì vậy chuyển tiếp. Có ba 2là trong các số khác ( 28, -28, -2), và thêm ba 2's, và hai 8là trong các số khác ( 28, -28). Vì vậy, đầu ra này là8 .
  • Vân vân.

Quy tắc thử thách:

  • Bạn có thể cho rằng đầu vào sẽ không bao giờ chứa 0dưới dạng mục, vì nó không dương hay âm.
  • Bạn có thể giả sử danh sách đầu vào sẽ luôn chứa ít nhất hai mục.
  • I / O là linh hoạt. Đầu vào / đầu ra có thể là mảng / danh sách các số nguyên, chuỗi phân cách, chữ số / ma trận ký tự, v.v.
  • Nếu số đầu tiên trong danh sách là số âm hoặc số cuối cùng trong danh sách là số dương, nó sẽ là 0 trong danh sách kết quả.
  • Với các danh sách lẻ, các số chứa cùng một chữ số nhiều lần được tính nhiều lần, như 228trong ví dụ lẻ ở trên dẫn đến 8(3 + 3 + 2) thay vì 5(3 + 2).

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Áp dụng quy tắc chuẩn cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19]
Output: [9,  1,   7,  3,   5,  5,   3,  7,   1,  9  ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19, 20]
Output: [11, 2,   8,  4,   5,  6,   3,  8,   1,  10,  0 ]

Input:  [88, 492, -938, 2747, 828, 84710, -29, -90, -37791]
Output: [8,  9,   3,    9,    3,   4,     5,   4,   12    ]

Input:  [-1, 11, 11, 1]
Output: [0,  2,  1,  0]

Input:  [1, 11, 11, -1]
Output: [3, 2,  1,  3 ]

Input:  [-1, 11, 1]
Output: [0,  2,  0]

Input:  [1, 11, -1]
Output: [3, 2,  3 ]

Câu trả lời:




4

Java (JDK 10) , 204 byte

a->{int l=a.length,r[]=new int[l],i=0,j,x,y,b,s,t=10;for(;i<l;i++)for(j=i+(s=a[i]>0?1:-1);0<=j&j<l;j+=s)for(b=0,x=a[i];x!=0;x/=t)for(y=a[j];b<1&y!=0;y/=t)if(x%t==-y%t|x%t==y%t){r[i]++;b+=1-l%2;}return r;}

Hãy thử trực tuyến!

Tín dụng


[1,11,-1]nên trở về [3,2,3]. Đó là một danh sách kỳ lạ, vì vậy tất cả các chữ số đều được tính. Đầu tiên 1: Nhìn về phía trước, 1tổng cộng ba giây : 11,-1. Thứ hai 11: Nhìn về phía trước cho mỗi chữ số: một 1+ một 1. Thứ ba -1: Nhìn về phía sau, 1tổng cộng ba giây : -1,11. (Với danh sách lẻ bạn nên nhìn vào mỗi chữ số, thậm chí cùng tôi sẽ làm rõ điều này trong thử thách, nhưng ví dụ lẻ với số. 228Làm rõ điều này một chút.)
Kevin Cruijssen

@KevinCruijssen Nên sửa ngay.
Olivier Grégoire

Nó thực sự làm. Tôi đã sợ lời giải thích ban đầu có thể hơi không rõ ràng khi tôi đăng nó .. Bây giờ tôi sẽ xem liệu tôi có thể đánh golf bất cứ điều gì trong câu trả lời của bạn không. ;)
Kevin Cruijssen

1
Tôi không có nhiều thời gian, hoặc, nhưng có một điều bạn có thể chơi golf là thêm một biến mới ,tvà thay đổi i+(a[i]>0?1:-1)đến i+(t=a[i]>0?1:-1), và sau đó chỉ cần sử dụng j+=tthay vì j+=a[i]>0?1:-1.
Kevin Cruijssen

1
Bạn có thể lưu 2 nếu bạn khai báo ví dụ t = 10 và thay thế tất cả 10 số đó cho t, mặc dù điều đó sẽ khó hiểu hơn
Java Gonzar





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.