Instruksi “untuk” Anda sendiri

38

Instruksi "untuk" Anda sendiri

Asumsikan Anda memiliki input berikut: a, b, c, d

Input bisa dalam satu baris menggunakan format apa saja "a / b / c / d" atau "a, b, c, d" dll.

Anda juga dapat memiliki 4 input.

Anda harus memberi kode perilaku berikut (pseudo-code di sini):

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

Berikut ini beberapa kasus tes:

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

Satu lagi :

input : 20,>,10,1
output :
20
21
22
23
24
25
26
27
...
infinite loop / program crashes
  • aadalah bilangan bulat , nilai awal dari i.

  • badalah string atau char , itu tidak bisa menjadi sesuatu yang lain, pembanding yang digunakan dalam kondisi akhir dari forloop.

    bdapat dan harus menjadi salah satu dari string berikut:

    - ">"
    - "<"
    
  • cadalah bilangan bulat , angka yang digunakan dalam kondisi akhir for loop.

  • dadalah bilangan bulat yang ditambahkan ke i di setiap loop.

Ini adalah kode-golf, jawaban terpendek menang!

Sygmei
sumber
1
Bisakah angka dikembalikan dari fungsi sebagai daftar / urutan, daripada dicetak ke stdout?
smls
@smls Tidak maaf, outputnya harus seperti contoh!
Sygmei
1
Dikatakan kode saya harus mengikuti pseudo-code dan ada print "\n", tapi saya menggunakan peringatan javascript untuk setiap baris. Apakah itu dapat diterima, atau apakah saya harus menggunakan console.log alih-alih membuat jawaban saya lebih lama?
2
Anda dapat menggunakan fungsi peringatan sebagai cara untuk ouput tetapi Anda tidak dapat menggunakan beberapa peringatan. Sesuatu seperti alert("23\n24\n25");akan bekerja padahal alert("23"); alert("24"); alert(25);tidak
Sygmei

Jawaban:

25

JavaScript (ES6),  44  43 56 byte

Disimpan 1 byte berkat Edit Produk ETH
: diperbaiki untuk memenuhi persyaratan output

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

Uji

Arnauld
sumber
Penggunaan lingkup yang bagus!
ETHproduk
Saya pikir Anda dapat mengatur ulang evaluntuk menyimpan byte:(a,b,c,d)=>{for(;eval(a+b+c);a+=d)alert(a)}
ETHproduksi
@ ETProduksi Ah, ya. Yang bagus!
Arnauld
5
Itu 44 dengan tutu!
aross
Ini tidak mengikuti spesifikasi di mana output adalah baris-demi-baris dengan U + 000A setelah setiap baris.
Joey
17

Javascript (ES6), 47 42 48 Bytes

Ingin membuat versi untuk tetapi seseorang lebih cepat, jadi inilah versi rekursif.

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

Anda perlu menambahkan f=sebelumnya dan menyebutnya seperti f(b,c,d)(a).

Banyak terima kasih kepada Arnauld untuk golf yang luar biasa ini.

alertdiubah menjadi console.logkarena spesifikasi keluaran


sumber
@Arnauld Terima kasih, itu golf yang sangat keren. Saya hanya bertanya kepadanya, jadi mari kita lihat apakah dia menerimanya.
Senang melihatnya diterima. ;)
Arnauld
Ini tidak mengikuti spesifikasi di mana output adalah baris-demi-baris dengan U + 000A setelah setiap baris.
Joey
@ Joey Itu hanya pseudo-code, tapi saya akan bertanya OP tentang ini.
@Masterzagh: Ada pertanyaan tentang format output alternatif yang ditolak.
Joey
15

Bash murni, 35

Saya berasumsi OK untuk menyambungkan parameter ke dalam standar untuk loop:

for((i=$1;i$2$3;i+=$4));{ echo $i;}

Cobalah online .

Trauma Digital
sumber
Haha, bash membuatnya sangat mudah
Sygmei
13

