Przestawialne kręgle kodu

14

Wyzwanie Bowling Code

Napisz program lub funkcję, która generuje to samo wyjście, bez względu na to, jak zmienisz kod źródłowy. (Wynik nie może być błędem)


Punktacja Pangram

  • Twój wynik to liczba unikalnych znaków w kodzie źródłowym.

    Program z kodem źródłowym AJBmiałby wynik 3
    A Program z kodem źródłowym AAJmiałby wynik 2
    A Program z kodem źródłowym 111miałby wynik1

  • To jest wariant . Program z najwyższym wynikiem wygrywa!

(Dla Twojej wygody utworzono tutaj automatyczne narzędzie oceniania )


Zasady Wyzwania

  1. Wejście
    Program / funkcja może pobierać dane wejściowe, ale jest to całkowicie opcjonalne.

  2. Dane wyjściowe Dane
    wyjściowe mogą być dowolne , ale powinny być inne niż zero, niepuste, niepuste i niepoprawne. (W związku z tym dane wyjściowe muszą mieć co najmniej 1 bajt)

  3. Przegrupowanie
    Bez względu na sposób zmiany kodu źródłowego, dane wyjściowe powinny być takie same.

    Przykład:
       Program: ABJwyjścia hello world, tak jak programy [ AJB, JAB, JBAitp]

To jest wariant . Program z największą liczbą znaków wygrywa!

Albert Renshaw
źródło
1
Bez konkretnego zadania, moim zdaniem, wyzwanie to jest zbyt szerokie.
Dennis
2
Co oznacza non-zero?
Dennis
2
Podczas gdy twoja ocena pangram jest próbą sprawienia, że ​​kręgle kodu działają, nie jestem pewien, czy te wyzwania powinny naprawdę być oznaczone kręgielnią kodu . Mechanizm oceniania różni się od tego, czym powinien być kręgielnia kodu, więc powiedziałbym, że albo użyj kodu-wyzwanie, albo stwórz nowy tag.
Martin Ender
1
Muszę się zgodzić z Martinem. Na przykład to wyzwanie nie jest golfem. Jak tylko zdobędziesz punkty oprócz całkowitej liczby znaków (lub bajtów), nie jest to już wyzwanie
Nathan Merrill
3
Czy program / funkcja musi się zakończyć? (np. czy mogę drukować 0wiecznie?)
MildlyMilquetoast

Odpowiedzi:

18

Lenguage, 1112,064 punktów, jeśli UTF-8

Mój program składa się z każdej możliwej postaci UTF-8. Drukuje „Witaj świecie” i zużywa 1,75 * 1076 yottabajtów przestrzeni.

(Aby wygenerować program, wystarczy utworzyć plik zawierający 17498005810995570277424757300680353162371620393379153004301136096632219477184361459647073663110750484 znaków, upewniając się, że w pliku znajduje się każdy możliwy znak UTF-8)

Nathan Merrill
źródło
2
Pan jest geniuszem. I czekaj, dlaczego mój komputer się psuje? : „P
HyperNeutrino
Myślałem, że Unicode ma 1114112 znaków?
MilkyWay90
14

Wiele języków, 2 punkty

0.

Produkuje 0.0jako 0.lub .0. Wymaga parsowania dowolnej liczby, która jest OK z kropką dziesiętną na początku lub na końcu, przyjmując 0 dla brakującej części całkowitej lub dziesiętnej. 0000000.dałby ten sam wynik.

Działa to również w następujących językach (w niektórych przypadkach z innym wyjściem, jak wskazano):

  • Python REPL
  • JavaScript REPL
  • MATLAB (produkuje ans = 0)
  • Oktawa (produkuje ans = 0)
  • MATL (produkuje 0)
  • CJam
  • Retina (produkuje 0)
  • Ułożone (produkuje 0)

