Programowanie logiczne Mode Golf


43

Twoim zadaniem jest wydrukowanie tekstu Good morning, Green orb!, przy czym każdy znak powtarza się w miejscu tyle razy, ile najczęściej występuje bajt w twoim źródle (tryb). Końcowy znak nowej linii jest dozwolony i nie trzeba go powtarzać.

Na przykład jeśli źródłem było

print p

Ponieważ ppojawia się dwa razy i co drugi bajt pojawia się raz, gdy trzeba będzie wydrukować

GGoooodd  mmoorrnniinngg,,  GGrreeeenn  oorrbb!!

Odpowiedzi zostaną ocenione według iloczynu liczby bajtów i liczby powtórzeń wyniku. Na przykład powyższy kod (jeśli zadziałał) uzyska 7 * 2 = 14 . Celem powinno być zminimalizowanie własnego wyniku.

Twój kod musi zawierać co najmniej 1 bajt.

Użyj tego programu, aby sprawdzić, czy kod i dane wyjściowe są zgodne


Funkcje są dozwolone, prawda?
całkowicie ludzki,

1
@totallyhuman Tak, o ile nie przyjmą danych wejściowych.
Wheat Wizard

1
Czy to nie powinno być oznaczone jako quine ?
FantaC

Poranka nie można dokapitalizować, prawda?
Magic Octopus Urn

@magicoctopusurn Nie, tekst powinien być taki sam.
Wheat Wizard

Odpowiedzi:


18

