Twoja własna instrukcja „za”


38

Twoja własna instrukcja „za”

Zakładając, że masz następujące dane wejściowe: a, b, c, d

Dane wejściowe mogą być w jednym wierszu przy użyciu dowolnego formatu „a / b / c / d” lub „a, b, c, d” itp.

Możesz także mieć 4 wejścia.

Musisz zakodować następujące zachowanie (tutaj pseudo-kod):

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

Oto kilka przypadków testowych:

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

Jeszcze jeden :

input : 20,>,10,1
output :
20
21
22
23
24
25
26
27
...
infinite loop / program crashes
  • ajest liczbą całkowitą , początkową wartością jest i.

  • bJest to ciąg znaków lub char , to nie może być coś innego, komparator stosowany w kończącym warunku forpętli.

    bmoże i musi być jednym z następujących ciągów:

    - ">"
    - "<"
    
  • cjest liczbą całkowitą , liczbą używaną w warunku końcowym for pętli.

  • djest liczbą całkowitą dodawaną do i w każdej pętli.

To jest golf golfowy, wygrywa najkrótsza odpowiedź!


1
Czy liczby mogą być zwracane z funkcji jako lista / sekwencja, a nie wypisywane na standardowe wyjście?
smls

@smls Nie przepraszam, dane wyjściowe muszą być jak w przykładach!
Sygmei

1
Mówi, że mój kod powinien podążać za pseudo-kodem i jest print "\n", ale używam alertu javascript dla każdej linii. Czy byłoby to do zaakceptowania, czy też musiałbym użyć konsoli.log zamiast przedłużać moją odpowiedź?

2
Możesz użyć funkcji alertu jako metody wypisywania, ale nie możesz użyć wielu alertów. Coś takiego alert("23\n24\n25");działałoby, a alert("23"); alert("24"); alert(25);nie
Sygmei

Odpowiedzi:


25

JavaScript (ES6),  44  43 56 bajtów

Zaoszczędzono 1 bajt dzięki ETHproductions
Edycja: naprawiono, aby spełnić wymagania wyjściowe

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

Test


Miłe wykorzystanie zakresu!
ETHprodukcje

Myślę, że możesz zmienić kolejność, evalaby zapisać bajt:(a,b,c,d)=>{for(;eval(a+b+c);a+=d)alert(a)}
ETHprodukcje

@ETHproductions Ach, tak. Niezłe!
Arnauld

5
To 44 z tutu!
aross

Nie jest to zgodne ze specyfikacją, gdzie wyjście jest linia po linii z U + 000A po każdej linii.
Joey,

17

JavaScript (ES6), 47 42 48 bajtów

Chciałem zrobić wersję dla, ale ktoś był szybszy, więc oto wersja rekurencyjna.

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

Musisz dodać f=wcześniej i nazwać tak f(b,c,d)(a).

Ogromne podziękowania dla Arnaulda za wspaniały golf.

alertzmieniono na z console.logpowodu specyfikacji wyjściowej


@Arnauld Dzięki, to całkiem fajny golf. Właśnie go zapytałem, więc zobaczmy, czy to zaakceptuje.

Cieszę się, że to zaakceptowano. ;)
Arnauld

Nie jest to zgodne ze specyfikacją, gdzie wyjście jest linia po linii z U + 000A po każdej linii.
Joey,

@Joey To tylko pseudo-kod, ale zapytam o to OP.

@Masterzagh: Pojawiło się pytanie o alternatywne formaty wyjściowe, które zostało odrzucone.
Joey,

15

Pure Bash, 35

Zakładam, że OK jest po prostu podłączyć parametry do standardowej pętli for:

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

Wypróbuj online .


Haha, bash sprawia, że ​​to naprawdę proste
Sygmei

13

Galaretka , 12 bajtów

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

Wypróbuj online!

