Thử thách số nguyên thứ tự âm, nhưng đó là Prime Time!


12

Tôi đang nói về câu hỏi này , hãy xem nó nếu bạn có một chút bối rối.

Nhiệm vụ chính

Nhiệm vụ của bạn là xuất các số nguyên được nối, theo thứ tự giảm dần, nhưng tăng số nguyên tối đa mỗi lần bạn nhấn 1 (đối với câu hỏi này, 1 sẽ được coi là số nguyên tố) . Mặc dù điều này không có vẻ gì khác với câu hỏi đầu tiên, nhưng ở đây có phần khó khăn: Tất cả các số xuất ra chỉ có thể là số nguyên tố . Chúng sẽ được xâu chuỗi lại với nhau thành một chuỗi không có khoảng trắng hoặc dòng mới. Đầu vào của bạn cũng sẽ là một số nguyên tố .

Thí dụ:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

Đầu vào

Mã của bạn chỉ có thể lấy một đầu vào: số nguyên tố cao nhất sẽ được in. Đầu vào này có thể đến từ bất cứ đâu (đồ họa, STDIN). Bạn yên tâm rằng đầu vào là một số nguyên tố.

Đầu ra

Bạn sẽ phải xuất số kết quả. Bạn có thể lấy số này bằng cách tiếp tục đếm ngược, chỉ đếm số nếu đó là số nguyên tố, sau đó kết nối tất cả các kết quả lại với một số. Số "hàng" cuối cùng (ví dụ 7, 5, 3, 2, 1) phải được in đầy đủ. Đầu ra có thể là bất cứ thứ gì (số, chuỗi, đồ họa), miễn là có thể đọc được. Mẫu Regex tương tự để kiểm tra các trường hợp thử nghiệm của bạn được áp dụng:

^(\D*(\d)+\D*|)$

Nếu đầu ra của bạn không khớp với mẫu này, mã của bạn không hợp lệ.

Quy tắc

  • Đầu vào được đảm bảo là số nguyên tố, không bao gồm xử lý lỗi, trừ khi bạn muốn / cần.
  • Đầu ra có thể chỉ là một số được kết nối đầy đủ, do đó không bị chia tách bởi bất cứ điều gì, thậm chí không phải là dòng mới.
  • Thuật toán của bạn không nên kiểm tra phiên bản đầu tiên Nxuất hiện (ví dụ: 17in 1175321), mà là ví dụ đầu tiên Nlà số thực tế.
  • Đầu vào của bạn được đảm bảo là tích cực, không thêm xử lý trừ khi bạn muốn / cần.

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

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

Người chiến thắng

Đây là , vì vậy tác giả của mã có độ dài ít nhất tính bằng byte sẽ thắng!


8
Tôi sẽ không đề nghị thay đổi thử thách, nhưng tôi không nghĩ 1là chính.
Erik the Outgolfer

3
1. Có một trường hợp thử nghiệm 1mâu thuẫn trực tiếp với thông số kỹ thuật, điều này " đảm bảo " rằng số đầu vào sẽ là số nguyên tố. 2. Thông số kỹ thuật đầu ra dường như chứa nhiều mâu thuẫn và mơ hồ. " Số cuối cùng" hàng "(ví dụ 7, 5, 3, 2, 1) phải được in đầy đủ " - vì vậy những người khác không? " Mẫu Regex tương tự để kiểm tra các trường hợp thử nghiệm của bạn được áp dụng ", nhưng " Đầu ra chỉ có thể là một số được kết nối đầy đủ, do đó không bị chia tách bởi bất cứ điều gì " mâu thuẫn với biểu thức đó. Nhưng regex rõ ràng là tinh ranh vì dù sao nó cũng cho phép chuỗi trống và không có đầu vào nào có thể cung cấp cho điều đó.
Peter Taylor

1
1. " Một dòng mới duy nhất được cho phép. " Là dự phòng / không phù hợp với mẫu biểu thức chính quy cho phép bất kỳ số lượng ký tự dấu. 2. Câu giới thiệu " Nhiệm vụ của bạn là đầu ra số nguyên " là sai lệch vì sau này bạn yêu cầu xuất một số duy nhất. 3. Toàn bộ giải thích về trình tự và đầu ra là khó hiểu - về cơ bản mọi người phải thiết kế ngược lại những gì bạn muốn nói bằng cách nghiên cứu các ví dụ (liệt kê trình tự và các trường hợp thử nghiệm). Thử thách cuối cùng cũng có những vấn đề này và tôi đã giải quyết chúng ở đó trong một chỉnh sửa được đề xuất ở đó, mà bạn đã từ chối ... :(
smls

5
Điểm nào trong việc tự ý làm 1 số nguyên tố?
Xanderhall

1
Thử thách số nguyên thứ tự âm nhưng mỗi khi nó là số nguyên tố thì nó sẽ nhanh hơn;)
SplittyDev

Câu trả lời:


5

Thạch , 9 byte

ÆR1;;\UFV

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

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

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.

Tôi biết tôi quá sâu vào việc học chơi golf khi đọc Jelly để hiểu câu hỏi hơn là cách khác. (Điều này thực sự là một chương trình khá Jelly có thể đọc được, khi họ đi; điểm duy nhất khó hiểu đối với tôi là trường hợp đặc biệt kỳ lạ của Vtrên một danh sách.)

