Hướng dẫn của riêng bạn về hướng dẫn của bạn


38

Hướng dẫn "cho" rất riêng của bạn

Giả sử bạn có đầu vào sau: a, b, c, d

Đầu vào có thể ở một dòng sử dụng bất kỳ định dạng "a / b / c / d" hoặc "a, b, c, d", v.v.

Bạn cũng có thể có 4 đầu vào.

Bạn phải mã hóa các hành vi sau (mã giả ở đây):

var i = <a>
while (i <b> <c>)
    print i
    i = i + <d>
    print "\n"

Dưới đây là một số trường hợp thử nghiệm:

input : 1,<,10,1
output :
1
2
3
4
5
6
7
8
9

Một lần nữa :

input : 20,>,10,1
output :
20
21
22
23
24
25
26
27
...
infinite loop / program crashes
  • alà một số nguyên , giá trị ban đầu của i.

  • blà một chuỗi hoặc một char , nó không thể là một cái gì đó khác, bộ so sánh được sử dụng trong điều kiện kết thúc của forvòng lặp.

    bcó thể và phải là một trong các chuỗi sau:

    - ">"
    - "<"
    
  • clà một số nguyên , số được sử dụng trong điều kiện kết thúc của for vòng lặp.

  • dlà một số nguyên được thêm vào i ở mỗi vòng lặp.

Đây là môn đánh gôn, câu trả lời ngắn nhất sẽ thắng!


1
Các số có thể được trả về từ một hàm dưới dạng danh sách / chuỗi, thay vì được in ra thiết bị xuất chuẩn không?
cười

@smls Không xin lỗi, đầu ra phải giống như các ví dụ!
Sygmei

1
Nó nói mã của tôi phải tuân theo mã giả và có một print "\n", nhưng tôi đang sử dụng cảnh báo của javascript cho mỗi dòng. Điều đó có thể được chấp nhận hay tôi sẽ phải sử dụng console.log thay vì làm cho câu trả lời của tôi dài hơn?

2
Bạn có thể sử dụng chức năng cảnh báo như một cách để thông báo nhưng bạn không thể sử dụng nhiều cảnh báo. Một cái gì đó giống như alert("23\n24\n25");sẽ hoạt động trong khi alert("23"); alert("24"); alert(25);sẽ không
Sygmei

Câu trả lời:


25

JavaScript (ES6),  44  43 56 byte

Đã lưu 1 byte nhờ vào ETHproductions
Chỉnh sửa: đã sửa để tuân thủ các yêu cầu đầu ra

(a,b,c,d)=>{for(s='';eval(a+b+c);a+=d)s+=a+`
`;alert(s)}

Kiểm tra


Sử dụng tốt phạm vi!
Sản phẩm ETH

Tôi nghĩ bạn có thể sắp xếp lại evalđể tiết kiệm một byte:(a,b,c,d)=>{for(;eval(a+b+c);a+=d)alert(a)}
ETHproductions

@ETHproductions À, vâng. Đẹp quá
Arnauld

5
Đó là một 44 với một tutu!
vào

Điều này không tuân theo đặc điểm kỹ thuật nơi đầu ra là từng dòng với U + 000A sau mỗi dòng.
Joey

17

Javascript (ES6), 47 42 48 byte

Muốn tạo phiên bản cho nhưng ai đó đã nhanh hơn, vì vậy đây là phiên bản đệ quy.

(b,c,d)=>F=a=>eval(a+b+c)&&console.log(a)|F(a+d)

Bạn cần thêm f=trước và gọi nó như thế nào f(b,c,d)(a).

Rất cám ơn Arnauld cho golf tuyệt vời.

alertđổi thành console.logvì đặc điểm kỹ thuật đầu ra


@Arnauld Cảm ơn, đó là một sân golf tuyệt vời. Tôi chỉ hỏi anh ấy, vì vậy hãy xem anh ấy có chấp nhận không.

Vui mừng khi thấy nó được chấp nhận. ;)
Arnauld

