Tak, ale nie, ale tak

46

Mój kolega niedawno przesłał mi jako żart następujący fragment JavaScript:

let butScript = (nrOfButs) => {
    for(var i = 0; i < nrOfButs; i++){
        if(i % 3 == 0){
            console.log("Yeah")
        }
        if(i % 2 == 0){
            console.log("But")
        }
        if(i % 3 == 1){
            console.log("No")
        }
    }
}

Ponieważ kod został napisany w godzinach pracy, było to oczywiście ogromne marnotrawstwo zasobów firmy. Aby zapobiec podobnym zdarzeniom w przyszłości, musimy zminimalizować marnowanie przepracowanych godzin. A ponieważ powszechnie wiadomo, że krótszy program jest szybszy do napisania, musimy zagrać w ten kod, aby był jak najkrótszy!

Wejście

Pojedyncza nieujemna liczba całkowita. Nie wolno obsługiwać błędnych danych wejściowych.

Wynik

Twój program musi generować dane wyjściowe identyczne jak w powyższym skrypcie. Powinieneś wypisać jedno słowo w wierszu, a liczba słów powinna być zgodna z oryginalnym skryptem.

Dozwolone jest umieszczanie znaków spacji nie-nowej linii na końcu każdej linii (ale nie na początku), ponieważ są one niewidoczne. Jeden dodatkowy znak nowej linii jest dozwolony na samym końcu danych wyjściowych.

Przykłady

Input: 0
Output:


Input: 1
Output:
Yeah
But

Input: 2
Output:
Yeah
But
No

Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
maxb
źródło
3
Czy możemy zwrócić listę linii?
Jo King
10
Praca z tak zabawnym facetem musi być zabawna! : s Mówiąc nieco poważniej: nrOfButszmienna jest raczej źle nazwana i wprowadza w błąd. W każdym razie całkiem proste wyzwanie.
Arnauld,
10
Czy otrzymamy premię, jeśli ostatnia linijka brzmi: „Bóg nie może uwierzyć, że to powiedziałeś!”
Ciaran_McCarthy
3
@EriktheOutgolfer ifspadek koryta i kontynuuj w bieżącej pętli, jeśli ich warunek jest spełniony.
dzaima
4
Jak dotąd najbardziej australijski codegolf? Z wyjątkiem tego, że powinno to być „nah”
Nacht - Przywróć Monikę

Odpowiedzi:

48

Excel, 78 bajtów

Zakłada wejście w komórce A1 i formatowanie Wordwrap jest włączone dla komórki. Użyj Alt + Enter, aby dodać informacje o wierszach w ciągu i zwróć uwagę na białe znaki. Obsługuje tylko dane wejściowe do 3570 ze względu na limit funkcji REPT (powodzenia, aby komórka była tak wysoka).