Myślę, że w przypadku Pythona jest to jedyny sposób na uzyskanie wyniku powyżej 1, ponieważ możliwości można wyczerpać.

  • Każdy operator binarny lub jednoargumentowy zawiedzie jako ostatni znak
  • Każdy z nich [](){}wymaga dopasowania i zakończy się niepowodzeniem, jeśli ostatni będzie pierwszy
  • Tabulatory lub spacja nie mogą rozpoczynać linii. Newlines nie można używać w REPL.
  • Nie , może być pierwszą postacią
  • #Umieszczony pierwszy chciał komentować wszystko i nie produkują wyjście
  • Początek \jest niepoprawną kontynuacją linii
  • Backticks (Python 2) muszą być sparowane, a otaczanie ich niczym nie jest błędem
  • $, !, ?, I @nie może być używany bez innych znaków bezużytecznych

Pozostawia to litery, cyfry _, .oraz cytaty.

  • W przypadku cudzysłowów każdy ciąg poza nimi powoduje błąd.
  • Litery z możliwymi cyframi i _tworzą nazwy zmiennych, których pewna permutacja nie zawsze istnieje.

Liście cyfry i .. Dopuszczenie różnych cyfr daje inną liczbę, chyba że wszystkie cyfry są 0. Więc myślę, że zera i .to jedyny sposób na uzyskanie wyniku powyżej 1. Ale nie znam dobrze leksemu Python, więc mogłem coś przeoczyć.

xnor
źródło
11

CJam , ocena 15

T U
V	LMOQR[]0q

Wypróbuj online!

Zawsze drukuje 0000:

  • 0 popycha zero.
  • T, U, VSą zmienne, które są wstępnie inicjalizowane na zero.
  • L, M, O, Q, RSą zmiennymi, które są wstępnie inicjalizacja do pustej listy, więc nie pojawiają się na wyjściu.
  • [i ]mogą, ale nie muszą, owijać rzeczy w listę, ale nie muszą być one odpowiednio dopasowane, a wydruk i tak jest spłaszczony.
  • q odczytuje wejście, które jest puste i dlatego też nie pojawia się na wyjściu.
  • wysuw wiersza, spacja i tabulator są ignorowane przez analizator składni.
Martin Ender
źródło
To świetna odpowiedź dla języka takiego jak CJam! Nicea
Albert Renshaw,
Czy można dodać małe litery, rosiągając coś podobnego do małych q?
Albert Renshaw,
1
@AlbertRenshaw nie możesz mieć ich obu, ponieważ jeden z nich popełni błąd na EOF.
Martin Ender,
9

MATL , 3 5 6 punktów

Pomysł dodania białych znaków został zaczerpnięty z odpowiedzi Bijana .

lv
 T1

Kod lub dowolna jego permutacja generuje trzy oddzielone znakami nowej linii.

Wypróbuj online!

Wyjaśnienie

  • Funkcja ldomyślnie wypycha numer jeden na stos.
  • Dosłownie 1robi to samo.
  • Dosłowne Tnaciśnięcia true, które są wyświetlane jako numer jeden.
  • Spacja i znak nowej linii są separatorami, a tutaj nic nie rób.
  • vłączy dotychczas cały stos w wektor kolumnowy. Na przykład vpo następnie Tpołączy dwie pierwsze liczby w kolumnę (a następnie zostanie wypchnięta kolejna liczba). Inicjał vwytworzyłby pustą tablicę.

Na końcu kodu stos jest domyślnie wyświetlany z następującymi regułami:

  • Każdy element lub tablica na stosie jest wyświetlana w innym wierszu.
  • Wektory kolumnowe są wyświetlane z każdym elementem w innym wierszu.
  • Pusta tablica nie powoduje generowania danych wyjściowych.

Tak więc każda permutacja znaków wejściowych powoduje 1trzykrotnie w różnych wierszach.

Luis Mendo
źródło
Wyjaśnienie? Jestem ciekawy, jak to działa.
Towarzysz SparklePony,
@Sparkle Dodano wyjaśnienie
Luis Mendo
Ładny! Chciałem również zauważyć, że miałem ten tekst w wyzwaniu Removing any part of the source code however should cause that specific output to not be produced.w momencie, gdy pisałeś, nie chciałem go dodać i został usunięty. Być może pomoże Ci to zwiększyć wynik
Albert Renshaw
1
@AlbertRenshaw Dzięki za heads-up! Dwa kolejne punkty
Luis Mendo
Oskarżam cię o kradzież mojego pomysłu. To nie jest problem.
Bijan
6