Jelly , 12 byte

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

Cobalah online!

Jelly memiliki banyak cara untuk melakukan iterasi, membuat rentang, dan lain-lain. Namun, perilaku mirroring C ++ sebenarnya cukup sulit, karena kasus-kasus khusus seperti kenaikan menjadi 0, loop berakhir sebelum mulai (karena ketidaksetaraan menjadi mundur ), dan kenaikan terjadi ke arah yang salah (dengan demikian berarti kondisi keluar dari loop tidak dapat dipenuhi secara alami). Dengan demikian, solusi ini pada dasarnya adalah terjemahan langsung dari C ++, meskipun itu membuatnya lebih rendah daripada program Jelly biasanya. Untungnya, C ++ memiliki perilaku yang tidak jelas pada ditandatangani integer overflow (pertanyaan menggunakan int), yang berarti bahwa suatu program dapat melakukan apa saja dalam kasus itu, dan dengan demikian tidak perlu mencoba untuk meniru perilaku overflow.

Penjelasan

Ṅ+⁶µ⁴;⁵¹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)

Menghancurkan program adalah cara tersest untuk mematikan output implisit Jelly (jika tidak, itu akan menampilkan nilai akhir dari penghitung); itu menghasilkan banyak galat kesalahan pada stderr, tetapi kami biasanya menganggap itu diizinkan.

Secara kebetulan, penghitung loop diinisialisasi dengan nilai saat ini sebelum loop dimulai. Ketika loop muncul di awal program, itu akan menjadi input pertama.


sumber
Anda dapat mengubah tagar tidak ada kerusakan. Dequeue menghasilkan daftar kosong di mana hasil cetak Jelly tidak menghasilkan apa-apa.
Jonathan Allan
@ JonathanAllan: Tidak, apa yang sebenarnya dilakukannya adalah membuat rentang dari 2 hingga nilai yang diberikan, yang pasti terlihat pada cetakan implisit.
Ah, saya pasti menguji teori itu dengan lingkaran yang berakhir di wilayah negatif; memang suatu rentang secara implisit dibuat.
Jonathan Allan
Uhm, ini 12 karakter, tapi bukan 12 byte, kan?
Cruncher
@Cruncher: Jelly menggunakan penyandian sendiri di mana setiap karakter yang digunakan oleh bahasa diwakili oleh satu byte (hanya menggunakan 256 karakter yang berbeda). Alasannya tidak menggunakan sesuatu yang lebih dikenal seperti kode halaman 437 adalah untuk membuatnya lebih mudah untuk mengetik (maksud saya, itu tidak mudah untuk diketik, tetapi lebih mudah daripada bahasa seperti gs2). Hexdump dari program ini akan menjadi 12 byte.
10

R, 63 byte

function(a,b,c,d)while(do.call(b,list(a,c))){cat(a,"\n");a=a+d}
Sven Hohenstein
sumber
9

Java, 58 byte

(a,b,c,d)->{for(;b>61?a>c:a<c;a+=d)System.out.println(a);}
Roman Gräf
sumber
14
Apakah ada alasan untuk membuat i? Bisakah Anda melewati bagian inisialisasi dan hanya menggunakan a? Juga, menggunakan nilai ASCII dari '>' (62) menyimpan satu byte.
Riley
6
Mengikuti komentar Riley, Anda dapat melakukannyab>61
Kritixi Lithos
Saya tidak percaya ini mengkompilasi.
ChiefTwoPencils
@ChiefTwoPencils Ini adalah fungsi. Anda harus menulis program pengujian di sekitarnya untuk mengkompilasinya.
wizzwizz4
@ wizzwizz4, jelas. Tapi itu masih tidak berhasil. Cobalah. Plus, pemahaman saya adalah semua byte yang diperlukan untuk menjalankannya diperhitungkan.
ChiefTwoPencils
7

05AB1E , 22 20 byte

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

Cobalah online!