Brain-Flak , 384 * 106 366 * 100 = 36.600

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>(((({}<>()))))({}{}{}<>)<>{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

Wypróbuj online!

Wyjaśnienie

Pierwszą rzeczą, którą robię, jest pchanie sznurka

!bro neerG ,gninrom dooG

do stosu przy użyciu dość standardowych taktyk złożoności Kołmogorowa.

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>({}<>())

Następnie przesuwamy licznik do stosu off, aby powiedzieć nam, ile razy powielamy każdą postać. Jednak nie mogłem ustalić, co to był licznik, dopóki nie skończyłem pisać programu.

Następnie w górę jednocześnie odwracamy ciąg znaków i duplikujemy każdy znak w odpowiedniej liczbie razy. W szczególności licznik + 1.

{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

Te dwie części programu mają tryb 99 otwartych nawiasów. Ponieważ jednak z pewnością będziemy potrzebować co najmniej 1 nawiasu. Tutaj zauważyłem, że ostatni znak, który wypchnęliśmy, !ma kod 33, co oznacza, że ​​możemy go użyć do utworzenia 99, dokładnie takiej liczby, jakiej chcemy, używając tylko jednego dodatkowego nawiasu. To całkiem zbieg okoliczności, ale działa.


9
Ach tak, tylko dość standardowa taktyka złożoności złożona z Kołmogorowa. To jest to.
John Keates,

Ty, mój dobry człowieku, musisz być wściekły, aby nawet tego spróbować. Idę tylko do +1 i odejdę, zanim mój mózg eksploduje od próby zrozumienia wszystkich nawiasów.
caird coinheringaahing

15

Haskell , 37 bajtów × 3 = 111

-20 dzięki H.PWiz. -25 dzięki nim.

"Good m\111rning, Green orb!"<*[2..4]

Wypróbuj online!

Operatorzy Haskell FTW.

Samo przypomnienie, aby nigdy nie grać w golfa na telefonie komórkowym. Popełniam głupie błędy. Mogę zrzucić co najmniej połowę winy na telefony komórkowe. : P


5
Używanie <*do zapisywania bajtów (Uwaga: nie sprawdziłem poprawności)
H.PWiz

... Cholera jasna, Haskell prawie ma zbyt wielu operatorów. Dzięki!
całkowicie ludzki,

15

brainfuck , 235 x 77 = 18,095 punktów

Edycja: -2 bajty dzięki @Dennis

-[>--<-------]>-[>+++++>+>+>+>+++++>+>+>+>+>+++>+++++>-->+>+>+>+>+>+>+>+++++>+>+>+>+++[<]>-]>>----------->+++++>++>->+>-------->-------->+++++>>->++++++>------>+>---->+>+++++>++>>->--------->++>++>>-[>+<---]>--------<<[>>[-<+<.>>]<<,<]

Wypróbuj online!

Test TIO

Czekaj, to nie jest kręgle kodu? \ s

Tylko 8 użytecznych znaków sprawia, że ​​pieprzenie mózgu jest jednym z najgorszych języków, w którym można zadać to pytanie. Musiałem zacząć minimalizując która charakter nieuchronnie pojawiają się najczęściej, zwykle albo +albo -. Po napisaniu pierwszej iteracji kodu okazało się, że jest okropnie niezrównoważona na korzyść +s. Przestawiłem części kodu, takie jak generowanie większych liczb, aby użyć więcej -. Wreszcie, skończyło się na w równej ilości z dwóch znaków na 77 jeden mniej -niż +. Z pewnością można to jeszcze bardziej zmniejszyć, o czym jutro pójdę.

Ale hej, przynajmniej pokonałem odpowiedź Brainflak


Hej, gratulacje! Nie mogę uwierzyć, że to w ogóle możliwe, aby to zrobić w BF ... Dość, jeśli można to zrobić w ;#języku (͡ ° ͜ʖ ͡ °)
RedClover

13

Galaretka , 13 bajtów * 1 = 13

“¢Ȧ@XĊ'WÑṭḂ#»

Wypróbuj online!


3
Wreszcie ktoś zarządza nieuchwytną * 1 odpowiedzią. Miałem przeczucie, że Jelly będzie tym językiem ...
ETHproductions

@ETHproductions Haha, właśnie zmniejszyłem kod o połowę, zachowując * 1
Mr. Xcoder

Haha dang Właśnie to zauważyłem zaraz po tym, jak go edytowałeś
dylnan

Z ciekawości, jaka dokładnie jest różnica? W jaki sposób nowy skompresowany ciąg znaków ma połowę długości starego?
ETHproductions

@ETHproductions Zasadniczo najpierw użyłem nieoptymalnego skompresowanego ciągu, a potem zoptymalizowałem kompresor Jelly, który znalazł pasujące słowa w słowniku.
Pan Xcoder,

10

Alice , 49 bajtów * 2 = 98 144

/:G!4o3r8"1=5',0Grey9Z<@
\"b0=dnm 2'i%g<7R6~e.;o/

Wypróbuj online!

Wyjaśnienie

/...@
\.../

Jest to zwykła struktura dla programów liniowych, które działają całkowicie w trybie porządkowym. Po rozwinięciu zygzakowatego przepływu sterowania otrzymujemy:

"G04d3m821i5g,7G6ee9;<:b!=onr "'=%'<0Rr~y.Zo@

Podstawową ideą jest unikanie znaków, które powtarzają się więcej niż dwa razy za pomocą transliteracji. Transliteracja, którą będziemy wykonywać, jest następująca:

input: "G04d3m821i5g,7G6ee9;<:b!"
from:  "0123456789:;<"
to:    "onr "

Sposób transliteracji w Alicji polega na tym, że ciągi fromi tosą najpierw powtarzane do LCM ich długości, chociaż w tym przypadku wszystkie sprawy są długością fromciągu, więc otrzymujemy:

from:  "0123456789:;<"
to:    "onr onr onr o"

W ten sposób otrzymujemy cztery różne znaki do reprezentowania os, a trzy dla każdego n, ra przestrzeń. Możemy wygenerować fromciąg za pomocą rozszerzenia zakresu w następujący sposób:

'<   Push "<".
0    Append a zero.
R    Reverse.
r    Range expansion.

Jedynym problemem jest to, że teraz będziemy potrzebowali czterech "zarówno dla inputi na tosznurku. Aby tego uniknąć, umieściliśmy je w jednym ciągu i podzielimy na =używany jako separator.

"G04d3m821i5g,7G6ee9;<:b!=onr "
     Push the string containing both parts.
'=%  Split around "=".

Reszta to po prostu:

~   Swap "from" and "to".
y   Transliterate.
.Z  Duplicate and interleave. This duplicates each character.
o   Print.
@   Terminate the program.



5

C (gcc) , 68 × 3 = 204

0000000: 6a 3b 6d 61 69 6e 28 29 7b 77 68 69 6c 65 28 6a  j;main(){while(j
0000010: 3c 37 32 29 70 75 74 63 68 61 72 28 7e 22 b8 90  <72)putchar(~"..
0000020: 90 9b df 92 90 8d 91 96 91 98 d3 df b8 8d 9a 9a  ................
0000030: 91 df 5c 32 32 30 8d 9d de 22 5b 6a 2b 2b 2f 33  ..\220..."[j++/3
0000040: 5d 29 3b 7d                                      ]);}

Dzięki @MDXF za uratowanie 9 punktów i utorowanie drogi dla 6 kolejnych!

Wypróbuj online!

Alternatywna wersja, do wydruku ASCII, 69 × 3 = 207

j;main(k){while(j<72)putchar("Gnmg$hiuf`dl -I}ut|3{gt6"[k=j++/3]^k);}

Wypróbuj online!




5

Vim, 42 41 naciśnięć klawiszy × 3 = 123

iGod morning, Green orb!<Esc>2|qsyl2pl@sqX0@s

Wyjaśnienie:

  1. iGod morning, Green orb!<Esc>
    Napisz ciąg God morning, Green orb!( obrak jednego ).
  2. 2|
    Przejdź do pierwszego o.
  3. qsyl2pl@sq
    Utwórz makro rekurencyjne s. Jako efekt uboczny potrójny prąd o.
  4. X0
    Usuń jeden oi przeskocz na początek.
  5. @s
    Uruchom makro s, które powtórzy każdy znak dwukrotnie.

4

C, 78 × 4 = 312

*s=L" ÞÞÈ@ÚÞäÜÒÜÎX@äÊÊÜ@ÞäÄB";main(y){while(*++s)for(;y++%5;putchar(*s/2));}

Wypróbuj online!

356 332


Komentowanie, bo mam dość znajdowania go w historii przeglądarki za każdym razem, gdy chcę grać w golfa: wykorzystałem to do znalezienia liczby powtórzeń postaci.
MD XF,

I to do zakodowania łańcucha.
MD XF,

3

Japt , 24 bajty * 2 = 48

`Good ¶rÍÁ,
GÎ9 b!`m²·¸

Zawiera niedrukowalne. Przetestuj online!

Większość programu to tylko skompresowany ciąg, który dekompresuje się do

Good morning,
Green orb!

a następnie maps każdy znak, powtarzając to ²wice porządku, to było trochę odcinku . Spacja jest jedynym znakiem, który pojawia się 3 razy w skompresowanym ciągu; aby zapisać jedną instancję, zastępujemy ją nową linią, a następnie używamy·¸ do podziału na nowych linii i natychmiastowego łączenia w spacje. Dłuższy o 2 bajty, znacznie zmniejsza wynik (z 66 do 48).

Teraz, gdyby był na to krótki sposób bez użycia postaci dwa razy ...


Ponieważ tego nie widzę: która postać jest w źródle trzy razy? Widzę kilka rzeczy, które mają liczbę 2, ale nie 3.
Draco18s

1
@ Draco18s Brak, wynik to 24 * 2.
ETHprodukcje

W takim przypadku dane wyjściowe są nieprawidłowe. Każdy znak drukujesz 3 razy zamiast dwa razy.
Draco18s,

@ Draco18s Dangit, opublikował zły link ... Dziękujemy za zwrócenie na to uwagi.
ETHprodukcje

*salute*A teraz, kiedy patrzę na twoją odpowiedź, widzę, że ma ², a link miał ³ :)
Draco18s

