Sizin “kendi” talimatınız için


38

"Kendi" talimatınız için

Aşağıdaki girdiye sahip olduğunuzu varsayalım: a, b, c, d

Giriş, "a / b / c / d" veya "a, b, c, d" vb. Formatlarını kullanarak tek satırda olabilir.

Ayrıca 4 giriş yapabilirsiniz.

Aşağıdaki davranışı kodlamanız gerekir (burada sözde kod):

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

İşte bazı test durumları:

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

Bir tane daha :

input : 20,>,10,1
output :
20
21
22
23
24
25
26
27
...
infinite loop / program crashes
  • abir tamsayı , başlangıç ​​değeridir i.

  • bbir dize veya karakter , başka bir şey olamaz, fordöngünün bitiş koşulunda kullanılan karşılaştırıcı olamaz .

    başağıdaki karakterlerden biri olabilir ve olmalı :

    - ">"
    - "<"
    
  • cbir tamsayı , for döngünün bitiş koşullarında kullanılan sayıdır .

  • dher döngüde i'ye eklenen bir tamsayıdır .

Bu kod golf, en kısa cevap kazanıyor!


1
Sayılar bir işlevden stdout'a yazdırılmak yerine liste / sıra olarak döndürülebilir mi?
17'de sml

@smls Hayır üzgünüm, çıktı örnekler gibi olmalı!
Sygmei

1
Kodumun sözde kodu izlemesi gerektiğini söylüyor ve bir tane var print "\n", ancak her satır için javascript'in uyarısını kullanıyorum. Bu kabul edilebilir mi, yoksa cevabımı daha uzun yapmak yerine console.log kullanmak zorunda mıyım?

2
Uyarı işlevini çıkmanın bir yolu olarak kullanabilirsiniz, ancak birden çok uyarı kullanamazsınız. Böyle bir şey alert("23\n24\n25");oysa çalışacak alert("23"); alert("24"); alert(25);olmaz
Sygmei

Yanıtlar:


25

JavaScript (ES6),  44  43 56 bayt

ETHproductions Edit ile 1 byte kurtarıldı Düzenlendi
: çıktı gereksinimlerine uyması için sabitlendi

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

Ölçek


Kapsamın güzel kullanımı!
ETHProductions

Sanırım evalbir bayttan tasarruf etmek için yeniden düzenleme yapabileceğinizi düşünüyorum :(a,b,c,d)=>{for(;eval(a+b+c);a+=d)alert(a)}
ETHproductions

@ETHproductions Ah, evet. Güzel!
Arnauld

5
Bu bir tutu ile 44!
17:17

Bu, çıktının her satırdan sonra U + 000A ile satır satır belirtimi takip etmez.
Joey

17

Javascript (ES6), 47 42 48 Bayt

For sürümü yapmak istedi ancak birisi daha hızlıydı, işte özyinelemeli sürüm.

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

Daha f=önce eklemeniz ve böyle çağırmanız gerekir f(b,c,d)(a).

Harika golf için Arnauld'a çok teşekkürler.

alertconsole.logçıkış özelliği nedeniyle değişti


@Arnauld Teşekkürler, çok güzel bir golf. Sadece sordum, bakalım kabul etsin mi.

Kabul ettiğini görmek güzel. ;)
Arnauld

Bu, çıktının her satırdan sonra U + 000A ile satır satır belirtimi takip etmez.
Joey

@Joey Bu sadece sözde kod, fakat OP hakkında bunu soracağım.

@Masterzagh: Daha önce reddedilen alternatif çıktı biçimleriyle ilgili bir soru vardı.
Joey


13

Jöle , 12 bayt

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

Çevrimiçi deneyin!