Điều này không tuân theo đặc điểm kỹ thuật nơi đầu ra là từng dòng với U + 000A sau mỗi dòng.
Joey

@Joey Đó chỉ là mã giả, nhưng tôi sẽ hỏi OP về điều này.

@Masterzagh: Có một câu hỏi về các định dạng đầu ra thay thế đã bị từ chối.
Joey


13

Thạch , 12 byte

Ṅ+⁶µ⁴;⁵¹vµ¿t

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

Jelly có rất nhiều cách để lặp đi lặp lại, tạo phạm vi, v.v. Tuy nhiên, việc phản ánh chính xác hành vi của C ++ khá khó khăn, do các trường hợp đặc biệt như gia tăng là 0, vòng lặp kết thúc trước khi nó bắt đầu (do sự bất bình đẳng bị ngược ) và gia số đi sai hướng (có nghĩa là điều kiện thoát của vòng lặp không thể được đáp ứng một cách tự nhiên). Như vậy, giải pháp này về cơ bản là một bản dịch trực tiếp của C ++, mặc dù điều đó làm cho nó ở mức độ thấp hơn so với chương trình Jelly thông thường. May mắn thay, C ++ có hành vi không xác định đối với tràn số nguyên đã ký (câu hỏi sử dụng int), có nghĩa là một chương trình có thể làm bất cứ điều gì trong trường hợp đó, và do đó không cần phải cố gắng bắt chước hành vi tràn.

Giải trình

Ṅ+⁶µ⁴;⁵¹vµ¿t
   µ     µ¿   While loop; while ((⁴;⁵¹v) counter) do (counter = (Ṅ+⁶)counter).
    ⁴;⁵       Second input (b) appended to third input (c), e.g. "<10"
        v     Evaluate, e.g. if the counter is 5, "<10" of the counter is true
       ¹      No-op, resolves a parser ambiguity
Ṅ             Output the counter, plus a newline
 +⁶           Add the fourth input (d)
           t  Crashes the program (because the counter is not a list)

Phá vỡ chương trình là cách chặt chẽ nhất để tắt đầu ra ngầm của Jelly (nếu không, nó sẽ xuất giá trị cuối cùng của bộ đếm); nó tạo ra một loạt các lỗi sai trên stderr, nhưng chúng ta thường coi điều đó là được phép.

Ngẫu nhiên, bộ đếm vòng lặp được khởi tạo với giá trị hiện tại trước khi vòng lặp bắt đầu. Khi vòng lặp xuất hiện khi bắt đầu chương trình, đó sẽ là đầu vào đầu tiên.


Bạn có thể thay đổi tđể không có sự cố. Dequeue dẫn đến một danh sách trống mà bản in ngầm của Jelly không mang lại kết quả gì.
Jonathan Allan

@Jonathan ALLan: Không, việc thực sự làm là tạo một phạm vi từ 2 đến giá trị đã cho, điều này chắc chắn có thể nhìn thấy trên một bản in ẩn.

Ah, tôi phải kiểm tra lý thuyết đó bằng một vòng lặp kết thúc trong lãnh thổ tiêu cực; thực sự một phạm vi được tạo ra ngầm.
Jonathan Allan

Uhm, đây là 12 ký tự, nhưng nó không phải là 12 byte phải không?
Cruncher

@Cruncher: Jelly sử dụng mã hóa riêng trong đó mỗi ký tự được sử dụng bởi ngôn ngữ được biểu thị bằng một byte đơn (nó chỉ sử dụng 256 ký tự khác nhau). Lý do nó không sử dụng thứ gì đó nổi tiếng hơn như mã trang 437 là để dễ gõ hơn (ý tôi là, nó không dễ gõ, nhưng nó dễ hơn ngôn ngữ như gs2). Một hexdump của chương trình này sẽ dài 12 byte.



9

Java, 58 byte

(a,b,c,d)->{for(;b>61?a>c:a<c;a+=d)System.out.println(a);}