Galaretka ma wiele sposobów na zwięzłe wykonywanie iteracji, tworzenie zakresów itp. Jednak dokładnie odwzorowanie zachowania C ++ jest dość trudne, ze względu na specjalne przypadki, takie jak przyrost równy 0, pętla kończy się przed rozpoczęciem (z powodu nierówności wstecznej ), a przyrost zmierza w złym kierunku (co oznacza, że ​​warunek wyjścia z pętli nie może być spełniony w sposób naturalny). Jako takie, to rozwiązanie jest w zasadzie bezpośrednim tłumaczeniem C ++, mimo że sprawia, że ​​jest to raczej poziom niższy niż zwykle program Jelly. Na szczęście C ++ zachowuje się niezdefiniowane w przypadku przepełnienia liczb całkowitych ze znakiem (używa pytania int), co oznacza, że ​​program może w tym przypadku zrobić wszystko, a zatem nie trzeba próbować naśladować tego zachowania.

Wyjaśnienie

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

Awaria programu to najkrótszy sposób na wyłączenie niejawnego wyjścia Jelly (w przeciwnym razie wyświetliłaby się końcowa wartość licznika); generuje kilka komunikatów o błędach na stderr, ale zwykle uważamy, że jest to dozwolone.

Nawiasem mówiąc, licznik pętli jest inicjowany bieżącą wartością przed rozpoczęciem pętli. Gdy pętla pojawi się na początku programu, będzie to pierwsze wejście.


Możesz zmienić, taby nie mieć awarii. Dequeue skutkuje pustą listą, dla której ukryty wydruk Jelly nic nie daje.
Jonathan Allan

@JonathanAllan: Nie robi, tak naprawdę tworzy zakres od 2 do podanej wartości, co jest zdecydowanie widoczne na niejawnym wydruku.

Ach, musiałem przetestować tę teorię z pętlą zakończoną ujemnym terytorium; rzeczywiście zakres jest domyślnie tworzony.
Jonathan Allan

Uhm, to jest 12 znaków, ale to nie 12 bajtów, prawda?
Cruncher

@Cruncher: Jelly używa własnego kodowania, w którym każdy znak używany przez język jest reprezentowany przez jeden bajt (używa tylko 256 różnych znaków). Powodem, dla którego nie używa czegoś bardziej znanego, jak strona kodowa 437, jest ułatwienie pisania (to znaczy, nie jest tak łatwe do pisania, ale jest łatwiejsze niż język taki jak gs2). Zrzut heksowy tego programu miałby 12 bajtów.



9

Java, 58 bajtów

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

14
Czy istnieje powód do tworzenia i? Czy możesz pominąć część inicjalizacji i po prostu użyć a? Ponadto użycie wartości ASCII „>” (62) powoduje zapisanie bajtu.
Riley

6
Po komentarzu Riley możesz to zrobićb>61
Kritixi Lithos

Nie wierzę, że to się kompiluje.
ChiefTwoPencils

@ChiefTwoPencils To funkcja. Musisz napisać wokół niego program testowy, aby go skompilować.
wizzwizz4

@ wizzwizz4, oczywiście. Ale to wciąż nie działa. Spróbuj. Ponadto, rozumiem, że wszystkie bajty wymagane do uruchomienia go się liczą.
ChiefTwoPencils

7

05AB1E , 22 20 bajtów

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

Wypróbuj online!

Wyjaśnienie

[                       # 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
Dowolny format wejściowy jest akceptowany, więc druga wersja jest w porządku :)
Sygmei

7

SmileBASIC, 53 bajty

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

Wyjaśnienie:

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

Wykorzystuje to fakt, który X<Yjest taki sam jak-X>-Y



Mam Petit Computer, świetny pomysł! Spróbuję kiedyś czegoś takiego ...
python-b5

Możesz użyć READinstrukcji, oszczędzając 1 bajt.
ckjbgames

@ckjbgames jak?
12Me21

@ 12Me21 Sprawdź instrukcje SmileBASIC. Powinien znajdować się na liście instrukcji dla SmileBASIC.
ckjbgames

6

Skumulowane , 34 bajty

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

Wypróbuj online! (Testy włączone.) Jest to funkcja, która oczekuje, że stos będzie wyglądał następująco:

a b c d

Na przykład:

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

Wyjaśnienie

@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

Ups, to C++nie jest C. Pytanie było nieco zdezorientowane.

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