Jöle yinelemeyi, aralıkları yaratmayı, vb. Yapmanın pek çok yoluna sahiptir. Ancak, C ++ 'nın davranışını tam olarak yansıtmak, artış 0 olması gibi özel durumlar nedeniyle, döngü başlamadan önce biten (eşitsizlik geriye doğru olduğundan dolayı) oldukça zordur. ) ve artış yanlış yöne gidiyor (bu nedenle döngünün çıkış koşulunun doğal olarak karşılanamaması anlamına gelir). Bu nedenle, bu çözüm temel olarak C ++ 'ın doğrudan çevirisidir, ancak bu normalde bir Jelly programından çok daha düşük düzeyde olmasına rağmen. Neyse ki, C ++ imzalı tamsayı taşması konusunda tanımsız bir davranışa sahiptir (soru kullanılır int), yani bir program bu durumda bir şey yapabilir ve bu nedenle taşma davranışını taklit etmeye gerek yoktur.

açıklama

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

Programın çökmesi, Jelly'in örtük çıktısını kapatmanın en ters yoludur (aksi takdirde sayacın son değerini çıkarır); stderr'de bir sürü hata mesajı oluşturur, ancak normalde buna izin verildiğini düşünüyoruz.

Bu arada, döngü sayacı, döngü başlamadan önce mevcut değerle başlatılır. Döngü programın başında göründüğü gibi, ilk giriş bu olacaktır.


Sen değişebilir tiçin hiçbir çökme olması. Dequeue, Jelly'in örtülü baskısının hiçbir şey sağlamadığı boş bir listeyle sonuçlanır.
Jonathan Allan,

@JonathanAllan: Öyle değil, aslında yaptığı şey 2 ile verilen değer arasında bir aralık oluşturmak, ki bu kesinlikle örtük bir baskıda görülebilir.

Ah, bu teoriyi negatif bölgede biten bir döngü ile test etmiş olmalıyım; gerçekten bir aralık dolaylı olarak yaratılmıştır.
Jonathan Allan,

Uhm, bu 12 karakter, fakat 12 bayt değil mi?
Cruncher

@Cruncher: Jelly , dil tarafından kullanılan her karakterin tek bir bayt ile temsil edildiği kendi kodlamasını kullanır (yalnızca 256 farklı karakter kullanır). Kod sayfası 437 gibi daha iyi bilinen bir şeyi kullanmamasının nedeni, yazmayı kolaylaştırmasıdır (Yani, yazması kolay değildir, ancak gs2 gibi bir dilden daha kolaydır). Bu programın bir hexdump 12 bayt uzunluğunda olacaktı.



9

Java, 58 bayt

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

14
Yaratmak için bir sebep var mı i? Başlatma bölümünü atlayıp, sadece kullanabilir amisiniz? Ayrıca, ASCII '>' (62) değerini kullanarak bir bayt kaydeder.
Riley,

6
Riley'nin yorumundan sonra şunları yapabilirsinizb>61
Kritixi Lithos

Bunun derlendiğine inanmıyorum.
ChiefTwoPencils,

@ ŞefhTwoPencils Bu bir fonksiyondur. Derlemek için etrafına bir test programı yazmalısınız.
wizzwizz4

@ wizzwizz4, belli ki. Ama bu hala çalışmıyor. Bi dene. Artı, benim anlayış saymak için gerekli tüm bayt.
ChiefTwoPencils,

7

05AB1E , 22 20 bayt

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

Çevrimiçi deneyin!

açıklama

[                       # 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
Herhangi bir giriş formatı kabul edilir, böylece ikinci sürüm tamamdır :)
Sygmei

7

SmileBASIC, 53 bayt

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

Açıklama:

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

Bu X<Yaynı olan gerçeği kullanır-X>-Y


Bunun için sana güveneceğim, test
edeceğim 3DS'm yok

Petit Computer'ım var, harika bir fikir! Bazen böyle bir şey deneyeceğim ...
python-b5 21

READ1 bayt kaydederek bir ifade kullanabilirsiniz .
ckjbgames

@ckjbgames nasıl?
12Me21

@ 12Me21 SmileBASIC kılavuzlarını kontrol edin. SmileBASIC talimatları listesinde bulunmalıdır.
ckjbgames

