Kiểm tra bội số


21

Sử dụng bất kỳ ngôn ngữ lập trình nào để hiển thị các số từ 1 đến 99 (bao gồm cả hai) theo cách như vậy, sao cho:

  • các số được phân tách bằng dấu cách đơn
  • nếu một số chia hết cho 3, thì nó phải nằm trong ngoặc đơn,
  • nếu một số chia hết cho 4, thì nó phải nằm trong dấu ngoặc vuông,
  • nếu một số chia hết cho cả 3 và 4, thì số đó phải ở cả dấu ngoặc đơn và ngoặc vuông (với dấu ngoặc vuông gần với số đó).

Chương trình của bạn sẽ hiển thị chính xác:

1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)


3
Chúng ta có thể xuất từng mục trên một dòng mới không, hoặc đầu ra phải là tất cả trên một dòng?
Sản xuất ETH

4
Có thể kết thúc đầu ra với một không gian. Một vài câu trả lời dường như cho rằng như vậy.
Dennis

Câu trả lời:





4

Thạch , 21 20 byte

³Ṗµ3,4ṚƬḍד([“])”j)K

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

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

³Ṗµ3,4ṚƬḍד([“])”j)K  Main link. No arguments.

³                     Set the return value to 100.
 Ṗ                    Pop; yield [1, ..., 99].
  µ               )   Map the chain in between over [1, ..., 9]; for each integer k:
   3,4                    Set the return value to [3, 4].
      ṚƬ                  Reverse until a loop is reached. Yields [[3, 4], [4, 3]].
        ḍ                 Test k for divisibility by [[3, 4], [4, 3]], yielding a
                          matrix of Booleans.
         ד([“])”         Repeat the characters of [['(', '['], [']', ')']] as many
                          times as the Booleans indicate.
                 j        Join the resulting pair of strings, separated by k.
                   K  Join the resulting array of strings, separated by spaces.

3

D , 110 byte