Galaretka , zdobądź 53 101

¶ ¤$¥&+ABDFHNPQSUVX^_aborv|®²×ȧȯḄḅḌḞḢḤḷṀṂṚṛṠṢṪẠạị«»()kquƁƇƊƑƘⱮƝƤƬƲȤɓɗƒɦƙɱɲƥʠɼʂƭʋȥẸẈẒẎŻẹḥḳṇọụṿẉỵẓḋėġṅẏ

Używanie tylko znaków, które są częścią strony kodowej Jelly .

Galaretka ma niejawne dane wejściowe 0, a pierwsza połowa (do włącznie ạị«») powyższego ciągu kodu składa się głównie z atomów monadycznych (wielkie litery) i dyadycznych (małe litery i symbole), które po podaniu zera lub listy zawierającej tylko jedno zero ( lub dwa takie dane wejściowe w przypadku dyad) zwracają zero lub listę zawierającą tylko jedno zero.

Wyjątkami są:

  • Spacja: jest ignorowana (mimo że znajduje się na stronie kodowej).

  • Pilcrow oddziela linki (podobnie jak wiersz, ale tak naprawdę jest to ten sam bajt), ale żadne inne bajty i tak nie odwołują się do kodu przed nim.

  • skarabeusz ¤instruuje parser, aby traktował wszystko, co pozostało, zaczynając od niladu (lub stałej) jako stałą (i działa jako pierwszy atom).

  • Dollar, $poinstruuj parser, aby traktował dwa łącza do niego jako monadę (i, co nieco zaskakujące, działa jako pierwszy atom)

  • jen, ¥podobnie instruuje parser, aby traktował dwa łącza do jego pozostawione jak diadę.

  • Zalecane, ®początkowo przypomina wartość rejestru 0(jest to odpowiednik praw autorskich, ©psuje się, gdy zostanie użyty jako pierwszy atom, ponieważ jest on znaleziony na podstawie linku do jego lewej strony, który nie jest jeszcze ustawiony).

Kod z nawiasami, (a )i są obecnie niewykorzystane punkty kodowe, to wszyscy się analizowany i każdy powoduje nowego łańcucha (podobnie jak znak nowej linii, choć nie mają one wpływu tworzenia powiązań wywołalnych jak znak nowej linii, ale to nie jest problem, ponieważ nic nie próbuje tego zrobić).

Jonathan Allan
źródło
1
Możesz dodać wszystkie znaki poza stronę kodową za darmo, ponieważ interpreter upuści je przed przetworzeniem kodu. Nadal nie wiem, co znaczy non-zero.
Dennis
1
Myślę, że duch wyzwania polega na tym, że postacie powinny znajdować się na stronie. Zapytałem o wartość inną niż zero, a odpowiedzią było określenie minimalnego wyjścia 1-bajtowego.
Jonathan Allan
@Dennis ma pojęcie o poprawnej terminologii dotyczącej tego, co dzieje się podczas analizowania w nawiasach?
Jonathan Allan
Wszystkie nieużywane znaki rozpoczynają nowy link, podobnie jak nowy wiersz.
Dennis
1
Nazwijmy je niezdefiniowanym zachowaniem. : P
Dennis
4

TI-Basic (seria 83), 93 punkty (99 na TI-84 Plus)

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZθnπeiAnsrandgetKeyZXsclZYsclXsclYsclXminXmaxYminYmaxTminTmaxθminθmaxZXminZXmaxZYminZYmaxZθminZθmaxZTminZTmaxTblStartPlotStartZPlotStartnMaxZnMaxnMinZnMinΔTblTstepθstepZTstepZθstepΔXΔYXFactYFactTblInputNI%PVPMTFVP/YC/YPlotStepZPlotStepXresZXresTraceStep