Penjelasan

[                       # 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
Emigna
sumber
1
Setiap format input diterima sehingga versi kedua tidak apa-apa :)
Sygmei
7

SmileBASIC, 53 byte

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

Penjelasan:

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

Ini menggunakan fakta yang X<Ysama dengan-X>-Y

12Me21
sumber
Saya akan mempercayai Anda untuk yang ini, saya tidak punya 3DS untuk diuji :)
Sygmei
Saya memiliki Petit Computer, ide yang sangat keren! Saya akan mencoba sesuatu seperti ini kapan-kapan ...
python-b5
Anda bisa menggunakan READpernyataan, menghemat 1 byte.
ckjbgames
@ckjbgames bagaimana?
12Me21
@ 12Me21 Periksa manual SmileBASIC. Itu harus ada dalam daftar instruksi untuk SmileBASIC.
ckjbgames
6

Ditumpuk , 34 byte

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

Cobalah online! (Termasuk pengujian.) Ini adalah fungsi yang mengharapkan tumpukan terlihat seperti:

a b c d

Sebagai contoh:

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

Penjelasan

@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
Conor O'Brien
sumber
4

C ++, 80

Aduh, ini C++bukan C. Agak bingung dengan pertanyaan itu.

void f(int a,char b,int c,int d){for(;b==62?a>c:a<c;a+=d)cout<<a<<endl;}
Roman Gräf
sumber
Apakah ini C atau C ++?
betseg
10
Implementasi C ++ yang mana? (Saya ingin tahu bagaimana Anda mendapatkan sesuatu yang mirip using namespace stdgratis).
H Walters
Tidak iharus mulai a, bukan 0? Anda bisa menggunakan adan melewati isemuanya dan menggunakan nilai ASCII dari '>'. for(;b==62?a>c:a<c;a+=d)
Riley
Tidak berfungsi untukf(1,'<'3,1);
Roman Gräf
Ack ... ya, membutuhkan matematika di kedua sisi; for(b-=61;b*a>b*c;a+=d)bekerja untuk satu byte; tapi begitu juga for(;b-62?a<c:a>c;a+=d).
H Walters
4

C, 52 51 byte

-1 byte terima kasih kepada H Walters

f(a,b,c,d){for(;b&2?a>c:a<c;a+=d)printf("%d\n",a);}

Cobalah online!

simon
sumber
1
Maaf atas kesalahan dalam pseudo-code, saya menambah setelah setiap cetak :)
Sygmei
1
Gunakan b&2alih-alih b^60untuk byte lain.
H Walters
4

Python 3, 52 byte

def f(a,b,c,d):
 while[a>c,a<c][b<'>']:print(a);a+=d

repl.it

Jonathan Allan
sumber
Penggunaan daftar yang cerdas!
Sygmei
4

Pip , 14 byte

W Va.b.ca:d+Pa

Membawa empat argumen baris perintah. Mendukung angka negatif & floating point dan operator pembanding < > = <= >= !=. Cobalah online!

                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
DLosc
sumber
4

Jelly , 8 byte

ḢṄ+⁹;µV¿

Ini adalah tautan diadik yang menggunakan a, b, c sebagai argumen kirinya dan d sebagai yang kanan. Output mungkin tidak terbatas dan menuju ke STDOUT.

Cobalah online!

Bagaimana itu bekerja

ḢṄ+⁹;µ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.
Dennis
sumber
Argumen baris perintah menggunakan sintaksis Python dan tidak dapat membedakan antara karakter dan string tunggal. Jika Anda ingin menggunakan CLA, Anda harus memasukkan sebuah Funtuk meratakan array.
Dennis
2
Sekarang saya ingin menghapus setengah komentar saya karena sudah usang, sementara menjaga setengah lainnya. Saya kira saya hanya akan mengulangi setengah yang relevan dan menghapus sisanya: "Oh, bleh, Anda mendefinisikannya sebagai fungsi sehingga Anda bisa mengabaikan output implisit di bawah aturan PPCG. Saya seharusnya sudah memikirkan itu."
4