6

Yığılmış , 34 bayt

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

Çevrimiçi deneyin! (Test dahil.) Bu, yığının benzemesini bekleyen bir işlevdir:

a b c d

Örneğin:

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

açıklama

@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

Hata! Bu C++değil C. Biraz soru ile karıştı.

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

Bu C mi yoksa C ++ mı?
17'de

10
C ++ hangi uygulaması? (Nasıl using namespace stdücretsiz bir şey elde edersiniz merak ediyorum ).
H Walters

Does not ibaşlamak zorunda adeğil 0? Sadece kullanabilirsiniza ve atlama i'>' tamamen ve ASCII değer olarak kullanılır. for(;b==62?a>c:a<c;a+=d)
Riley,

İçin çalışmıyor f(1,'<'3,1);
Roman Gräf

Ack ... evet, her iki tarafta da matematiği gerektirir; for(b-=61;b*a>b*c;a+=d)tek bir bayt için çalışır; ama öyle for(;b-62?a<c:a>c;a+=d).
H Walters



4

Pip , 14 bayt

W Va.b.ca:d+Pa

Dört komut satırı argümanı alır. Negatif ve kayan nokta sayılarını ve karşılaştırma operatörlerini destekler < > = <= >= !=. Çevrimiçi deneyin!

                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

Jöle , 8 bayt

ḢṄ+⁹;µV¿

Bu, a , b, c'yi sol argümanı, d'yi de sağ kolu olarak alan ikili bir bağlantıdır . Çıkış sonsuz olabilir ve STDOUT'a gider.

Çevrimiçi deneyin!

Nasıl çalışır

ḢṄ+⁹;µ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.

Komut satırı argümanları Python sözdizimini kullanır ve bir karakter ile bir tekil dize arasında ayrım yapamaz. CLA kullanmak istiyorsanız F, diziyi düzleştirmek için a eklemeniz gerekir .
Dennis

2
Şimdi yorumumun yarısını silmek istiyorum, diğer yarısını korurken. Sanırım sadece ilgili yarısını tekrarlayacağım ve gerisini sileceğim: "Ah, haydi, onu bir işlev olarak tanımladınız, böylece PPCG kuralları altındaki örtük çıktıyı göz ardı edebilirsiniz. Bunu düşünmeliydim."

4

Python 2,45 bayt

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

Çevrimiçi deneyin!

Spec bir çok değişmez bir uygulama. Kod şablonunu alır, girdilerde string formatlama ile yer değiştirir ve çalıştırır.


4

Düz TeX, 88 bayt

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

Komut \foristenen işlevi sağlar. Bunu farklı kaydedin for.texve sonra çalıştırın ve değişken değerlerini komut satırına girin: pdftex '\input for \for 1 < 5 1 \bye'Değişken değerlerin boşluklarla ayrılması gerekir.


4

Python 3, 61 bayt

Bir astar:

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

Siteye Hoşgeldiniz! Yeni değişmez dize enterpolasyon özelliğinin güzel kullanımı. \tBir boşlukla değiştirerek bir bayttan tasarruf edebileceğinizi düşünüyorum .
0

Thank you.st \ n \ t üçüncü sonra çıkardıktan sonra aynı boyutta e ()
G-Ox7cd 6


3

Bash (+ Unix Araçları), 29 bayt

golfed

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

Ölçek

./forloop 1 '<' 10 1
1
2
3
4
5
6
7
8
9

1
Ha. Sadece göndermek üzereyken tam aynı şeyi! +1
Dijital Travma


3

dc , 47 bayt

dc , 48 bayt

Ayrıca Bash + Unix yardımcı programları, 29 bayt

dc (47 bayt):

1sb[_1sb]s zz?sdlb*sc[pld+lnx]sl[dlb*lcr<l]dsnx

Çevrimiçi deneyin!