3

SNOBOL4 (CSNOBOL4) , 97 bajtów * 10 = 970

	S ='Good Morning, Green orb!'
y	S	LEN(1) . y rem . s	:f(p)
	x	=x DUPL(y,10)	:(y)
p	OUTPUT	=x
END

Wypróbuj online!

tak ........ SNOBOL wymaga oddzielenia operatorów białymi spacjami, a wymagania dotyczące białych spacji są dość niezręczne. W kodzie jest 9 '\t'i 10 ' ', więc wszelkie ulepszenia będą wymagały dość znaczącej zmiany podejścia.


3

R , 65 bajtów * 5 = 325 59 bajtów * 5 = 295 62 bajtów * 4 = 248

cat(gsub('(.)',strrep('\\1',4),"Good Mo\x72ning, Green orb!"))

Wypróbuj online!

Istnieją 4 (or,')znaki.


2
Nigdy wcześniej nie widziałem strrep, to powinno się przydać.
BLT


3

Perl 5 , 59 × 2 = 118 punktów

$_="GSSdYmoVRing,YGVIen orb!";y<H-Z>[d-t ],s<.>[$&x2]eg;say

Wypróbuj online!

Perl 5 , 51 × 3 = 153156 zwrotnica

s""GOOd morning, Green orb!";y'O'o';s/./$&x3/eg;say

Wypróbuj online!

Perl 5 , 43 × 4 = 172 punkty

say"Good morning, Green orb!"=~s/./$&x4/egr

Wypróbuj online!

Zaoszczędź 2 bajty w każdym rozwiązaniu dzięki @Xcali (kilka zmian temu). Dla wszystkich optymalizacji spójrz na zmiany.


Utworzenie tego programu zamiast funkcji pozwoliłoby zaoszczędzić 2 bajty (4 punkty): Wypróbuj online!
Xcali,

@Xcali, ale twoja zmiana wymaga niestandardowej opcji -M5.010, która również się liczy
mik


2

V , 35 bajtów * 2 = 70

IG²od morning, GreeN ORb!5h3~Óˆ/°°

Wypróbuj online!

Hexdump:

00000000: 4947 b26f 6420 6d6f 726e 696e 672c 2047  IG.od morning, G
00000010: 7265 654e 204f 5262 211b 3568 337e d388  reeN ORb!.5h3~..
00000020: 2fb0 b0                                  /..


2

Python 2 , 62 * 4 = 248

Dzięki @ovs i @Giuseppe!

lambda:"".join(c*4for(c)in"G\x6f\x6fd mor\x6eing, Green orb!")

Wypróbuj online!

Python 2 , 51 * 6 = 306

print"".join(c*6for c in"Good morning, Green orb!")

Wypróbuj online!

Python 2 , 70 * 5 = 350

lambda:"".join(c*5for(c)in"Gxxd mxrning, Green xrb!".replace('x','o'))

Wypróbuj online!

Dzięki @Mr. Xcoder do zapisywania bajtu z obu wersji!


Możesz usunąć spację między 6i for.
Pan Xcoder,

@ Mr.Xcoder Thanks!
Steadybox


@ovs, co nie jest w porządku, myślę, że potrzebujesz dwóch \x6fs, które są nadal dobre dla 244
Giuseppe



2

CJam , 32 bajty × 2 = 64

"Gnmg$hiuf`dl -I}ut|3orb!"K,.^:_

Wypróbuj online!

Przesuwa ciąg, następnie XOR zapisuje pierwsze 20 znaków [0, 1, …, 19], a następnie powiela każdy znak.


2

05AB1E , wynik: 22 (22 bajtów * 1)

…‚¿•´,„ˆ¨èã).ªðý23£'!«