14
Có một lý do để tạo ra i? Bạn có thể bỏ qua phần khởi tạo và chỉ sử dụng a? Ngoài ra, sử dụng giá trị ASCII của '>' (62) sẽ tiết kiệm một byte.
Riley

6
Theo nhận xét của Riley, bạn có thể làmb>61
Kritixi Lithos

Tôi không tin điều này biên dịch.
ChiefTwoP Pencil

@ChiefTwoP Pencil Đó là một chức năng. Bạn phải viết một chương trình thử nghiệm xung quanh nó để biên dịch nó.
wizzwizz4

@ wizzwizz4, rõ ràng. Nhưng điều đó vẫn không hiệu quả. Cho nó một shot. Thêm vào đó, sự hiểu biết của tôi là tất cả các byte cần thiết để chạy nó.
ChiefTwoP Pencil

7

05AB1E , 22 20 byte

[D²`'>Q"‹›"è.V_#D,³+

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

Giải trình

[                       # start loop
 D                      # copy top of stack (current value of a)
  ²`                    # push b,c to stack
    '>Q                 # compare b to ">" for equality
       "‹›"             # push this string
           è            # index into the string with this result of the equality check
            .V          # execute this command comparing a with c
              _#        # if the condition is false, exit loop (and program)
                D,      # print a copy of the top of the stack (current value of a)
                  ³+    # increment top of stack (a) by d

1
Mọi định dạng đầu vào đều được chấp nhận nên phiên bản thứ hai vẫn ổn :)
Sygmei

7

SmileBASIC, 53 byte

INPUT A,B$,C,D
S=ASC(B$)-61WHILE S*A>S*C?A
A=A+D
WEND

Giải trình:

INPUT A,B$,C,D
IF B$=="<" THEN S=-1 ELSE S=1 'get comparison direction
I=A
WHILE S*I>S*C 'loop while I is less than/greater than the end
 PRINT I
 INC I,D
WEND

Điều này sử dụng thực tế X<Ylà giống như-X>-Y


Tôi sẽ tin tưởng bạn vì điều này, tôi không có 3DS để kiểm tra :)
Sygmei

Tôi có máy tính Petit, ý tưởng rất tuyệt! Thỉnh thoảng tôi sẽ thử một cái gì đó như thế này ...
python-b5

Bạn có thể sử dụng một READcâu lệnh, tiết kiệm 1 byte.
ckjbgames

@ckjbgames thế nào?
12Me21

@ 12Me21 Kiểm tra hướng dẫn sử dụng SmileBASIC. Nó sẽ nằm trong danh sách hướng dẫn cho SmileBASIC.
ckjbgames

6

Xếp chồng , 34 byte

@d@c@b[show d+][:c b tofunc!]while

Hãy thử trực tuyến! (Bao gồm kiểm tra.) Đây là một chức năng hy vọng ngăn xếp trông giống như:

a b c d

Ví dụ:

1 '<' 10 2
@d@c@b[show d+][:c b tofunc!]while

Giải trình

@d@c@b[show d+][:c b tofunc!]while
@d@c@b                               assign variables
               [............]while   while:
                :c                   duplicate "i" and push c
                   b tofunc!         convert b to a function and execute it
      [.......]                      do:
       show                          output "i" without popping
            d+                       and add the step to it

4

C ++, 80

Rất tiếc, đây C++không phải là C. Có một chút bối rối bởi câu hỏi.

void f(int a,char b,int c,int d){for(;b==62?a>c:a<c;a+=d)cout<<a<<endl;}

Đây là C hay C ++?
betseg

10
Việc thực hiện C ++ nào? (Tôi tò mò làm thế nào bạn nhận được một cái gì đó giống như using namespace stdmiễn phí).
H Walters

Không phải ibắt đầu lúc a, phải không 0? Bạn chỉ có thể sử dụng avà bỏ qua ihoàn toàn và sử dụng giá trị ASCII của '>'. for(;b==62?a>c:a<c;a+=d)
Riley