Python 2 , 45 byte

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

Cobalah online!

Implementasi spec yang sangat literal. Mengambil templat kode, menggantikan input melalui pemformatan string, dan menjalankannya.

Tidak
sumber
4

Plain 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} 

Perintah \formenyediakan fungsi yang diminta. Simpan ini sebagai for.texdan kemudian jalankan dan masukkan nilai variabel di baris perintah: pdftex '\input for \for 1 < 5 1 \bye'Nilai variabel harus dipisahkan oleh spasi.

musarithmia
sumber
4

Python 3, 61 byte

Satu liner:

e=input;exec(f'i={e()}\nwhile i{e()}{e()}:print(i);i+={e()}')
G-Ox7cd
sumber
Selamat datang di situs ini! Penggunaan fitur interpolasi string literal yang baru. Saya pikir Anda mungkin dapat menyimpan byte dengan mengganti \tspasi.
0
Terima kasih. Masih ukuran yang sama setelah menghapus \ n \ t setelah e ketiga ()
G-Ox7cd
3

Haskell , 66 64 byte

f a b c d|last$(a<c):[a>c|b>"<"]=print a>>f(a+d)b c d|1<3=pure()

Cobalah online! Pemakaian:

Prelude> f 0 "<" 9 2
0
2
4
6
8
Laikoni
sumber
3

Bash (+ Unix Tools), 29 byte

Golf

bc<<<"for(x=$1;x$2$3;x+=$4)x"

Uji

./forloop 1 '<' 10 1
1
2
3
4
5
6
7
8
9
zeppelin
sumber
1
Ha. Saya baru saja memposting hal yang sama persis ! +1
Trauma Digital
3

Ruby, 43 41 byte

->a,*i,d{a=d+p(a)while eval"%s"*3%[a,*i]}

Jika bdapat diambil sebagai simbol Ruby alih-alih string, Anda mendapatkan 38 byte :

->a,b,c,d{a=d+p(a)while[a,c].reduce b}

Coba salah satu solusi online!

Nilai Tinta
sumber
3

Gangguan umum, 82 80 79 73 64 byte

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

Uji

(f 1 < 10 1)

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

-9 byte terima kasih kepada PrzemysławP.

coredump
sumber
Mungkin Anda bisa menghemat 9 byte, dengan mendefinisikan makro. (defmacro f(a b c d)<insert backqoute here>(do((i,a(+ i,d)))((not(,b i,c)))(print i)))Penggunaan:(f 1 < 10 1)
@ PrzemysławP Terima kasih lagi!
coredump
3

PHP, 69 65 byte

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

Jalankan dengan '-r'; memberikan argumen baris perintah sebagai input.

Untuk satu byte lagi 4 byte lebih, saya dapat mengambil setiap operator:

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

Ya, eval jahat. Tahukah Anda bahwa itu dapat mengembalikan sesuatu?


Destrukturisasi singkatan [,$i,$b,$c,$d]=$argv;akan menghemat 4 byte lebih;
tetapi PHP 7.1 memposting tantangannya.

Titus
sumber
Rapi! Saya tidak yakin ketika membuat tantangan jika saya harus memasukkan setiap operator umum, maka saya ingat bahwa mereka tidak semuanya sama (~ = untuk! = Dalam Lua misalnya)
Sygmei
Woah, eval itu jahat.
cyberbit
Sepertinya saya bahwa Anda dapat menggunakan PHP 7.1 untuk membuatnya lebih pendek. Jika tidak demikian, gunakan listsave 4 Bytes plus 4 Bytes dengan sintaks pendek
Jörg Hülsermann
@PHP 7.1 memposting tantangan; tapi terima kasih untuk list().
Titus
2

Perl 6 , 44 byte

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

Bagaimana itu bekerja

{                                          }  # 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.