Eksi işareti yerine negatif sayıların alt çizgi ile girilmesi gerektiğine dikkat edin, çünkü dc sayısal girişi kabul eder. Bu nedenle, örneğin, -5 yerine _5 yazın.


dc bir değişkene karakter veya string girişi okuyamaz ve işleyemez (aşağıda daha ayrıntılı bir açıklama vardır), ancak bunun üzerinde çalışmanın iki yolunu buldum:

47 baytlık DC çözeltisi argument1 vardır ve sınırlayıcı olarak boşluklu, ters argument2 giriş çalışır. Bu nedenle, 1'den 1'e (ancak dahil değil) saymak, 3'lük adımlarla 10 olarak girilir:

< 1 10 3

Bağımsız değişkenlerin sırasını değiştirmek kabul edilemezse, bağımsız değişkenlerin orijinal sırasını koruyan 48 baytlık bir dc çözümü de veriyorum . Bu zz, argümanlar arasındaki sınırlayıcı olarak kullanır . Bu yüzden 1'den 3'e kadar (ancak dahil değil) 10'dan tekrar saymak aşağıdaki giriş satırını kullanır:

1zz<zz10zz3

Son olarak, aynı fikirler 29 baytlık bir bash çözümü sunar .


Dc'nin string işleme eksikliğinin ve bu programın bununla nasıl başa çıktığına ilişkin detaylar:

Bu sorunu dc'de kullanmak zordur, çünkü dc çoğu dilde olduğu gibi string veya char girdisini kabul etmez. Dc bir giriş dizesini okuduğunda, hemen bu dizeyi bir dc programı (makro) olarak çalıştırır ve sonra dizeyi atar. Dizenin karakterlerini bellekte saklayamaz ve daha sonra veya başka bir şekilde işleyemezsiniz. Bu, girişte '<' veya '>' olması şartına müdahale eder.

Bunun etrafında iki yol göstereceğim. Yukarıdaki çözümde (47 bayt), ilk iki girişin sırasını değiştiriyoruz. Giriş sınırlayıcı, boşluk karakteridir. Örneğin, 1'den 3'e kadar (ancak dahil değil) 10'dan 3'e kadar saymak için,

< 1 10 3

İşte bu çözümün arkasındaki fikir:

Dc'deki makrolar kayıtlarda saklanır ve kayıtların tek karakterli adları vardır. Makroyu, adı yalnızca boşluk karakteri olan kayıt defterinde saklarım.