Không hoạt động chof(1,'<'3,1);
Roman Gräf

Ack ... yeah, yêu cầu toán học ở cả hai phía; for(b-=61;b*a>b*c;a+=d)làm việc cho một byte đơn; nhưng như vậy không for(;b-62?a<c:a>c;a+=d).
H Walters



4

Pip , 14 byte

W Va.b.ca:d+Pa

Có bốn đối số dòng lệnh. Hỗ trợ số âm và dấu phẩy động và toán tử so sánh < > = <= >= !=. Hãy thử trực tuyến!

                a,b,c,d are cmdline args
W               While loop with the following condition:
  Va.b.c          Concatenate a,b,c and eval
            Pa  Print a with newline (expression also returns value of a)
        a:d+    Add d to that and assign back to a

4

Thạch , 8 byte

ḢṄ+⁹;µV¿

Đây là một liên kết dyadic lấy a, b, c làm đối số bên trái của nó và d là bên phải của nó. Đầu ra có thể là vô hạn và đi đến STDOUT.

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

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

ḢṄ+⁹;µV¿  Dyadic link.
          Left argument:  a,b,c (integer, character, integer)
          Right argument: d     (integer)

       ¿  While...
      V     the eval atom applied to a,b,c returns 1:
     µ       Combine the links to the left into a chain and apply it to a,b,c.
Ḣ              Head; pop and yield a from a,b,c.
 Ṅ             Print a, followed by a linefeed.
  +⁹           Add a and the right argument (d) of the dyadic link.
    ;          Concatenate the result and the popped argument of the chain,
               yielding a+d,b,c.

Đối số dòng lệnh sử dụng cú pháp Python và không thể phân biệt giữa một ký tự và chuỗi đơn. Nếu bạn muốn sử dụng CLA, bạn phải chèn một Fđể làm phẳng mảng.
Dennis

2
Bây giờ tôi muốn xóa một nửa nhận xét của mình vì nó đã lỗi thời, trong khi vẫn giữ nửa còn lại. Tôi đoán tôi sẽ chỉ lặp lại một nửa có liên quan và xóa phần còn lại: "Ồ, ồ, bạn đã xác định nó là một hàm để bạn có thể bỏ qua đầu ra ngầm theo quy tắc PPCG. Tôi nên nghĩ về điều đó."

4

Python 2 , 45 byte

exec"i=%d\nwhile i%c%d:print i;i+=%d"%input()

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

Một thực hiện rất đúng theo nghĩa đen của spec. Lấy mẫu mã, thay thế trong các đầu vào thông qua định dạng chuỗi và thực thi nó.


4

Đồng bằng TeX, 88 byte

\newcount\i\def\for#1 #2 #3 #4 {\i#1\loop\the\i\endgraf\advance\i#4\ifnum\i#2#3\repeat} 

Lệnh \forcung cấp chức năng được yêu cầu. Lưu cái này for.texvà sau đó chạy nó và nhập các giá trị biến trong dòng lệnh: pdftex '\input for \for 1 < 5 1 \bye'Các giá trị biến phải được phân tách bằng dấu cách.


4

Python 3, 61 byte

Lót:

e=input;exec(f'i={e()}\nwhile i{e()}{e()}:print(i);i+={e()}')

Chào mừng đến với trang web! Sử dụng tốt các tính năng nội suy chuỗi ký tự mới. Tôi nghĩ rằng bạn có thể có thể lưu một byte bằng cách thay thế \tbằng một khoảng trắng.
0 '

Cảm ơn bạn. Cho đến cùng kích thước sau khi xóa \ n \ t sau lần thứ ba e ()
G-Ox7cd




3

Lisp thường gặp 82 80 79 73 64 byte