Czy to jest C czy C ++?
betseg

10
Która implementacja C ++? (Jestem ciekawy, jak otrzymujesz coś podobnego using namespace stdza darmo).
H Walters,

Nie imusisz zaczynać od a, prawda 0? Możesz po prostu całkowicie użyć ai pominąć, ia także użyć wartości ASCII „>”. for(;b==62?a>c:a<c;a+=d)
Riley

Nie działa dlaf(1,'<'3,1);
Roman Gräf

Ack ... tak, wymaga matematyki po obu stronach; for(b-=61;b*a>b*c;a+=d)działa na pojedynczy bajt; ale tak też jest for(;b-62?a<c:a>c;a+=d).
H Walters,



4

Pip , 14 bajtów

W Va.b.ca:d+Pa

Bierze cztery argumenty wiersza poleceń. Obsługuje liczby ujemne i zmiennoprzecinkowe oraz operatory porównania < > = <= >= !=. Wypróbuj 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

4

Galaretka , 8 bajtów

ḢṄ+⁹;µV¿

Jest to ogniwo diademowe, które przyjmuje lewy argument , b, c, a prawy jako argument d . Wyjście może być nieskończone i przechodzi do STDOUT.

Wypróbuj online!

Jak to działa

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

Argumenty wiersza poleceń używają składni języka Python i nie mogą odróżniać znaku od ciągu singletonu. Jeśli chcesz używać CLA, musisz wstawić, Faby spłaszczyć tablicę.
Dennis

2
Teraz chcę usunąć połowę mojego komentarza, ponieważ jest on przestarzały, zachowując drugą połowę. Wydaje mi się, że powtórzę odpowiednią połowę i usunę resztę: „Och, och, zdefiniowałeś to jako funkcję, abyś mógł zignorować dorozumiany wynik zgodnie z regułami PPCG. Powinienem o tym pomyśleć”.

4

Python 2 , 45 bajtów

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

Wypróbuj online!

Bardzo dosłowne wdrożenie specyfikacji. Pobiera szablon kodu, zastępuje dane wejściowe poprzez formatowanie łańcucha i wykonuje go.


4

Zwykły TeX, 88 bajtów

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

Polecenie \forzapewnia żądaną funkcję. Zapisz to jako, for.texa następnie uruchom i wprowadź wartości zmiennych w wierszu poleceń: pdftex '\input for \for 1 < 5 1 \bye'Wartości zmiennych muszą być oddzielone spacjami.


4

Python 3, 61 bajtów

Jedna wkładka:

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

Witamy na stronie! Ładne użycie nowej funkcji interpolacji ciągów literalnych. Myślę, że możesz uratować bajt, zastępując \tgo spacją.
0

Dziękuję. Nadal ten sam rozmiar po usunięciu \ n \ t po trzecim e ()
G-Ox7cd


3

Bash (+ narzędzia Unix), 29 bajtów

Grał w golfa

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

Test

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

1
Ha. Właśnie miałem opublikować dokładnie to samo! +1
Cyfrowa trauma


3

Common Lisp, 82 80 79 73 64 bajty

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

Test

(f 1 < 10 1)

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

-9 bajtów dzięki PrzemysławP.


Być może można zapisać 9 bajtów, definiując makro. (defmacro f(a b c d)<insert backqoute here>(do((i,a(+ i,d)))((not(,b i,c)))(print i)))Zastosowanie:(f 1 < 10 1)

@ PrzemysławP Jeszcze raz dziękuję!
coredump

3

PHP, 69 65 bajtów

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

Uruchom z „-r”; podaj argumenty wiersza poleceń jako dane wejściowe.

Dla jednego bajta więcej 4 kolejne bajty, mogę wziąć każdy operator:

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

Tak, zło ewaluacji. Czy wiesz, że może coś zwrócić?


Krótkotrwała restrukturyzacja [,$i,$b,$c,$d]=$argv;pozwoliłaby zaoszczędzić 4 bajty;
ale PHP 7.1 dodaje wyzwanie.