Wypróbuj online.

Wyjaśnienie:

UWAGA 1: Stos zawijania do wbudowanej listy) jest używany zamiast wbudowanej pary , ponieważ jest już częścią słowa słownika good.
UWAGA 2: dwa przecinki w kodzie i ,może wyglądać tak samo, ale mają różne znaki Unicode . Pierwszy jest zwykle używany dla wbudowanej pary , a drugi dla wbudowanego wydruku do STDOUT z końcowym znakiem nowej linii . W tym przypadku są one używane jako słowo słownikowe goodi oczekiwany przecinek na wyjściu.

…‚¿•´,        # 3-word dictionary string "good morning," (the comma counts as the third word)
„ˆ¨èã         # 2-word dictionary string "green orbit"
)             # Wrap everything on the stack into a list: ["good morning,","green orbit"]
            # Sentence capitalize all strings: ["Good morning,","Green orbit"]
   ðý         # Join by spaces: "Good morning, Green orbit"
     23£      # Only leave the first 23 characters: "Good morning, Green orb"
        '!«  '# Append a "!": "Good morning, Green orb!" (and output the result implicitly)

Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego …‚¿•´,jest "good morning,"i „ˆ¨èãjest "green orbit".


2

PowerShell , 46 bajtów * 4 = 184 punkty