Wszystkie cyfry, wszystkie zmienne jednego bajtów (w tym θ i n , niezależnych zmiennych dla polarnych i kolejno wykresy), stałe gatunku, e , i I , niektóre nie całkiem zmienne ( Ans, randi getKey) i 59 różni zmienne okna (wszystkie, które mają być zdefiniowane).

Implikowane mnożenie gwarantuje, że wynik wyniesie 0, gdy przyjmiemy to w dowolnej kolejności. Jeśli działa to na nowym kalkulatorze, wszystkie zmienne będą miały wartość 0; nawet jeśli nie, getKeywyniesie 0, ponieważ nie ma czasu na naciśnięcie klawisza, zanim program zwróci wartość.

Na TI-84 Plus lub wyższy, możemy dostać 6 więcej punktów dodając znaki getDate, getTime, startTmr, getDtFmt, getTmFmt, isClockOn. Rezultatem będzie teraz zawsze {0 0 0}ponieważ getDatei getTimezwraca listy o długości 3, a domniemane mnożenie rozkłada się na elementy.

Myślę, że są to wszystkie możliwe tokeny, których można użyć: wszelkie rzeczywiste polecenia to przedrostek, przyrostek lub postfiks (co oznacza, że ​​nie będą działać na początku lub na końcu programu), a wszelkie inne zmienne mogą być niezdefiniowane (i powodować błąd, gdy używany).

Misza Ławrow
źródło
To jest sprytne. Niezbyt imponująca haha, ale naprawdę sprytna! +1
Albert Renshaw
3

(niekonkurencyjny) Brainf-ck, 63 bajty

Nie wiem, czy uważa się to za oszustwo, ale ...

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

Kropka wypisuje bieżący znak (0x00), a reszta znaków nic nie robi. Technicznie można to rozszerzyć w nieskończoność, więc daj mi znać, jeśli uważa się to za oszustwo.

brianush1
źródło
Uważam, że to zero
Albert Renshaw,
Czy powinienem wtedy usunąć swoją odpowiedź, czy oznaczyć ją jako niekonkurującą?
brianush1
1
Istnieje 97 znaków do pisania, z których 7 nie można użyć (8-1), więc powiedziałbym, że 90.
Bijan
@ brianush1 możesz zostawić to jako niekonkurujące, aby inni mogli to zobaczyć. Przeredaguję pytanie dalej, aby wyjaśnić, że wynik musi wynosić co najmniej 1 bajt
Albert Renshaw,
15
@AlbertRenshaw (przepraszam za wszystkie te komentarze) Jeśli wynik musi wynosić 1 bajt, to znak NULL powinien się liczyć, ponieważ jest to bajt, chociaż o wartości 0.
brianush1
3

Haskell, 3 punkty

+ 1

Bez względu na to, jak przestawiony, ten kod zawsze zwraca funkcję zwiększającą wprowadzane wartości. Przykłady użycia w repl:

>(+ 1) 1
2
>(1+ ) 1  
2
>( +1) 1
2
Antisthenes
źródło
2

√ å ı ¥ ® Ï Ø ¿ , 128.234 (?) Punktów

Doszedłem do 128.234 z pomocą @DestructibleLemon. Ten program wykorzystuje wszystkie znaki Unicode (128,237) z wyjątkiem o, Oi ł. Co dziwne, dwa z nich to polecenia wyjściowe.

Z pewnością jednak żaden język nie mógłby używać wszystkich tych znaków, prawda? Cóż, ten język po prostu ignoruje polecenia, których nie rozpoznaje. Problem rozwiązany.

Ten język domyślnie wyświetli następujące informacje:

===== OUTPUT =====



==================

który jest niepuste, niepuste, niepuste i niepoprawne.

Uwaga: jeśli narusza to jakąś niepisaną regułę, powiadom mnie w komentarzach, a ja to zmienię. Jeśli znasz mój wynik (zakładając, że jest to dozwolone), opublikuj również w komentarzach.