Schludnie! Podczas tworzenia wyzwania nie byłem pewien, czy powinienem uwzględnić wszystkie wspólne operatory, wtedy przypomniałem sobie, że nie wszystkie są takie same (~ = dla! = Na przykład w Lua)
Sygmei

Woah, ewaluacja jest złem.
cyberbit

Wydaje mi się, że można użyć PHP 7.1, aby go skrócić. Jeśli tak nie jest, użycie listzapisuje 4 bajty plus 4 bajty z krótką składnią
Jörg Hülsermann

@PHP 7.1 postdatuje wyzwanie; ale dzięki za list().
Titus

2

Perl 6 , 44 bajtów

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

Jak to działa

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

Jeśli w porządku jest zwrócenie (potencjalnie nieskończonej) sekwencji liczb jako wartości typu Seq, zamiast drukowania liczb na standardowe wyjście, .say forczęść można usunąć, zmniejszając ją do 35 bajtów.


2

Clojure, 66 63 bajtów

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

-3 bajty przez wyodrębnienie loop. „Nadużywam” parametr init, aby działał jako działający akumulator.

Rozwiązanie rekurencyjne (z TCO). Zobacz komentarze w kodzie wstępnie golfowym. Wypróbowałem rozwiązanie rekurencyjne inne niż TCO i ostatecznie skończyło się na 67 bajtach.

Bardzo chciałbym zobaczyć ten rytm w Clojure! Myślę, że to najmniejsze, jakie mogę dostać.

(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) 

Och, nie zauważyłem tej odpowiedzi. #(when(({">">"<"<}%2)% %3)(println %)(recur(+ % %4)%2 %3 %4))byłoby 61 bajtów, łącząc twoje whenz moim ({">">"<"<}%2).
NikoNyrh

2

Groovy, 51 bajtów

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

To jest nienazwane zamknięcie. Wypróbuj online!

Uwaga - jeśli chcesz to przetestować groovy console, upewnij się, że zabiłeś cały proces, gdy dane wejściowe powodują nieskończoną pętlę. Zauważyłem to po zużyciu ~ 5 koncertów pamięci RAM.


2

QBIC , 51 40 bajtów

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

Trzy minuty po opublikowaniu zdałem sobie sprawę, że mogę uprościć logikę terminatora ...

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

Partia, 94 bajty

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

Gdyby nie zachowanie drugiego parametru, można by to zrobić w 53 bajtach:

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

To po prostu nic nie robi, jeśli krok ma zły znak. Dodatkowy test polega na tym, że forpętla Batcha pozwala, aby zmienna pętli była równa wartości końcowej.


2

Clojure, 66 bajtów

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

Może to być 55 bajtów jako <i >są funkcjami w Clojure:

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

Lubię korzystać z mapy tutaj. Nigdy bym nie pomyślał, że to by mnie pobiło. Interesujące jest również to, że obie nasze początkowe liczby były takie same, pomimo nieco innych podejść.
Carcigenicate

Zezwolenie b na funkcję dałoby nieuczciwą przewagę niektórym językom :)
Sygmei

To prawda, ale myślę, że większość języków, które znam, nie skorzystałyby na tym <zamiast "<", z wyjątkiem Clojure.
NikoNyrh

@Sygmei True. To byłoby cholernie słodkie. Nie mogę winić za wykonanie tego połączenia.
Carcigenicate

OP powiedział, że znaki są w porządku zamiast ciągów dla operatorów porównania btw. To powinno zaoszczędzić kilka bajtów.
Carcigenicate

2

TI-Basic, 41 34 bajtów

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

1
Jak działa kalkulator TI, wiele symboli jest przechowywanych jako jeden bajt. Prompt , Str2, Str3, While , expr(, Disp , ->, I Endsą wszystkie symbole jednobitowych. Liczę 29 bajtów.
Pavel

@Pavel Dziękujemy za zainteresowanie! Chociaż prawdą jest, że TI-Basic jest tokenizowany, nie wszystkie tokeny są jednobajtowe. Na przykład Str2, Str3i expr(to wszystkie żetony dwóch bajtów. Aby wyświetlić listę jednobajtowych tokenów, sprawdź tibasicdev.wikidot.com/one-byte-tokens
Timtech
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.