(defmacro f(a b c d)`(do((i,a(+ i,d)))((not(,b i,c)))(print i)))

Kiểm tra

(f 1 < 10 1)

1 
2 
3 
4 
5 
6 
7 
8 
9 
NIL
CL-USER> 

-9 byte nhờ vào PrzemysławP.


Có lẽ bạn có thể lưu 9 byte, bằng cách xác định một macro. (defmacro f(a b c d)<insert backqoute here>(do((i,a(+ i,d)))((not(,b i,c)))(print i)))Cách sử dụng:(f 1 < 10 1)

@ PrzemysławP Cảm ơn một lần nữa!
coredump

3

PHP, 69 65 byte

for(list(,$i,$b,$c,$d)=$argv);$b<"="?$i<$c:$i>$c;$i+=$d)echo"$i
";

Chạy với '-r'; cung cấp các đối số dòng lệnh làm đầu vào.

Đối với chỉ một byte hơn hơn 4 byte, tôi có thể tận dụng mọi điều hành:

for(list(,$i,$b,$c,$d)=$argv;eval("return $i$b$c;");$i+=$d)echo"$i
";

Yeah, ác eval. Bạn có biết rằng nó có thể trả lại một cái gì đó?


Việc phá hủy tốc ký [,$i,$b,$c,$d]=$argv;sẽ tiết kiệm thêm 4 byte;
nhưng PHP 7.1 hoãn lại thách thức.


Khéo léo ! Tôi không chắc chắn khi tạo thử thách nếu tôi nên bao gồm mọi nhà khai thác chung, sau đó tôi nhớ rằng họ không giống nhau (~ = for! = Trong Lua chẳng hạn)
Sygmei

Ái chà, ác quỷ IS.
gian mạng

Dường như với tôi rằng bạn có thể sử dụng PHP 7.1 để làm cho nó ngắn hơn. Nếu không, việc sử dụng listtiết kiệm 4 Byte cộng với 4 Byte với cú pháp ngắn
Jörg Hülsermann

@PHP 7.1 hoãn lại thử thách; nhưng nhờ list().
Tít

2

Perl 6 , 44 byte

{.say for $^a,*+$^d...^*cmp$^c!= $^b.ord-61}

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

{                                          }  # A lambda.
          $^a                                 # Argument a.
             ,*+$^d                           # Iteratively add d,
                   ...^                       # until (but not including the endpoint)
                       *cmp$^c                # the current value compared to c
                                              # (less=-1, same=0, more=1)
                              != $^b.ord-61.  # isn't the codepoint of the b minus 61.
 .say for                                     # Print each number followed by a newline.

Nếu bạn có thể trả về một chuỗi số (có khả năng vô hạn) dưới dạng giá trị của loại Seq, thay vì in các số thành thiết bị xuất chuẩn, .say forphần đó có thể bị xóa, đưa nó xuống 35 byte.


2

Clojure, 66 63 byte

#(when((if(= %2"<")< >)% %3)(println %)(recur(+ % %4)%2 %3 %4))

-3 byte bằng cách bao thanh toán ra loop. Tôi đang "lạm dụng" tham số init để hoạt động như bộ tích lũy đang chạy.

Giải pháp đệ quy (với TCO). Xem ý kiến ​​trong mã pregolfed. Tôi đã thử một giải pháp đệ quy không TCO và kết quả là 67 byte.

Tôi rất muốn thấy nhịp này trong Clojure! Tôi nghĩ rằng đây là nhỏ nhất tôi có thể nhận được nó.

(defn my-for [init-num com-str com-num inc-num]
  (let [op (if (= com-str "<") < >)] ; Figure out which operator to use
    (when (op init-num com-num) ; When the condition is true, print and recur
      (println init-num)
      (recur (+ init-num inc-num) com-str com-num inc-num))))
    ; Else, terminate (implicit) 

Oh tôi đã không nhận thấy câu trả lời này. #(when(({">">"<"<}%2)% %3)(println %)(recur(+ % %4)%2 %3 %4))sẽ là 61 byte, kết hợp của bạn whenvới của tôi ({">">"<"<}%2).
NikoNyrh

2

Groovy, 51 byte

{a,b,c,d->while(Eval.me("$a$b$c")){println a;a+=d}}

Đây là một đóng cửa không tên. Hãy thử trực tuyến!

Thận trọng - Nếu bạn muốn kiểm tra điều này với groovy console, hãy đảm bảo bạn tiêu diệt toàn bộ quá trình khi đầu vào gây ra một vòng lặp vô hạn. Tôi nhận thấy điều này sau khi nó tiêu thụ ~ 5 hợp đồng RAM.


2

QBIC , 51 40 byte

:;::{?a┘a=a+c~A=@<`|~a>=b|_X]\~a<=b|_X