Jika boleh mengembalikan urutan angka (yang berpotensi tak terbatas) sebagai nilai tipe Seq, alih-alih mencetak angka ke stdout, .say forbagian tersebut dapat dihapus, sehingga menjadi 35 byte.

seseorang
sumber
2

Clojure, 66 63 byte

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

-3 byte dengan memfaktorkan keluar loop. Saya "menyalahgunakan" parameter init untuk bertindak sebagai akumulator yang berjalan.

Solusi rekursif (dengan TCO). Lihat komentar dalam kode pregolfed. Saya mencoba solusi rekursif non-TCO, dan akhirnya menjadi 67 byte.

Saya ingin melihat beat ini di Clojure! Saya pikir ini adalah yang terkecil yang bisa saya dapatkan.

(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) 
Carcigenicate
sumber
Oh saya tidak memperhatikan jawaban ini. #(when(({">">"<"<}%2)% %3)(println %)(recur(+ % %4)%2 %3 %4))akan menjadi 61 byte, menggabungkan Anda whendengan ({">">"<"<}%2).
NikoNyrh
2

Groovy, 51 byte

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

Ini adalah penutupan tanpa nama. Cobalah secara Online!

Perhatian - Jika Anda ingin menguji ini dengan groovy console, pastikan Anda membunuh seluruh proses ketika input menyebabkan loop tak terbatas. Saya perhatikan ini setelah mengkonsumsi ~ 5 gigs RAM.

Gurupad Mamadapur
sumber
2

QBIC , 51 40 byte

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

Dan tiga menit setelah posting saya menyadari saya bisa menyederhanakan logika 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
steenbergh
sumber
2

Batch, 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

Jika bukan karena perilaku parameter kedua, itu bisa dilakukan dalam 53 byte:

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

Ini tidak melakukan apa-apa jika langkah memiliki tanda yang salah. Tes tambahan adalah karena Batch's forloop memungkinkan variabel loop sama dengan nilai akhir.

Neil
sumber
2

Clojure, 66 byte

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

Ini bisa jadi 55 byte <dan >berfungsi di Clojure:

(def f #(loop[i %](if(%2 i %3)(do(println i)(recur(+ i %4))))))
(f 1 < 10 1)
NikoNyrh
sumber
Saya suka menggunakan peta di sini. Saya tidak akan pernah berpikir bahwa itu akan mengalahkan cara saya. Juga menarik bahwa kedua hitungan awal kami adalah sama, meskipun pendekatannya sedikit berbeda.
Carcigenicate
Membiarkan b menjadi fungsi akan memberikan keuntungan yang tidak adil untuk beberapa bahasa :)
Sygmei
Benar, tapi saya pikir sebagian besar bahasa yang saya tahu tidak akan mendapat banyak manfaat dari mengijinkan <alih-alih "<", kecuali Clojure.
NikoNyrh
@Sygmei Benar. Akan sangat manis freakin. Tidak dapat menyalahkan Anda membuat panggilan itu.
Carcigenicate
OP mengatakan karakter baik-baik saja daripada string untuk operator perbandingan btw. Itu harus menyimpan beberapa byte.
Carcigenicate
2

TI-Basic, 41 34 byte

Prompt A,Str2,Str3,D
While expr("A"+Str2+Str3
Disp A
A+D->A
End
Timtech
sumber
1
Cara kalkulator TI bekerja, banyak simbol disimpan sebagai satu byte. Prompt , Str2, Str3, While , expr(, Disp , ->, Dan Endsemua simbol tunggal-byte. Saya menghitung 29 byte.
Pavel
@Pavel Terima kasih atas minat Anda! Meskipun benar bahwa TI-Basic adalah tokenized, tidak semua token adalah satu byte. Sebagai contoh, Str2, Str3, dan expr(semua token dua-byte. Untuk melihat daftar token satu-byte, periksa tibasicdev.wikidot.com/one-byte-tokens
Timtech