Program girişi almadan önce yığında 0 ve 1 tuşlarına basarak çalışır. Ardından, giriş bir dc programı olarak çalıştırıldığında (bu, dc'nin giriş satırlarıyla yaptığı şeydir), '<' veya '>' karakteri, komutun adıdır; '<' veya '>' sonrası sonraki karakter. Özellikle, yığındaki ilk iki öğe atılır. Açılan ilk öğe <(sırasıyla,>) ise, ikinci öğe açılan ise, belirtilen makro yürütülür. Bir sonraki karakter ('<' veya '>' işaretinden sonra) bir boşluktur, yani adı char olan boşlukta kaydettiğimiz makro, koşul geçerliyse yürütülen karakterdir. Ama yığına 0 ve 1 ittik, bu yüzden ilk atılan madde 1, ikinci atılan madde ise 0 oldu. Makro yalnızca koşullu test> ise <değil, yürütülür. Bu, girişteki '<' ve '>' arasındaki farkı ayırt etmemizi sağlar.

Satırdaki kalan öğeler yalnızca rakamlardır ve dc bu sayıları yığına sırayla basar.

İşte ayrıntılı bir açıklama. Çoğu zaman, sayma değişkeni (problem ifadesinde sözde koddaki i) yığının en üstünde saklanır.

1sb             Store 1 in register b.  (b will end up being 1 for '<', and -1 for '>').
[_1sb]s         Note that there is a space after the second s.  So the space char is the name of a macro which stores -1 in b.
z               Push 0 on the stack.
z               Push 1 on the stack.
?               Accept input in the format above.  This will:
                    - Store 1 or -1 in b, depending on whether you've typed "<" or ">"
                    - Push each of the three numbers in turn on the stack.
sd              Save the increment in register d.
lb*sc           Save either limit or -limit in register c, depending on whether the input started with "<" or ">".
[pld+lnx]sl     Define a macro called l which is the body of our loop:
                    - Prints the top of the stack
                    - Adds the increment to the top of the stack.
                    - Calls macro n (the loop test).

 [dlb*lcr<l]dsn  Define a macro called n which is the test of the loop:
                    It checks to see if i (at the top of the stack) times b is less than c; if so, it calls macro l (looping back).
 x               Execute the loop test macro initially (a while loop needs to have a test at the top before entering the loop the first time).

Öte yandan, OP belirtti:

Input can be in one-line using any format "a/b/c/d" or "a,b,c,d" etc.

Bu yüzden belki siparişi değiştirmek ve girdiden önce b'yi almak meşru değildir.

İşte a, b, c ve d'yi orijinal sıralarında tutan bir alternatif. Herhangi bir sınırlayıcı kullanmamıza izin verilir; Sınırlayıcı olarak zz kullanacağım. Bu nedenle, 1'den 1'e (ancak dahil değil) saymak, 3'lük adımlarla 10 olarak girilir:

1zz<zz10zz3

Zz ile ayrılmış girdili yeni program

dc (48 bayt):

1sb[_1sb]sz?sdiilb*sci[pld+lnx]sl[dlb*lcr<l]dsnx

Bu, 47 bayt ilk çözümden daha uzun bir bayttır.

Zz-ayrılmış sürümünü çevrimiçi olarak deneyin!

Şahsen farklı sıradaki < 1 10 3formatlamanın problemin özünde olduğunu düşünüyorum , ancak 1zz<zz10zz3teknik şartnamenin yerine getirilmesi daha iyi olabilir.

Farklı girdi argümanları arasında farklı sınırlayıcılara izin verirseniz, muhtemelen daha kısa bir çözüm elde edebilirsiniz, ancak bunun sorunun özünde olduğunu sanmıyorum.

Bash + Unix yardımcı programları, 29 bayt

Yukarıdaki fikri bir bash programına dönüştürebilirsiniz (bu, dc çağırır); bu, "<" ve ">" ile ilgili tüm zorluklardan kaçınır ve ayrıca çeşitli sayısal parametrelerin kullanılmasını da kolaylaştırır, bu nedenle @ zeppelin bash + bc cevabıyla aynı, sadece 29 bayt uzunluğundadır.

bash versiyonu (29 bayt):

dc -e[p$4+d$3r$2l]sl$1d$3r$2l

Çevrimiçi bash sürümünü deneyin!

Bash programının içindeki dc programının nasıl çalıştığının bir açıklaması:

İ değeri çoğu zaman yığının en üstünde depolanır.

[      Start of macro (i is at the top of the stack). This macro will be called l.
p      Print i
$4+    i += (4th argument)
d      Duplicate i at the top of the stack.
$3     Push the 3rd argument onto the stack.
r      Swap the top two items on the stack, so i is at the top and arg3 is second
$2l    $2 is "<" or ">", causing the top two items to be popped from the stack, and macro l is then called (effectively looping back) if i < arg3 or i > arg3, respectively.
]sl    End of macro definition; store macro in register l.

$1     Push argument 1 onto the stack (i = 1st argument).
d$3r$2l Just as above, call macro l if i < arg3, or i > arg3, depending on whether arg2 is "<" or ">"

3

Ortak Lisp, 82 80 79 73 64 bayt

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

Ölçek

(f 1 < 10 1)

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

-9 PrzemysławP sayesinde bayt.


Belki bir makro tanımlayarak 9 bayt kaydedebilirsiniz. (defmacro f(a b c d)<insert backqoute here>(do((i,a(+ i,d)))((not(,b i,c)))(print i)))Kullanım:(f 1 < 10 1)

@ PrzemysławP Tekrar teşekkürler!
coredump

3

PHP, 69 65 bayt

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

'-R' ile çalıştırın; girdi olarak komut satırı argümanları sağlar.

İçin sadece bir byte daha 4 daha bayt, her operatöre alabilir:

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

Evet, kötü değerlendirme. Bir şeyleri geri getirebileceğini biliyor muydun?


Kısa devre imhası [,$i,$b,$c,$d]=$argv;4 bayt daha fazla tasarruf eder;
ancak PHP 7.1 bu mücadeleyi yayınladı.


Temiz! Her ortak operatörü dahil etmem gerekip
gerekmediğini sorduğumda

Vay, eval şeytan.
siberbit

Bana öyle geliyor ki PHP 7.1'i kısaltmak için kullanabilirsiniz. Kullanımı şimdiye Değilse list4 Byte artı kısa sözdizimi ile 4 Bytes kaydeder
Jörg Hülsermann

@PHP 7.1, mücadeleyi yayınladı; ama için teşekkürler list().
Titus

2

Perl 6 , 44 bayt

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

Nasıl çalışır

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

SeqSayıları stdout'a yazdırmak yerine (potansiyel olarak sınırsız) bir sayı dizisini tür değeri olarak döndürmek tamamsa, .say forparça çıkarılabilir ve bu sayı 35 bayta indirilir.


2

Clojure, 66 63 bayt

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

Faktoring yaparak -3 bayt loop. Çalışan akümülatör olarak çalışmak için init parametresini "kötüye kullanıyorum".

Özyinelemeli çözüm (TCO ile). Önceden kodlanmış koddaki yorumları görün. TCO olmayan özyinelemeli bir çözüm denedim ve 67 bayt oldu.

Clojure'de bu ritmi görmeyi çok isterim! Sanırım bu bulabileceğim en küçük şey.

(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 bu cevabı farketmedim. #(when(({">">"<"<}%2)% %3)(println %)(recur(+ % %4)%2 %3 %4))61 byte olarak reklam birleştirerek olurdu whensahip oldugumla ({">">"<"<}%2).
NikoNyrh

2

Groovy, 51 bayt

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

Bu isimsiz bir kapanış. Çevrimiçi Deneyin!

Dikkat - Bunu test etmek istiyorsanız groovy console, giriş sonsuz bir döngüye neden olduğunda tüm işlemi öldürdüğünüzden emin olun. Bunu ~ 5 gig RAM tükettikten sonra fark ettim.


2

QBIC , 51 40 bayt

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

Ve gönderimden üç dakika sonra, sonlandırıcı mantığını basitleştirebileceğimi farkettim ...

:;::      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

Toplu iş, 94 bayt

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

İkinci parametre davranışı için değilse, 53 baytta yapılabilir:

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

Bu, eğer adım yanlış işarete sahipse hiçbir şey yapmaz. Ekstra test, Batch'ın fordöngüsünün döngü değişkeninin bitiş değerine eşit olmasını sağlamasıdır.


2

Clojure, 66 bayt

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

Bu, 55 bayt olabilir <ve >Clojure'deki fonksiyonlardır:

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

Haritanın burada kullanılmasını seviyorum. Bunun benim yolumu dövdüğünü asla düşünmezdim. Ayrıca, her iki başlangıç ​​sayımızın da biraz farklı yaklaşımlara rağmen aynı olması ilginç.
17'de Kanserojen


Doğru, ama bildiğim çoğu dil , Clojure dışında izin vermek <yerine pek fayda görmeyeceğini düşünüyorum "<".
NikoNyrh

@Sygmei Doğru. Yine de tatlı ucube tatlı olurdu. Bu çağrıyı yaparken seni suçlayamam.
Carcigenicate

OP, bahsedilen karakterlerin btw karşılaştırma operatörleri için karakter dizileri yerine iyi olduğunu söyledi. Birkaç bayt kurtarmalı.
Carcigenicate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.