=LEFT(REPT("Yeah
But
No      
But     
Yeah    
But
No           
",595),A1*9)

Przedruk, z kropkami na białe znaki

=LEFT(REPT("Yeah
But
No......
But.....
Yeah....
But
No...........
",595),A1*9)

Jak to działa: wzór powtarza się co 6 liczb:

0 = Yeah and But      Yeah + linefeed + But + linefeed
1 = No                No + 6 whitespace + line feed
2 = But               But + 5 whitespace + linefeed
3 = Yeah              Yeah + 4 whitespace + linefeed
4 = But and No        But + linefeed + No + 3 whitespace
5 = Blank             8 whitespace + linefeed

Każdy z nich można wyrazić za pomocą 9 znaków, więc ciąg znaków składa się z 54 znaków (9 * 6), a następnie powtarzany tak długo, jak pozwala na to Excel. Następnie jako wynik przyjmuje lewe 9 * (liczba znaków wejściowych).

Podawanie wiersza dla „ale i nikt” nie jest umieszczane za pustym miejscem, tak że Yeah dla # 6, # 12, (itd.) Jest formatowany po lewej, a nie po prawej stronie, i że nie ma dodawanego pustego kanału co 6 linii dla tego przedmiotu.

Wynik

Keeta
źródło
1
Nie mogę tego zweryfikować, ale twój opis sprawia, że ​​wydaje się to poprawne. Czy możesz dodać jakieś przykładowe pary wejścia / wyjścia? Jeden z najbardziej absurdalnych języków, ale mimo to świetna odpowiedź.
maks.
16
@maxb Nie może być aż tak absurdalnie, gdy pokonuje inne języki.
Keeta
1
Świetne wyjaśnienie i bardzo fajna technika. Działa również w LibreOffice Calc, ale może wymagać trochę zabawy z formatowaniem. +1
ElPedro
20

JavaScript (ES6), 59 57 bajtów

f=n=>n?f(n-1)+[s=n&1?`But
`:'',`Yeah
`+s,s+`No
`][n%3]:''

Wypróbuj online!

W jaki sposób?

Używamy funkcji rekurencyjnej, która przechodzi od do 1 zamiast od 0 do n - 1 .n10n1

W rezultacie testy są wyłączone o porównaniu z kodem referencyjnym:1

  • jeśli , „Tak”n1(mod3)
  • jeśli , „But”n1(mod2)
  • jeśli , wyjście „Nie”n2(mod3)

Dzięki temu możemy zapisać prostszą wielkość liter jako pierwszy wpis w naszej tablicy odnośników, w której możemy zdefiniować : zmienną zawierającą jeden lub pusty ciąg znaków.sn0(mod3)s"But\n"

Dwa pozostałe wpisy są zdefiniowane odpowiednio "Yeah\n" + si s + "No\n".

Uwaga: Poprzez iterację od do , moglibyśmy również zdefiniować w pierwszym wpisie, ale to kosztowałoby dwa dodatkowe nawiasy .0 sn10s

Skomentował

f = n =>            // n = input
  n ?               // if n is not equal to 0:
    f(n - 1) +      //   prepend the result of a recursive call with n - 1
    [               //   define our lookup array:
      s = n & 1 ?   //     1st entry: if n is odd:
        `But\n`     //       set s to "But"
      :             //     else:
        '',         //       set s to an empty string
      `Yeah\n` + s, //     2nd entry: "Yeah" followed by s
      s + `No\n`    //     3rd entry: s followed by "No"
    ][n % 3]        //   append the correct entry for this iteration
  :                 // else:
    ''              //   return an empty string and stop recursion
Arnauld
źródło
16

LOLCODE , 257 bajtów

HAI 1.2
I HAS A B
GIMMEH B
B IS NOW A NUMBR
I HAS A C ITZ 0
IM IN YR L UPPIN YR C TIL BOTH SAEM B AN C
I HAS A D ITZ MOD OF C AN 3
D
WTF?
OMG 0
VISIBLE "Yeah"
OIC
MOD OF C AN 2
WTF?
OMG 0
VISIBLE "But"
OIC
D
WTF?
OMG 1
VISIBLE "No"
OIC
IM OUTTA YR L
KTHXBYE

Wypróbuj online!

JosiahRyanW
źródło
2
Wygląda niesamowicie (nie chciałbym tego kodować!), Ale w przypadku testowym 10 drugie „Nie” i trzecie „Ale” zostaje odwrócone ... Tak Tak, ale nie: D
seadoggie01
2
Ups, pomyślałem, że mogę tam zoptymalizować. To trudny wzór. Naprawiłem to teraz.
JosiahRyanW
1
Uwielbiam sposób, w jaki brzmi
LocustHorde,
4
Czy VISIBLE "But"odnosi się do braku spodni w programie?
JDL
12

Biała spacja , 315 304 300 277 276 bajtów

Dzięki @JoKing za -11 bajtów (zmniejszenie liczby używanych etykiet z 8 do 7) i -24 dodatkowych bajtów (zmiana ogólnego przebiegu programu i zmniejszenie ilości używanych etykiet z 7 do 5 w procesie).

[S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_integer][N
S S N
_Create_Label_LOOP][S S S N
_Push_0][T  T   T   _Retrieve][N
T   S S N
_If_negative_jump_to_Label_PRINT][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][S S S T    S N
_Push_2][T  S S T   _Subtract][N
T   T   T   N
_If_negative_jump_to_Label_SKIP_NO][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N][N
S S T   N
_Create_Label_SKIP_NO][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  S N
_Push_2][T  S T T   _Modulo][N
T   S S S N
_If_0_jump_to_Label_SKIP_BUT][S S T T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   S S N
_Push_12_t][S S S T T   S T N
_Push_13_u][S S T   T   S S T   T   S N
_Push_-38_B][N
S S S S N
_Create_Label_RETURN_FROM_BUT][S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   T   T   _Retrieve][S S S T  N
_Push_1][T  S S T   _Subtract][T    T   S _Store][T T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][N
T   S S T   N
_If_0_jump_to_Label_YEAH][N
S N
N
_Jump_to_Label_LOOP][N
S S S T N
_Create_Label_YEAH][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S N
_Push_0_h][S S T    T   T   T   N
_Push_-7_a][S S T   T   T   N
_Push_-3_e][S S T   T   T   T   T   N
_Push_-15_Y][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    T   S T S S S N
_Push_104][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Litery S(spacja), T(tab) i N(nowa linia) dodane tylko jako wyróżnienia.
[..._some_action]dodano tylko jako wyjaśnienie.

Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).

Biała spacja zdecydowanie nie jest właściwym językiem dla tego wyzwania. W białej spacji zarówno pętle, jak i instrukcje if są tworzone za pomocą etykiet i skoków do etykiet, a ponieważ nie są to przypadki if-elseif-else, ale wiele przypadków if, oznacza to , że I będę musiał cofać się co każde, co czyni go dość długim , oznacza to, że będę musiał nieco zmodyfikować kontrole, aby pominąć niektóre odbitki (dzięki @JoKing ).

Objaśnienie w pseudo-kodzie:

Read STDIN as integer, and store it in the heap
Start LOOP:
  Integer i = retrieve integer from heap
  If(i is negative):
    Call function PRINT
  If(i modulo-3 is NOT 2):
    Jump to Label SKIP_NO
  Push "\noN" to the stack
  Label: SKIP_NO
  If(i modulo-2 is 0):
    Jump to Label SKIP_BUT
  Push "\ntuB" to the stack
  Label: SKIP_BUT
  i = i - 1
  Replace i in the heap with this updated value
  If(i modulo-3 is 0):
    Call function YEAH
  Go to next iteration of LOOP

function YEAH:
  Push "\nhaeY" to the stack
  Go to next iteration of LOOP

function PRINT:
  Print top of the stack as character to STDOUT
  Go to next iteration of LOOP (which will enter the if and then
                                comes back to this PRINT again)

Dodatkowe wyjaśnienie:

Ogólnie rzecz biorąc, pętla od wejścia w dół do 0, przesuwając nowy wiersz i słowo odwrócone (więc w kolejności „\ noN”, „\ ntuB”, „\ nhaeY” zamiast „Yeah \ n”, „Ale \ n ”,„ Nie \ n ”). A gdy wejście zapętli się do 0 i wszystkie znaki znajdą się na stosie, wydrukuje te znaki w odwrotnej kolejności (więc w prawidłowej kolejności wyjściowej).

Bardziej dogłębnie: chociaż musimy wydrukować słowa z zakresu (input, 0], zapętli się ono w zakresie [input, 0). Z tego powodu możemy użyć czeku if(i%3 == 2)dla „\ noN” (lub faktycznie if(i%3 != 2)pominąć wypychanie „\ noN”) i możemy użyć czeku if(i%2 != 1)dla „\ ntuB” (lub faktycznie if(i%2 == 0)pominąć naciśnięcie „\ ntuB” ). Dopiero po tych dwóch kontrolach zmniejszamy iterację io 1. Następnie wykonujemy if(i%3 == 0)czekanie, aby wypchnąć „\ nhaeY”, podobnie jak w przykładowym kodzie JS w opisie wyzwania. Pomijanie z czekami if-not zamiast przejścia do etykiety i powrót z etykiety z if-czekami zapisanymi 23 bajty.

Również w białych znakach wartości znaków są przechowywane na stosie jako ich wartości Unicode (tj. 10Dla nowych wierszy, 65dla „A”, 97dla „a” itd.). Ponieważ muszę już zapętlić stos, aby wydrukować znaki, mogę również użyć mojej białej końcówki, aby obniżyć liczbę bajtów, dodając stałą do wartości liczbowych, przed wydrukowaniem ich jako znaków.
Ta stała jest 104w tym przypadku generowana za pomocą tego programu Java , którego wcześniej użyłem również do gry w golfa w innej odpowiedzi Whitespace . To jest również powód, dla którego ta część kodu:

[S S T  T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N]

ma wartości -94dla nowej linii, 7dla „o” i -26dla „N”. Ponieważ dodanie stałą 104poprawnie dać nasze wartości Unicode 10, 111oraz 78dla tych znaków odpowiednio.

Kevin Cruijssen
źródło
1
Z pewnością nie spodziewałem się odpowiedzi na spację. Dobra robota!
maks.
@maxb Thanks! Niestety jest to nieco dłuższe niż oczekiwano ze względu na 8 etykiet, których wymaga. Ale już się cieszę, że działa. :)
Kevin Cruijssen
Czy nie można zmniejszyć o połowę etykiet, przechodząc do następnej instrukcji if, jeśli warunek jest fałszywy? np.if i modulo-3 != 1 jump to next if else push NO
Jo King
1
@JoKing Ach, czekaj, źle zrozumiałem część twojego pseudo-kodu. Mój pierwszy problem dotyczący niepodawania iprzed if(i is 0) call PRINTprawdą, ale twój drugi to sprawdzanie iprzed odjęciem i pomijanie wydruków. Właściwie całkiem sprytny. Będzie nadal go wdrażać.
Kevin Cruijssen
1
Cóż, jeśli przejdziesz do początku pętli, ponownie uruchomi instrukcję if i wróci do funkcji drukowania. Być może zaoszczędzi to bajt, jeśli zmienisz etykietę pętli na pustą
Jo King,
11

Perl 6 , 63 50 bajtów

{<<"Yeah But"No But Yeah"But No">>[^$_ X%6].words}

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i zwraca listę wierszy

Wyjaśnienie:

{                                                }   # Anonymous code block
 <<"Yeah But"No But Yeah"But No">>  # Create the list of strings:
                                     # Yeah But
                                     # No
                                     # But
                                     # Yeah
                                     # But No
                                  [       ]  # Index into this list
                                   ^$_  # The range from 0 to n-1
                                       X%6  # All modulo 6
                                           .words  # Convert the list to a string 
                                                   # Which joins by spaces
                                                   # And split by whitespace
Jo King
źródło
8

05AB1E (starsza wersja) , 27 25 24 bajtów

Zaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi .

F”¥æ€³€¸”#N3ÖNÈN3%‚‚˜Ï`»

Wypróbuj online!

Wyjaśnienie

F                          # for N in [0 ... input] do:
 ”¥æ€³€¸”#                 # push ['Yeah', 'But', 'No']
          N3Ö              # push N % 3 == 0
             NÈ            # push N % 2 == 0
               N3%         # push N % 3
                  ‚‚˜      # add the 3 numbers to a list
                     Ï     # keep only the strings whose corresponding value  
                           # in the int list is true (1)
                      `»   # push strings separately to stack and join stack on newlines
Emigna
źródło
Dang, pobiłeś mnie do tego ... Już miałem opublikować odpowiedź. Twój jest zresztą krótszy, więc +1 ode mnie. Przyjemne użycie ×, nie myślałem o tym!
Kevin Cruijssen
Wow, chętnie wyjaśnię to. Mój osobisty najlepszy wynik to 44 bajty w CJam.
maks.
@maxb: Oczywiście dodam wyjaśnienie. Po prostu sprawdzam, czy mogę najpierw
zagrać w
Możesz usunąć Θteraz, z którego już nie korzystasz ×, ponieważ Ïbędzie patrzeć tylko na 1s, więc ignoruje 2(i 0oczywiście).
Kevin Cruijssen
@KevinCruijssen: Dzięki! Nie jestem pewien, jak mi tego brakowało: P
Emigna
6

Python 2 , 97 95 92 90 83 81 bajtów

lambda n:[w for i in range(n)for w in'Yeah','But','No'if('N'in w)==i%(3-(w<'N'))]

Wypróbuj online!

-2 bajty, dzięki ovs


Python 3 , 92 90 85 83 bajtów

lambda n:[w for i in range(n)for w in['Yeah','But','No']if('N'in w)==i%(3-(w<'N'))]

Wypróbuj online!

-4 bajty, dzięki ovs

-4 bajty, dzięki Jo King

TFeld
źródło
86 bajtów , łącząc dwa i zwracając jako listę linii
Jo King
@JoKing Dzięki, nie wiedziałem, że mógłbym wrócić zamiast drukować, kiedy to napisałem.
TFeld
82 bajty : len(w)<3-> 'N'in w, 81 bajtów : len(w)%2->(w<'N')
ovs
6

Groovy (funkcja), 79 bajtów

Od czasu przesłania mojej odpowiedzi przejrzałem tutaj kilka historycznych dyskusji na temat tego, co stanowi odpowiednią odpowiedź. Ponieważ wydaje się powszechnie akceptowane dostarczanie tylko metody w Javie (w tym deklaracji typu i deklaracji parametrów), oto krótsza, Groovy, metoda, której odpowiedzią jest wartość zwracana przez metodę. Zastosowaniedef oznacza, że ​​wywodzi się typ zwrotu.

def a(int n){n?a(--n)+(n%3?'':'Yeah\n')+(n%2?'':'But\n')+(n%3==1?'No\n':''):''}

W przeciwieństwie do oryginalnej odpowiedzi poniżej, która zapętla się od 0 do n-1, ta wywołuje się od n do 1, ale zmniejsza wejście dla reszty linii w wywołaniu rekurencyjnym.

Wypróbuj online!

Groovy (program), 87 bajtów

Skrypty Groovy nie wymagają pewnych wspólnych importów, więc może to być program drukujący odpowiedź na STDOUT Javy bez konieczności System.out.wcześniejszego deklarowania print. Zapewnia także niektóre typowe metody narzędzi, takie jak ta, toLong()która pozwala nam rozsądnie i dokładnie analizować argument wejściowy.

Zasadniczo odpowiedź na Javę 10, ale wykorzystując krótszą składnię pętli Groovy i zdolność do oceny prawdziwych stwierdzeń.

args[0].toLong().times{print((it%3?'':'Yeah\n')+(it%2?'':'But\n')+(it%3==1?'No\n':''))}

Wypróbuj online!

archangel.mjj
źródło
Witamy w PPCG! Świetna pierwsza odpowiedź! Sam nie kodowałem Groovy, ale czy mogę zasugerować uruchomienie twojego kodu na TIO ? W ten sposób mogą być sprawdzane przez innych i cieszone przez wszystkich.
maks.
1
@maxb Thanks! Dodałem jeden :)
archangel.mjj
Ładna pierwsza odpowiedź, a także witamy w PPCG.
ElPedro,
5

Retina 0.8.2 , 45 bajtów

.+
$*
1
$`Yeah¶$`But¶$`11No¶
+`11B
B
111

A`1

Wypróbuj online! Wyjaśnienie:

.+
$*

Przekształć dane wejściowe w jednoargumentowe.

1
$`Yeah¶$`But¶$`11No¶

Dla każdej liczby całkowitej 0...n-1wygeneruj trzy wiersze tekstu, po jednym dla każdego słowa, każdy ze i 1znakiem s przed nim, z wyjątkiem No, który ma dwa dodatkowe 1s, aby obliczyć, (i+2)%3==0który jest równoważny i%3==1.

+`11B
B

Usuń pary 1s przed Bs.

111

Usuń 1s w grupach po trzy wszędzie.

A`1

Usuń wszystkie linie, które nadal mają 1.

Neil
źródło
Och, teraz, kiedy widzę, 11No¶jak obliczyć (i+2)%3==0(więc wszystkie trzy są sprawdzane, jeśli ==0), wygląda to tak oczywisto, ale sam bym o tym nie pomyślał, więc jest to naprawdę genialne. +1 ode mnie, fajna odpowiedź!
Kevin Cruijssen
5

Java 10, 100 99 bajtów

n->{for(int i=0;i<n;)System.out.print((i%3<1?"Yeah\n":"")+(i%2<1?"But\n":"")+(++i%3>1?"No\n":""));}

-1 bajt dzięki @ OlivierGrégoire .

Wypróbuj online.

Wyjaśnienie:

n->{                   // Method with integer parameter and no return-type
  for(int i=0;i<n;)    //  Loop `i` in the range [0, `n`)
    System.out.print(  //   Print to STDOUT:
      (i%3<1?          //    If `i` is divisible by 3:
        "Yeah\n"       //     Print "Yeah" with newline
      :"")+(i%2<1?     //    If `i` is even:
        "But\n"        //     Print "But" with newline
      :"")+(++i%3>1?   //    If `i` modulo-3 is 1:
        "No\n"         //     Print "No" with newline
      :                //    If none of the above three if's applied to the current `i`:
       ""));}          //     Print nothing for the current `i`
Kevin Cruijssen
źródło
1
++i%3>1prawdopodobnie uratuje ci bajt
Olivier Grégoire
@ OlivierGrégoire Ah, oczywiście. Dzięki!
Kevin Cruijssen
5

PowerShell, 75 74 72 67 66 bajtów

-1 bajt dzięki TessellatingHeckler

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

Skrypt testowy i objaśnienie:

$f = {

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

# 1. repeat the string $n times
# 2. split by space
# 3. get elements from 1 to $n
# some elements are multiline strings, some elements are $null:
# ($null,"Yeah`nBut","But","No","But","Yeah","But`nNo",$null,...)
# 4. remove $null elements from result array

}

# Output results
@(
    0,1,2,10
) | % {
    &$f $_
    "======"
}

# Advanced test
@(
    ,(0,'')
    ,(1,'Yeah But')
    ,(2,'Yeah But No')
    ,(3,'Yeah But No But')
    ,(4,'Yeah But No But Yeah')
    ,(5,'Yeah But No But Yeah But No')
    ,(6,'Yeah But No But Yeah But No')
    ,(7,'Yeah But No But Yeah But No Yeah But')
    ,(8,'Yeah But No But Yeah But No Yeah But No')
    ,(9,'Yeah But No But Yeah But No Yeah But No But')
    ,(10,'Yeah But No But Yeah But No Yeah But No But Yeah')
    ,(20,'Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No')
) | % {
    $n,$e = $_
    $r = &$f $n
    $r = $r-split"`n"       # simplify test string
    "$($e-eq$r): $n : $r"
}

Wynik:

======
Yeah
But
======
Yeah
But
No
======
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
======
True: 0 :
True: 1 : Yeah But
True: 2 : Yeah But No
True: 3 : Yeah But No But
True: 4 : Yeah But No But Yeah
True: 5 : Yeah But No But Yeah But No
True: 6 : Yeah But No But Yeah But No
True: 7 : Yeah But No But Yeah But No Yeah But
True: 8 : Yeah But No But Yeah But No Yeah But No
True: 9 : Yeah But No But Yeah But No Yeah But No But
True: 10 : Yeah But No But Yeah But No Yeah But No But Yeah
True: 20 : Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No

Prosty skrypt, 72 bajty:

$args|?{$_}|%{0..--$_|%{@('Yeah')[$_%3]
@('But')[$_%2]
@{1='No'}[$_%3]}}
mazzy
źródło
1
Świetna odpowiedź! Czy można by dodać odpowiedź do odpowiedzi, ponieważ nie zawiera ona tłumacza online?
maks.
Blok skryptowy odpowiedzi nie zwraca ======. Generuje Yeah,But,Notylko ciągi znaków. Skrypt testowy pokazuje separator dla łatwiejszego odczytu tylko wyników.
mazzy
To użycie hashtable jest sprytne. Będę musiał to pamiętać.
AdmBorkBork
1
@mazzy Mogę przeformułować twoje, ale wciąż nie mogę pokonać 67 (zastąp dwa \ n prawdziwymi nowymi liniami)(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
TessellatingHeckler
4

Haskell , 71 bajtów

f n=[1..n]>>=(3?1)"Yeah"<>(2?1)"But"<>(3?2)"No"
(a?b)c n=[c|n`mod`a==b]

Wypróbuj online!

Wyjaśnienie

Całkiem proste, zaoszczędzono dwa bajty, używając [1..n]zamiast [0..n-1]i dostosowano pozostałe: Operator(?) Testy przyjmują cztery argumenty, zwracając pustą listę lub podany ciąg znaków jako singleton, jeśli wynik jest poprawny.

Curryując czwarty argument (?), możemy skorzystać z (<>)konkatenacji wyników każdej funkcji, tj .:

(3?1)"Yeah" <> (2?1)"But" <> (3?2)"No"  \i-> (3?1)"Yeah" i ++ (2?1)"But" i ++ (3?2)"No" i
ბიმო
źródło
4

C # (interaktywny kompilator Visual C #) , 105 99 94 96 89 bajtów

i=>{for(int x=0;x<i;)Write((x%3<1?"Yeah\n":"")+(x%2<1?"But\n":"")+(x++%3==1?"No\n":""));}

Wypróbuj online!

auhmaan
źródło
4
Usunięcie interpolacji w ten sposób oszczędza 7 bajtów.
Emigna,
@Emigna Dzięki za wskazówkę, zmieniłem odpowiedź
auhmaan
1
x++%3==1?może być ++x%3>1?. Ktoś inny dał mi napiwek dla mojej odpowiedzi Java, ale to samo dotyczy twojej odpowiedzi w języku C #. :)
Kevin Cruijssen
4

Pip , 37 35 33 bajtów

"But 
Yeah
No
"<>5@:^[t2io02x]@<a

(Zwróć uwagę na spację po But.) Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!

Wyjaśnienie

To objaśnienie dotyczy poprzedniej wersji - dziennik zmian znajduje się poniżej

Zainspirowany odpowiedzią Jo Kinga na Perla 6 . Konstruujemy tę listę:

[
 "Yeah
 But
 ";
 "No
 ";
 "But
 ";
 "Yeah
 ";
 "But
 No
 ";
 ""
]

i wyślij pierwsze jego aelementy za pomocą cyklicznego indeksowania.

[t2io02x]R,3["But""Yeah""No"].n@<:a
                                     i is 0; o is 1; t is 10; x is ""; n is newline;
                                     a is 1st cmdline arg (implicit)
[       ]                            Construct this list of scalars:
 t                                    10
  2                                   2
   i                                  0
    o                                 1
     02                               02
       x                              <empty string>
         R                           Treating each of these as a string, we're going to
                                     replace:
          ,3                          0, 1, and 2 (respectively)
                                     with the corresponding values from this list:
            ["But""Yeah""No"].n       These strings, each with a newline appended
                                     We now have constructed the list shown above
                               @<:a  Take the first a elements from this list, with
                                     cyclical indexing (the : is for parsing reasons)
                                     Concatenate them together and print (implicit)

Aktualizacja: Zdałem sobie sprawę, że nie muszę używać zamieniać, aby zmienić 0/1/2 na ciągi - mogę użyć tych liczb, aby bezpośrednio zaindeksować listę. Aby to zrobić, musimy upewnić się, że liczby wielocyfrowe są podzielone na listy ich cyfr (w przeciwnym razie wybieramy indeks 10 zamiast indeksów 1 i 0). Na szczęście użycie arbitralnie zagnieżdżonej listy jako indeksu w Pipie działa zgodnie z oczekiwaniami, dając (zagnieżdżoną) listę wyników. Dla danych wejściowych 3 otrzymujemy postęp danych (gdzie _reprezentuje nowy wiersz):

"But _Yeah_No_"<>5                       ["But _"; "Yeah_"; "No_"]
                     [t2io02x]           [10; 2; 0; 1; 02; ""]
                              @<a        [10; 2; 0]
                    ^                    [[1; 0]; [2]; [0]]
                  @:                     [["Yeah_"; "But _"]; ["No_"]; ["But _"]]

Tak jak poprzednio, wynik końcowy jest łączony i drukowany automatycznie.

DLosc
źródło
4

Attache , 48 bajtów

Flat##{Mask[_%3'2'3=0'0'1,$Yeah'$But'$No]}=>Iota

Wypróbuj online!

Wyjaśnienie

Flat##{Mask[_%3'2'3=0'0'1,$Yeah'$But'$No]}=>Iota   input: an integer
      {                                  }=>Iota   over each number from 0 to that integer exclusive
       Mask[             ,$Yeah'$But'$No]          select values from that array according to:
            _%3'2'3                                    whether or not the input mod 3, 2, 3
                   =0'0'1                              is 0, 0, 1
Flat##                                             flatten the intermediate results
Conor O'Brien
źródło
4

C (gcc) , 77 71 74 72 69 bajtów

Jest już lepszy C odpowiedź , ale ta jest rekurencyjna i zajęło mi trochę czasu, aby wyprostować, więc publikuję.

Do 69 bajtów dzięki @ceilingcat i @JathanathanFrech

(Nigdy nie sądzę, aby używać n- ~ -i zamiast n-i + 1)

i;f(n){i=n&&n-i>=~n/6&&f(n,i++,puts(i%7%4?i%7%2?"But":"No":"Yeah"));}

Wypróbuj online!

cleblanc
źródło
@JonathanFrech Fajnie, ale nie działa na zero lub 5
cleblanc
@cleblanc Oh, przepraszam. Nie zdawałem sobie sprawy ... Przynajmniej usunięcie jzapisało ci dwa bajty.
Jonathan Frech,
1
70 bajtów - obejmujących jeden zapisany bajt @ ceilingcat.
Jonathan Frech,
1
n-~-ijest równoważne n-i+1- nie i<n+1- i tak naprawdę nie oszczędza żadnych bajtów ...
Jonathan Frech
3

Ruby, 69 lat 72 74 Bajty

->y{puts *(1..y).map{|i|[i%3==1&&:Yeah,i%2>0&&:But,i%3>1&&:No]-[!0]}}

Bardzo prosta odpowiedź, sprawdzająca teraz krótszą, rekurencyjną metodę.

Zaoszczędź dwa bajty dzięki @BWO :)

Zapisano kolejne trzy bajty, używając symboli zamiast ciągów

Håvard Nygård
źródło
3

Python 3, 93 bajty

[print("Yeah\n"*(i%3<1)+"But\n"*(i%2<1)+"No\n"*(i%3==1),end="")for i in range(int(input()))]

To nie jest najlepsze rozwiązanie, ale to moje zdanie.

Wypróbuj online!

Josh B.
źródło
1
Jeśli masz już wyrażenie, którego możesz użyć do zrozumienia listy, ale twoje rozumienie listy istnieje tylko w celu wywołania efektów ubocznych tego wyrażenia, zwykła pętla for wymaga mniej bajtów.
Jonathan Frech,
3

R, 65 bajtów

cat(c("yeah","but","no")[c(3,1:3,2,1,2)][1:scan()%%7+1],sep="\n")

Ze względu na fakt, że są replikowane nieco wadliwości programu (to zdobywa się co czwarty „ale” - należy przez to wykorzystali %4 == 1i %4 == 3zamiast %3warunkach), musimy użyć do niezręczną rozmowę ci pracę w bazie siedmiu. Mimo to jest krótszy niż LOLCODE ...

(Miałem nadzieję, że (3,1,2,3,2,1,2) lub podobna permutacja może pojawić się lhgdzieś w zestawie danych, ale tak nie wygląda)

JDL
źródło
3

sed -E ,179 150 bajtów

/^0/!s:$:g:
:l;y:abcdefg:bcdefga:
/[ae]/iYeah
/[bdf]/iBut
/[cg]/iNo
s:.$:-&:;:s;s:0-:-9:;ts;h
y:123456789:012345678:;G
s:.*(.)-.*\n(.*).-:\2\1:;tl;c\ 

Najtrudniejsza część nie polegała na zbudowaniu listy, ale na analizie liczby dziesiętnej.

2 bajty mogą zostać zapisane, jeśli nowa linia na końcu nie jest wymagana: c\ d.

Nadal wymaga optymalizacji.

Wypróbuj online .

Wyjaśnienie

/^0/!                            | if the input number doesn`t begin with a '0'…
     s:$:g:                      | …then append a 'g' to it and proceed
                                 |
:l;                              | loop label 'l':
   y:abcdefg:bcdefga:            | shift all occurences of [abcdef] 1 letter forward, and all 'g'-s to 'a'-s
                                 |
/[ae]/                           | if there`s an 'a' or 'e' in the input…
      iYeah                      | …output 'Yeah'
                                 |
/[bdf]/                          | if there`s a 'b' or 'd' or 'f' in the input…
       iBut                      | …output 'But'
                                 |
/[cg]/                           | if there`s a 'c' or 'g' in the input…
      iNo                        | …output 'No' 
                                 |
s:.$:-&:;                        | insert '-' before the last character
         :s;                     | loop label 's':
            s:0-:-9:;            | transform the next consecutive '0' in the end of the number to '9', if any
                     ts;         | loop to 's' if more consecutive zeroes are available
                        h        | copy the result to the temporary buffer
                                 |
y:123456789:012345678:;          | decrement all digits except '0' (N.B.: digits, not numbers)
                       G         | append the temporary buffer to the result
                                 |
s:.*(.)-.*\n(.*).-:\2\1:;        | cut and replace the digit left to the last consecutive 0 in the original
                                 | number pasted from the temporary buffer, then discard all other digits decremented
                         tl;     | …then loop to 'l' if the number is ≥0
                            c\   | insert a carriage return and exit
hidefromkgb
źródło
Czy możesz dodać jakieś wyjaśnienia?
user285259,
1
@ user285259 Gotowe.
hidefromkgb
2

Czysty , 116 bajtów

import StdEnv,Data.List
r=cycle
$n=[e\\_<-[1..n]&a<-r["Yeah","",""]&b<-r["But",""]&c<-r["","No",""],e<-[a,b,c]|e>""]

Wypróbuj online!

Obrzydliwe
źródło
2

F #, 108 106 bajtów

let v p=seq{for i=1 to p do
 if i%3=1 then yield"Yeah"
 if i%2=1 then yield"But"
 if i%3=2 then yield"No"}

Wypróbuj online!

-2 bajtów zmienia się od i=0 to p-1celu i=1 to pi dostosowanie modulos. Poza tym całkiem proste.

Ciaran_McCarthy
źródło
1
Dostaję jakiś błąd kompilacji łącza TIO, być może błąd składniowy w kodzie testowym?
maxb
Dziękuję za to. Moje oryginalne rozwiązanie wydrukowano bezpośrednio na konsoli, ale potem spróbowałem zwrócić sekwencję, która okazała się krótsza o około 2 bajty. Zmieniłem więc kod w TIO, ale zapomniałem zaktualizować stopkę - która wciąż oczekiwała, że vfunkcja wydrukuje wszystko.
Ciaran_McCarthy
2
Ogol 2 bajty za pomocą i=1 to p(i oczywiście dostosuj moduły). Zakresy wsteczne są puste. :)
Miły! Dodałem to. Dzięki! :)
Ciaran_McCarthy
2