Và ba phút sau khi đăng tôi nhận ra rằng tôi có thể đơn giản hóa logic terminator ...

:;::      Consecutively read a, A$, b and c from the command line
{?a┘      Start an infinite loop; print a, add a newline to the source
a=a+c     increment a
~A=@<`|   If we are in LESS THAN mode
  ~a>=b   and IF we are no longer LESS
    |_X]  THEN QUIT, end if.
  \       ELSE (we're in GREATER THAN mode)
    ~a<=b IF we are no longer GREATER
    |_X   THEN QUIT
          The last IF and the loop are auto-closed

2

Hàng loạt, 94 byte

@set i=%1
@set o=gtr
@if "%~2"=="<" set o=lss
:g
@if %i% %o% %3 echo %i%&set/ai+=%4&goto g

Nếu không có hành vi tham số thứ hai, nó có thể được thực hiện trong 53 byte:

@for /l %%i in (%1,%4,%n%)do @if not %%i==%3 echo %%i

Điều này chỉ đơn giản là không làm gì nếu bước có dấu hiệu sai. Thử nghiệm thêm là do forvòng lặp của Batch cho phép biến vòng lặp bằng giá trị cuối.


2

Clojure, 66 byte

#(loop[i %](if(({">">"<"<}%2)i %3)(do(println i)(recur(+ i %4)))))

Đây có thể là 55 byte <>là các hàm trong Clojure:

(def f #(loop[i %](if(%2 i %3)(do(println i)(recur(+ i %4))))))
(f 1 < 10 1)

Tôi thích việc sử dụng bản đồ ở đây. Tôi sẽ không bao giờ nghĩ rằng điều đó sẽ đánh bại tôi. Cũng thú vị là cả hai số lượng ban đầu của chúng tôi đều giống nhau, mặc dù cách tiếp cận hơi khác nhau.
Carcigenicate

Cho phép b là một chức năng sẽ mang lại lợi thế không công bằng cho một số ngôn ngữ :)
Sygmei

Đúng, nhưng tôi nghĩ rằng hầu hết các ngôn ngữ tôi biết sẽ không được hưởng lợi nhiều từ việc cho phép <thay vì "<", ngoại trừ Clojure.
NikoNyrh

@Sygmei Đúng. Nó sẽ là freakin ngọt mặc dù. Không thể đổ lỗi cho bạn thực hiện cuộc gọi đó.
Carcigenicate

OP cho biết các ký tự vẫn ổn thay vì các chuỗi cho các toán tử so sánh btw. Điều đó sẽ tiết kiệm một vài byte.
Carcigenicate

2

TI-Basic, 41 34 byte

Prompt A,Str2,Str3,D
While expr("A"+Str2+Str3
Disp A
A+D->A
End

1
Cách mà một máy tính TI hoạt động, nhiều ký hiệu được lưu trữ dưới dạng một byte đơn. Prompt , Str2, Str3, While , expr(, Disp , ->, Và Endlà tất cả những biểu tượng đơn byte. Tôi đếm 29 byte.
Pavel

@Pavel Cảm ơn bạn đã quan tâm! Mặc dù đúng là TI-Basic được mã hóa, nhưng không phải tất cả các mã thông báo là một byte. Ví dụ, Str2, Str3, và expr(là tất cả thẻ hai byte. Để xem danh sách các mã thông báo một byte, hãy xem tibasicdev.wikidot.com/one-byte-tokens
Timtech
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.