Cairney Coheringaahing
źródło
Jakiego zestawu znaków używa? utf 8? utf-16? Czy używa całego Unicode?
Destructible Lemon
@DestructibleLemon Patrząc na stronę github, do kodowania wydaje się używać „CP-1252”.
brianush1
@DestructibleLemon Wszystkie komendy są w CP-1252 (Windows-1252), ale zaakceptuje każdy znak Unicode jako prawidłową składnię
caird coinheringaahing
Najwyraźniej istnieje 128 237 znaków Unicode, więc masz 128 234? en.wikipedia.org/wiki/Unicode#cite_note-24
Destructible Lemon
Według innych odpowiedzi najwyraźniej istnieje 1112,064 Unicode, więc nie jestem już do końca pewien
Destructible Lemon
1

J, 3 bajty

 1

Znaki 1, spacja i nowa linia zawsze będą drukować 1.

Bijan
źródło
1

/// , 1 2 punkty

\_

Wypróbuj online!

Nie mam pojęcia, jak to zrobić w innym języku kompletnym Turinga. Oczywiście jest HQ9, ale to po prostu oszustwo.

1 bajt dzięki @Martin Ender.

Towarzyszu SparklePony
źródło
powinny to być dwa punkty, a nie bajty
Destructible Lemon
@DestructibleLemon Przepraszamy, formatowanie TIO.
Towarzysz SparklePony,
1

Kropki , 1114111 znaków (jeśli używasz Unicode).

<87 dots here> Every Unicode character except NUL and . here

Wyjaśnienie:

1                                           leading binary number
1010                                        010 increments the value under the pointer
1010111                                     111 prints out chr(1)

Tak więc otrzymany ciąg binarny jest 1010111, który zamieniony na dziesiętny to 87, więc potrzebujemy 87 kropek.

Każdy inny znak jest komentarzem, dlatego używamy każdego znaku z wyjątkiem NUL, ponieważ Python3 przestaje wtedy czytać plik i kropki, ponieważ kropki nie są komentarzami.

MilkyWay90
źródło
0

Preludium , wynik 1.112.051

(Jeśli wziąć pod uwagę tylko ASCII do wydrukowania [\t\n -~], wynik to 84. Jeśli weźmiemy pod uwagę wszystkie punkty kodowe Unicode , wynik to 1 112 051. )

!
" #$    %&'+,-./0:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

(następnie dodaj [\u{7f}-\u{10ffff}]po nim wszystkie znaki ).

Zawsze drukuj 0.


Preludium jest językiem stosu równoległego, w którym stos jest wstępnie wypełniony nieskończoną liczbą zer.

  • +: Podaj dwie wartości (zawsze 0), dodaj je (0) i wciśnij, aby ułożyć w stos.
  • -: Podaj dwie wartości (zawsze 0), odejmij je (0) i wciśnij, aby ułożyć w stos.
  • #: Podaj wartość i odrzuć ją.
  • !: Wpisz wartość i wyślij ją jako liczbę (zawsze 0) (spec mówi „znak”, ale interpreter mówi „liczba”; w każdym przypadku drukowany jest bajt)
  • 0: Przesuwa 0.
  • ^, v, V: Popycha wartość górna poprzedni / następny programów równoległych ( „Głosy”), ale stosy wszystkich „głosy” są wypełnione 0, więc oni zawsze naciskać 0.
  • inne postacie: brak op.

Jest więc tylko 13 znaków, których musimy unikać:

  • (, ): Niesparowany nawias spowoduje błąd
  • 1- 9: Chcemy tylko wygenerować 0.
  • ?: Nie chcemy niczego wpisywać.
  • *: Powoduje bardzo skomplikowaną kontrolę spójności kodu przed i po linii składającej się z samotnego *. Musimy więc usunąć nową linię lub usunąć *. Implementacja referencyjna używa języka Python 2, .readline()co „nowy wiersz” może oznaczać \rlub \n. Lepiej więc po prostu usunąć *.
kennytm
źródło
0

Deadfish , wynik 86

o.ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghjklmnpqrtuvwxyz?!|[]_-();'"*&^$#@!1234567890+=<>,/\:

Jeśli jest to nielegalne, to też jest

o

(ocena 1)

snorepion
źródło