PHP, 65 68 bajtów

while($i<$argn)echo["Yeah
"][$i%3],["But
"][$i%2],["No
"][~-$i++%3];

Uruchom jako potok z -nRlub spróbuj online .

Tytus
źródło
Wygląda dobrze, ale tworzy dodatkową linię na środku dla n = 10
maks.
@maxb Dzięki za podpowiedź. Mógłbym to naprawić za pomocą 9 dodatkowych bajtów; ale inne podejście jest krótsze.
Tytus
2

VBA (Excel), 105, 101, 99 bajtów

Edycja: -4 bajty z Keety! Dzięki!

Edytuj 2: -2 bajty z Chronocidal! Woot! (Zdałem sobie sprawę, że przypadki testowe działały tylko dla 10. Naprawiono teraz)

Tak, tym razem Excel pokonał VBA. Cokolwiek. (Idziemy po ciebie)

d=vbCr:For i=1To[a1]:a=i Mod 3:?IIf(a=1,"Yeah"+d,"")IIf(i/2=i\2,"","But"+d)IIf(a=2,"No"+d,"");:Next

^ Jest to wklejane do okna Natychmiastowe i generowane do okna debugowania

Bez golfa

d = vbCr
'For 1 to the value in A1 (using 0 gave extra values, and VBA skips the for loop if 0)
For i = 1 To [a1]    'aka: Range("A1").value
    a = i mod 3
    '? is the same as Print (Debug.Print when not in the Immediate Window)
    Print IIf(a = 1, "Yeah" + d, "") _ '<-- Just a line continuation
          'Keeta taught me that the \ operator is division with truncation,
          '     so if they are equal then there is no remainder!
          IIf(i / 2 = i \ 2, "", "But" + d) _
          IIf(a = 2, "No" + d, "");
    'Print usually prints a newline, but it still outputs if the string is blank...
    '   So we append a newline -if true- and use a semi-colon to kill the newline
Next
seadoggie01
źródło
@Keeta dobry pomysł, ale nie ... Jeśli spojrzysz na mój pierwszy kod, używam [a1], co oznacza Range / cell .value :) Powinienem był wyjaśnić, że to było wyjaśnienie, przepraszam: /
seadoggie01
1
Tak, widziałem to i próbowałem usunąć komentarz. Co powiesz na użycie i / 3 = i \ 3 zamiast i mod 3 = 0 (i to samo dla mod 2 = 0). Nie próbowałem tego, ale czy to zadziała?
Keeta
@Keeta Nigdy wcześniej nie widziałem operatora \ ... nie sądzę, jednak zwraca wartość dzielenia bez reszty ... tak jak myślę, że Mod
seadoggie01
Jeden to dzielenie liczb całkowitych, a drugi zmiennoprzecinkowy. 7/3 = 2,3333 gdzie 7 \ 3 = 2 (obcięcie podziału). 6/3 powinno wynosić 2, a 6 \ 3 powinno również wynosić 2, więc powinno działać, gdy reszta wynosi zero (tak myślę).
Keeta,
1
VBA automatycznie połączy dane wyjściowe funkcji, więc możesz upuścić &między nimi IIf(..)o dodatkowe 2 bajty
Chronocidal
2