"Good morning, Green orb!"-replace'.',('$0'*4)

Wypróbuj online!


1
To sprytne. Zupełnie zapomniałem$0
Veskah

: | czekaj, próbowałem tego, ale dopiero po wykonaniu formatu, więc nie działało tak dobrze, jak to
ASCII-

¯ \ _ (ツ) _ / ¯ co z łączem TIO?
mazzy


1

Galaretka , 31 bajtów × 2 = 62 punkty

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2

Wypróbuj online!

Wyjaśnienie

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2
“2ðƈZ(Øṡdȷ¿Ɱ’                     Base 250 number
              “God mrnig,eb!”     Unique characters of "Good morning..."
             ṃ                    Convert the base 250 number in base 13 then index into the string "God mr..."
                             x2   Repeat each character twice because “ occurs twice in the source (and now 2)

1

JavaScript (ES6), 61 bajtów * 3 = 183

_=>'Good morning, Gr\145en \x6f\x72b!'.replace(/./g,"$&$&$&")

JavaScript (ES6), 51 bajtów * 4 = 204

_=>'Good morning, Green orb!'.replace(/./g,'$&$&$&$&')

Odpowiedź sugerowana przez @ETHproductions .

JavaScript (ES6), 73 bajty * 4 = 292

_=>`G00d mo1ning, G244n orb!`.replace(/./g,_=>(('o'+!0)[_]||_).repeat(4))

JavaScript (ES6), 58 bajtów * 6 = 348

_=>'Good morning, Green orb!'.replace(/./g,_=>_.repeat(6))


Ewentualnie zmień _=>_na'$&'
ETHproductions

1
Alternatywnie, myślę, że możesz zrobić po prostu '$&$&$&$&$&$&'zamianę, co, jak sądzę, pozwala usunąć dwa wystąpienia i przejść do powiązania kilku postaci na 4, drastycznie zmniejszając wynik ...
ETHproductions

@ETHproductions Dzięki, nie wiedziałem o tym wzorze zastępczym!
darrylyeo


1

Rubinowy, 55x4 = 220 punktów

"Good morning, Green orb!".split(//).each{|x|print x*4}

Jestem dość zirytowany, że użycie each_char powoduje, że liczba r's 5 ..


1

Pushy , 36 * 2 = 72

`GXVWOP^4W_[afdc\hiB`N$29+L-''.

Wypróbuj online!

Główną zasadą tej odpowiedzi jest to, że każdy znak njest przechowywany tak n + index - 29, aby uniknąć powtórzenia w oryginalnym ciągu. To odwzorowanie utworzyło łańcuch w backticks. Reszta programu po prostu dekoduje to i wypisuje każdy znak dwukrotnie:

` ... `              \ Push the encoded string
       N             \ Remove printing delimiter
        $            \ While there are items left on stack:
         29+         \   Add 29 to top of stack
            L-       \   Subtract current length from top of stack
              ''.    \   Print twice, then pop

Użyte bajty dwukrotnie: `'W

Dziennik zmian

  • Długość w golfa od 41 do 38, zmieniając metodę dekodowania.
  • Długość w golfa od 38 do 37, odejmując 29 od każdego zakodowanego znaku, aby zapobiec znakom wielobajtowym.
  • Długość w golfa od 37 do 36 za pomocą niejawnej „pętli końcowej”
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.