import std.stdio;void f(){for(int i;i<99;)write(++i%3?"":"(",i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

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

Được chuyển từ câu trả lời C ++ của @ HatsuPulumKun.


3

Than , 30 byte

⪫EEE⁹⁹I⊕ι⎇﹪⊕κ⁴ι⪫[]ι⎇﹪⊕κ³ι⪫()ι 

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

    ⁹⁹                          Literal 99
   E                            Map over implicit range
        ι                       Current value
       ⊕                        Incrementd
      I                         Cast to string
  E                             Map over list of strings
            κ                   Current index
           ⊕                    Incremented
             ⁴                  Literal 4
          ﹪                     Modulo
              ι                 Current value
                []              Literal string `[]`
                  ι             Current value
               ⪫                Join i.e wrap value in `[]`
         ⎇                      Ternary
 E                              Map over list of strings
                      κ         Current index
                     ⊕          Incremented
                       ³        Literal 3
                    ﹪           Modulo
                        ι       Current value
                          ()    Literal string `()`
                            ι   Current value
                         ⪫      Join i.e wrap value in `()`
                   ⎇            Ternary
                                Literal space
⪫                               Join list
                                Implicitly print

3

J , 54 53 byte

Ít hơn 1 byte nhờ @Jonah

(*stdout(3|.0=4 3 1 3 4&|,1=":)#3|.']) ([',":)@>i.100

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


Cảm ơn đã làm điều này. Ngoài ra, tại sao bạn phải làm stdoutở đây ... Tôi chưa bao giờ thấy điều đó trước đây. @FrownyFrog
Jonah

@Jonah Tôi không thể xuất chuỗi đó thành một chuỗi hoàn chỉnh, nó bị cắt (...) Thiết bị xuất chuẩn không làm điều đó và nó cũng không in một dòng mới, vì vậy tôi cũng có thể in riêng từng số. Vì một số lý do mặc dù nó làm cho các dấu cách xuất hiện (có 4 và chỉ có 1 là cố ý ở đó)
FrownyFrog

Cách tiếp cận này thực sự thông minh, cả xoay vòng và lựa chọn sử dụng #. Tôi đã giới thiệu một động từ phụ trợ để bao quanh ()[]: g=. {.@[ , ":@] , {:@[. ugh tính dài dòng!
Giô-na

thêm một câu hỏi: bất kỳ lý do bạn sử dụng LFthay vì _. cái sau dường như cũng làm việc
Giô-na

3

C, C ++, 136 133 131 129 128 124 byte

-5 byte nhờ vào Zacharý và lấy cảm hứng từ hàm write () trong ngôn ngữ D (xem câu trả lời của Zacharý)

-2 byte nhờ mriklojn

-12 byte cho phiên bản C nhờ mriklojn

-4 byte nhờ vào trần nhà

#include<cstdio>
void f(){for(int i=0;i++<99;)printf("(%s%d%s%s%s"+!!(i%3),i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

C Tối ưu hóa cụ thể: 115 byte

#include<stdio.h>
i;f(){for(;i++<99;)printf("(%s%d%s%s%s"+!!(i%3),i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

MSVC có cho phép bạn làm inf f()điều đó không? Xin lỗi vì đã xóa các bình luận của tôi, nghĩ rằng tôi có một cái gì đó ngắn hơn (tôi đã không)
Zacharý

@ Zacharý Không, tôi nghĩ rằng hàm này quá đơn giản và nó tạo ra "f phải trả về một int". BTW, giải pháp của bạn ngắn hơn 3 byte (bao gồm nén được ghép nối với việc di chuyển mức tăng của i)
HatsuPulumKun

1
Dang, quên mất printfwasa điều. Bạn không thể sử dụng C stdio sau đó?
Zacharý

2
Một điều khác bạn có thể sử dụng / khai thác là, ít nhất là với gcc 5.3.1, bạn không cần #include và bạn cũng có thể xóa loại trả về hàm. Ngoài ra, nếu bạn khai báo int ibên ngoài hàm (trong phạm vi toàn cục) thì giá trị của nó mặc định là 0 và kiểu dữ liệu mặc định là int. Điều này sẽ dẫn đến vòng lặp của bạn bắt đầu từ 0 và để khắc phục điều này, bạn có thể di chuyển số gia vào biểu thức điều kiện trong vòng lặp for của mình, làm cho nó giống nhưi;f(){for(;++i<=99;)
mriklojn

1
Đề nghị ")\0"+i%3thay vì i%3?"":")". Ngoài ra, tôi nghĩ bạn cần thêm i=0vào đầu vòng lặp.
trần mèo

3

Powershell, 60 byte

"$(1..99|%{($_,"($_)","[$_]","([$_])")[!($_%3)+2*!($_%4)]})"

Giải trình:

  • mảng có 4 phần tử: $_, "($_)", "[$_]", "([$_])"
  • và chỉ số: [!($_%3)+2*!($_%4)]
  • lặp lại cho mỗi số
  • chuyển đổi kết quả thành một chuỗi

Kịch bản kiểm tra ít chơi gôn hơn:

$f = {

$r = 1..99|%{
    ($_, "($_)", "[$_]", "([$_])") [!($_%3)+2*!($_%4)]
}
"$($r)"

}

$expected = '1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)'
$result = &$f
$result-eq$expected
$result

Đầu ra:

True
1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)

3

MathGolf , 41 40 34 29 byte

♀({îû)(î+╫îa_'(\')ßyΓî34α÷ä§ 

LƯU Ý: Nó có một không gian kéo

Chỉ có câu trả lời MathGolf thứ hai của tôi ..
-5 byte nhờ @JoKing .

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

Giải trình:

♀(             # Push 99 (100 decreased by 1)
  {            # Start a loop, which implicitly loops down to (and excluding) 0
   û)(         #  Push string ")("
      î+       #  Append the 1-indexed index
              #  Rotate the string once towards the right
   îa          #  Push the 1-indexed index of the loop, wrap in a list
   _           #  Duplicate it
    '(        '#  Push string "("
      \        #  Swap the top two items of the stack
       ')     '#  Push string ")"
         ßy    #  Wrap all three into a list, and join them
   Γ           #  Wrap all four into a list
               #  (We now have a list [N, "(N)", "[N]", "([N])"], where N is the index)
   î           #  Push the 1-indexed index of the loop
    34         #  Push 3 and 4 to the stack
      α        #  Wrap all three into a list
       ÷       #  Check for each if the index is divisible by it
               #  (resulting in either [0,0], [0,1], [1,0], or [1,1]
        ä      #  Convert from binary to integer
               #  (resulting in either 0, 1, 2, or 3
         §     #  Push the string at that index from the array
               #  Push a space
               # (After the loop, output the entire stack joined together implicitly)

@JoKing Cảm ơn! Không biết qcó thể bỏ qua và nó được thực hiện hoàn toàn trong các vòng lặp. Ngoài ra, không biết có một chuỗi tích hợp 2/3/4 chuỗi. Quá tệ là xoay lừa không hoạt động với mảng được bọc.
Kevin Cruijssen

Chà, thêm nữa là tôi đã giao dịch đầu ra rõ ràng mỗi lần lặp lại cho đầu ra ngầm vào cuối chương trình
Jo King

@JoKing Vâng, nhưng tôi không biết nó sẽ xuất ra toàn bộ ngăn xếp được nối với nhau, thay vì chỉ trên cùng. :)
Kevin Cruijssen

Giải pháp của tôi đã đạt gần 40 byte, mặc dù tôi đã đọc sai và nghĩ rằng nên sử dụng dấu ngoặc nhọn thay vì dấu ngoặc vuông. Tốt công việc về giải pháp!
maxb


2

Lua, 161 123 byte

b=""for i=1,99 do;c,d=i%3==0,i%4==0;b=b..(c and"("or"")..(d and"["or"")..i..(d and"]"or"")..(c and")"or"").." "end;print(b)

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

Ung dung:

b = ""
for i = 1, 99 do
    c = 1 % 3 == 0
    d = 1 % 4 == 0
    a = ""
    if c then
        a = a .. "("
    end
    if d then
        a = a .. "["
    end
    a = a .. i
    if d then
        a = a .. "]"
    end
    if c then
        a = a .. ")"
    end
    b = b .. a .. " "
end
print(b)


2

C (gcc) , 84 byte

main(i){while(99/i++)printf("%s%s%d%s%s ","("+i%3,"["+i%4,i-1,"]"+i%4,")"+i%3);}

Có một byte null ở đầu mỗi "chuỗi ngoặc".

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


Và trong "(" + i% 3, làm thế nào để bạn biết địa chỉ đó cho i = 2 điểm đến giá trị char bằng 0? Tương tự cho "[" + i% 4 cho i trong {2,3}?
RosLuP

Nó hoạt động với gcc, đủ tốt, vì PPCG định nghĩa các ngôn ngữ bằng cách triển khai của chúng.
Dennis

Tôi nghĩ rằng bạn không thể nói rằng mã đó được biên dịch trong mọi triển khai trình biên dịch gcc, có lẽ chỉ có mã chạy trong máy tính của bạn (nhưng có thể không quá)
RosLuP

@RosLuP gcc làm việc cùng một cách trên hầu hết các máy tính tuy nhiên, ít nhất là trên bất cứ điều gì với kiến trúc tương tự
ASCII chỉ

@ ASCII - chỉ có thể nếu được biên dịch tối ưu hóa cho không gian hoặc tốc độ thì kết quả sẽ khác ... Tôi không biết liệu nó có nằm ngoài tiêu chuẩn không ...
RosLuP

2

PowerShell , 67 62 byte

"$(1..99|%{'('*!($x=$_%3)+'['*!($y=$_%4)+$_+']'*!$y+')'*!$x})"

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

Về cơ bản, một FizzBuzz sử dụng số lần nhân chuỗi biến Boolean (ngầm định thành 1 hoặc 0). Các chuỗi đó được để lại trên đường ống và được tập hợp trong một khối tập lệnh bên trong dấu ngoặc kép. Vì mặc định $OutputFieldSeparatorcho một mảng là khoảng trắng, nên điều này ngầm cung cấp cho chúng ta các phần tử mảng được phân tách bằng dấu cách.


2

C #, 124 117 123 byte

-5 byte nhờ Kevin Cruijssen

x=>{for(int i=0;i++<99;)System.Console.Write((i%3<1?"(":"")+(i%4<1?"[":"")+i+(i%4<1?"]":"")+(i%3<1?")":"")+(i>98?"":" "));}

Kiểm tra với:

Action<int> t = x=>{for(int i=0;i++<99;)System.Console.Write((i%3<1?"(":"")+(i%4<1?"[":"")+i+(i%4<1?"]":"")+(i%3<1?")":"")+(i>98?"":" "));}
t.Invoke(0);
Console.ReadKey();

Vào bước đột phá của C #, tôi thấy. C # có cho phép các số nguyên làm đối số bên trái cho toán tử ternary hay nó phải là một boolean?
Zacharý

Tôi không biết nhiều về C #, nhưng bạn có thể sử dụng xthay vì i, do đó không phải lo lắng về int ? (Tất nhiên, bạn vẫn phải đặt nó).
Zacharý

@ Zacharý Không, nó tạo ra lỗi CS0029 "Không thể chuyển đổi hoàn toàn int thành boolean". Và vâng, tôi có thể sử dụng ivà thực tế là tôi có thể khởi tạo nó ở 0 khi tôi Invoke. Nhưng điều đó có nghĩa là tôi sẽ phải bao gồm khai báo t ( Action<int>) và cuộc gọi ( t.Invoke(0)) trong bytecount?
HatsuPulumKun

Tôi đang hỏi nếu một cái gì đó như x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};sẽ làm việc.
Zacharý

1
Tất cả năm ==0có thể được <1.
Kevin Cruijssen


2

Ruby , 72 66 byte

p [*1..99].map{|x|a=x
a="[#{x}]"if x%4<1
a="(#{a})"if x%3<1
a}*' '

Cảm ơn @ jonathan-frech và @ conor-obrien để cắt tỉa thêm.


Xin chào và chào mừng đến với PPCG! 70 byte .
Jonathan Frech

Chào mừng đến với PPCG! Đây là 4 byte khác ngoài đề xuất của @JonathanFbler, cho 66 byte , vì a.join bđối với một mảng avà chuỗi btương đương vớia*b
Conor O'Brien

2

PowerShell, 98 82 74 67 63 62 byte

Một con số khổng lồ -31 byte nhờ @Veskah -5 byte chỉ nhờ @ ASCII

(1..99|%{(($a=($_,"[$_]")[!($_%4)]),"($a)")[!($_%3)]})-join' '

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

Tôi vẫn không chắc chắn những gì tôi đã làm ở đây.


Chỉ cần một số golf nhanh chóng cho 70 byte . Bạn không phải bỏ $ a dưới dạng chuỗi và "$a"vẫn sẽ thay thế giá trị. (Lưu ý: Dấu ngoặc đơn không thay thế $foo, chỉ có dấu ngoặc kép). Một mẹo khác là ifs chỉ quan tâm đến 0 hoặc 1 để bạn có thể sử dụng logic boolean để lưu một byte
Veskah

67 byte nếu bạn sử dụng lập chỉ mục danh sách là tốt.
Veskah




1

perl -E, 60 byte

$,=$";say map$_%12?$_%3?$_%4?$_:"[$_]":"($_)":"([$_])",1..99

Một số byte có thể được lưu nếu chúng ta có thể sử dụng các dòng mới giữa các số: trong trường hợp đó, chúng ta có thể loại bỏ $,=$";, thay đổi mapthành một forvòng lặp, trong khi di chuyển sayvào vòng lặp.


1
Bạn có phải Abigail? Nhà phát minh của /^1$|^(11+?)\1+$/?
msh210

1
Ồ Thật vinh dự khi có bạn ở đây!
msh210

1

Perl 6 , 51 48 byte

put {$_%3??$^a!!"($a)"}(++$_%4??$_!!"[$_]")xx 99

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


Tôi sẽ lạm dụng sự khác biệt giữa danh sách và biểu diễn mảng, như thế này , nhưng tôi không chắc làm thế nào để thoát khỏi dấu ngoặc bao quanh toàn bộ danh sách ...
Jo King

@JoKing Tôi cũng nghĩ về điều đó, nhưng tôi chỉ nghĩ ra cái 51-byter này .
nwellnhof

1

Hàng loạt, 145 byte

@set s=
@for /l %%i in (1,1,99)do @set/an=%%i,b=n%%4,p=n%%3&call:c
@echo%s%
:c
@if %b%==0 set n=[%n%]
@if %p%==0 set n=(%n%)
@set s=%s% %n%

Mã rơi vào chương trình con nhưng chuỗi này đã được in vào thời điểm này để mã thực thi vô hại.




1

sfk , 225 byte

for n from 1 to 99 +calc -var #(n)/3+1/3 -dig=0 +calc -var #text*3-#(n) +setvar t +calc -var #(n)/4 -dig=0 +calc -var #text*4-#(n) +xed -var _0_#(t)\[#(n)\]_ _*_#(t)#(n)_ +xed _0*_([part2])_ _?*_[part2]_ +xed "_\n_ _" +endfor

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


1

Bash, 61 byte

-14 byte, nhờ Dennis

seq 99|awk '{ORS=" ";x=$1%4?$1:"["$1"]";print$1%3?x:"("x")"}'

giải trình

Khá đơn giản:

  • seq sản xuất 1,99
  • chúng tôi dẫn nó vào awkvới bộ tách bản ghi đầu ra (ORS ) được đặt thành khoảng trắng để đầu ra là một dòng đơn.
  • phần thân awk chính chỉ thêm "[]" khi số chia hết cho 4, và sau đó thêm vào, trên đó, "()" khi chia hết cho 3.

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



1

PHP, 65 byte

while($i++<99)echo$i%4?$i%3?$i:"($i)":($i%3?"[$i]":"([$i])")," ";

hoặc là

while($i++<99)echo"("[$i%3],"["[$i%4],$i,"]"[$i%4],")"[$i%3]," ";

(yêu cầu PHP 5.5 trở lên)

Chạy với -nrhoặc thử chúng trực tuyến .


1

Python 2 , 78 byte

i=0
exec"i+=1;u=i%3/-2*(i%4/-3-1);print'([%0d])'[u:7-u:1+(i%3<1<=i%4)]%i,;"*99

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

Tôi đã hình dung ra cách tiếp cận tuyệt vời này '([%0d])'nhưng tôi không thể có được các biểu thức ngắn hơn.


1

Java 8, 92 91 byte

-1 byte nhờ @Dana

i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}

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

Giải pháp thay thế, 82 byte (có dấu cách ở đầu ra - không chắc chắn nếu điều đó được cho phép):

i->{for(;i++<99;)out.printf((i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)+" ",i);}

Giải trình:

for(;i++<99;) - một vòng lặp for đi từ giá trị của i (được sử dụng lại làm đầu vào, được đưa về 0 trong trường hợp này) đến 99

out.printf(<part1>+<part2>,i); - định dạng chuỗi trước khi in ngay lập tức thành stdout với giá trị của i

nơi <part1>(i>1?" ":"")- in không gian trước khi in số trừ con số đó là 1, trong trường hợp này nó bỏ qua không gian

<part2>(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- nếu ichia hết cho cả 3 và 4, icó cả dấu ngoặc vuông và tròn xung quanh nó; khác nếu ichia hết cho 3, icó dấu ngoặc tròn; khác nếu ichia hết cho 4, icó dấu ngoặc vuông; khác, ikhông có dấu ngoặc.


Lưu một byte bằng cách di chuyển khoảng trắng đến đầu mỗi vòng lặp(i>1:" ":"")
dana

Điều đó sẽ chỉ hoạt động nếu tôi in kết quả ngược lại (xem phần này ) nhưng thực sự sẽ lưu 2 byte thay vì 1.
NotBaal

Thật không may, điều đó không giống với sản lượng dự kiến ​​theo câu hỏi, tuy nhiên cảm ơn bạn đã gợi ý!
Không phải

1
Các liên kết "thử trực tuyến" dường như bị phá vỡ. Tôi đã suy nghĩ i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}?
dana

1
Ohhhh bạn đúng mà làm việc! Cảm ơn vì điều đó!
Không phải
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.