Galaretka , 22 bajty

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ

Monadyczny link dający listę linii (co wydaje się być dozwolone w komentarzach)

Wypróbuj online! (stopka wywołuje łącze za pomocąÇi łączy się z użyciem nowego wiersza,Yponieważ niejawne drukowanie w galaretce rozbija wszystko, jeśli to możliwe)

W jaki sposób?

2×3=6

Teraz zauważ, że pierwsze sześć wartości to:

["Yeah", "But"]
["No"]
["But"]
["Yeah"]
["But", "No"]
[]

Tak więc wynikową listą wierszy powinny być te wartości powtórzone (lub obcięte) do długości npołączone razem.

Zauważ teraz, że zestawem mocy "Yeah", "But", "No"jest:

[]
["Yeah"]
["But"]
["No"]
["Yeah", "But"]
["Yeah", "No"]
["But", "No"]
["Yeah", "But", "No"]

Więc każdy okres to te 1-indeksowane wartości zestawu mocy "Yeah", "But", "No":

5, 4, 3, 2, 7, 1

Kod tworzy tę listę, formuje ją na długość n, indeksuje do zestawu mocy, a następnie usuwa wewnętrzne listy (co również usuwa puste ciągi, ponieważ ciągi są listami w Galaretce) ...

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ - Link: integer, n   e.g. 10
5                      - literal five            5
 R                     - range                   [1,2,3,4,5]
   7                   - literal seven           7
  ż                    - zip together            [[1,7],[2],[3],[4],[5]]
    F                  - flatten                 [1,7,2,3,4,5]
     Ṛ                 - reverse                 [5,4,3,2,7,1]
      ṁ                - mould like (n)          [5,4,3,2,7,1,5,4,3,2]
                    ¤  - nilad followed by link(s) as a nilad:
        “'⁴\ÆẓNƇ»      -   compressed string     "Yeah But No"
                 Ḳ     -   split at spaces       ["Yeah","But","No"]
                  ŒP   -   power-set             [[],["Yeah"],["But"],["No"],["Yeah","But"],["Yeah","No"],["But","No"],["Yeah","But","No"]]
       ị               - index into              [["Yeah","But"],["No"],["But"],["Yeah"],["But","No"],[],["Yeah","But"],["No"],["But"],["Yeah"]]
                     Ẏ - tighten                 ["Yeah","But","No","But","Yeah","But","No","Yeah","But","No","But","Yeah"]
Jonathan Allan
źródło
Wątpię, żeby stało się to krótsze niż to. Fantastyczna odpowiedź i świetne wyjaśnienie, dobrze zrobione!
maks.
2

Python 2 , 93 92 83 bajty

lambda i:''.join('Yeah\n'*(x%3<1)+'But\n'*(x%2<1)+'No\n'*(x%3==1)for x in range(i))

Wypróbuj online!

Oszczędność 9 bajtów dzięki @Jonathan Frech

ElPedro
źródło
Możesz użyć powtarzania łańcucha zamiast indeksowania krotek - ('','Yeah\n')[x%3<1]jest to równoważne z "Yeah\n"*(x%3<1).
Jonathan Frech,
@JonathanFrech - bardzo fajnie! Podobną technikę można zastosować również w innych przypadkach. Wielkie dzięki!
ElPedro,