5

Đang xử lý, 161 byte

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

Một chức năng thực hiện kiểm tra tính nguyên thủy, chức năng còn lại là in ấn. Gọi nó bằngt(7)

Ung dung

Các chức năng đầu tiên thực hiện kiểm tra tính nguyên thủy. Nó trả về intthay vì vì booleancách này sẽ lưu nhiều byte hơn. ( intthay vì boolean, 0thay vì false, 1thay vì true)

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

Hàm thứ hai in ra chuỗi. Nó lặp qua mọi số, nếu nó không phải là số nguyên tố, hãy bỏ qua lần lặp tiếp theo. Nếu nó là một số nguyên tố, nó tiếp tục in xuống bên trong một for-loop khác . Một lần nữa, nếu số là số nguyên tố, thì chúng tôi sẽ in nó, nếu không thì không.

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}

5

Thạch , 12 byte

ÆR;@1
ÇÇ€UVV

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

Nếu nó hoàn toàn không phải là 1s, mã của tôi sẽ chỉ có ÆRÆRUVV7 byte.

Giải thích nâng cao:

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

Anh chàng người Ireland (được gọi là Dennis?) Bằng cách nào đó đã vượt qua tôi lol.


4

05AB1E , 19 byte

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

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

Giải trình

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join

Kinh ngạc trước DpÏcâu nói. Công việc tốt đẹp!
devR Rich

2

Brachylog , 17 byte

y:{e1|e#p}f@[rcw\

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

Dường như không thể ngắn hơn thế ...

Giải trình

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix

2

Ngôn ngữ GameMaker, 169 byte

Hàm chính (68 byte)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

Hàm p (46 byte)

for(a=0;a<argument0;a++)while q(++b){}return b

Hàm q (55 byte)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1

Thật tuyệt, ai đó sử dụng GML
FireCubez

@FireCubez Cảm ơn :) Tôi đã từng sử dụng nó rất nhiều. Nó thực sự là ngôn ngữ lập trình đầu tiên tôi học được.
Timtech

1

MATL , 15 byte

Zq"1@ZqP]1v!VXz

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

Zq      % Implicit input. Push array of primes up to that value
"       % For each prime in that array
  1     %   Push 1
  @     %   Push current prime
  Zq    %   Push array of primes up to that
  P     %   Reverse
]       % End
1       % Push 1
&h      % Concatenate all stack horizontally
V       % Convert to string
Xz      % Remove spaces. Implicit display

1

Perl 6 , 41 byte

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

( Dùng thử trực tuyến. )

Giải trình:

  • 1, |grep(*.is-prime, 2..$_): Chuỗi 1 và số nguyên tố ... (1 2 3 5)
  • [,] ...: Giảm ("gấp") so với toán tử dấu phẩy ... (1 2 3 5)
  • [\,] ...: Với kết quả trung gian ( giảm tam giác ) ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: Áp dụng đảo ngược toán tử meta cho dấu phẩy ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: Xóa danh sách lồng nhau và gập lên toán tử chuỗi concat ... 1213215321

(Điều này dựa trên câu trả lời của tôi cho thử thách trước .)


1

Toán học, 61 byte

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

Hàm không tên lấy một đối số nguyên và trả về một chuỗi. (Nếu đầu vào không phải là số nguyên tố, nó chỉ "làm tròn nó xuống" thành số nguyên tố gần nhất; nếu đầu vào không có chủ đích, thì nó giả vờ là 1.)

Việc triển khai này sử dụng mánh khóe từ câu trả lời của Martin Ender cho thử thách tương tự trước đó (ai nói con chó già này không thể học được những mánh mới?): Lạm dụng<> để làm phẳng danh sách các số nguyên lồng nhau.

Danh sách lồng nhau trong câu hỏi bắt đầu bằng cách tạo một danh sách lồng nhau tương tự như trong câu trả lời đó, với độ dài phù hợp (được đưa ra bởi PrimePi@#, số lượng các số nguyên tố lên đến và bao gồm cả đầu vào); sau đó Primeđược áp dụng cho mọi yếu tố. Ví dụ, đối với đầu vào 5là số nguyên tố thứ 3, mã Range[Range@PrimePi@#,0,-1]sẽ sinh ra {{1,0},{2,1,0},{3,2,1,0}}và áp dụng Primecho từng phần tử mang lại{{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}} các số nguyên tố thứ 1, 2 và 3 lần lượt là 2, 3 và 5. Tôi cảm thấy tự hào rằng tôi đã xoay sở để thêm nhiều lỗi hơn nữa vào cách tiếp cận của Martin Ender, Math Mathaà phàn nàn mỗi khi nó viết Prime[0].

Prime[0]không phải là một điều, nhưng điều đó không sao: /.Prime@0->1biến tất cả thành 1s. Và chúng tôi cũng muốn có một 1mặt trước, vì vậy chúng tôi thay thế ""câu trả lời từ Martin Ender bằng cách đơn giản 1, thực sự tiết kiệm một byte.


0

PHP, 72 byte

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

Chạy dí dỏm -r

phá vỡ

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)

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.