triplegolf - liczy się nie tylko długość kodu źródłowego!

15

Celem tego wyzwania jest napisanie programu, w którym długość następujących trzech jest dokładnie taka sama:

  • długość kodu źródłowego
  • długość wydruku, który drukuje na standardowe wyjście
  • długość ostrzeżeń kompilatora generowanych za pomocą (niemodyfikowanego) kompilatora wybranego przez użytkownika

Zwycięzca jest najkrótszym kodem, który spełnia wszystkie trzy kryteria, i musi mieć co najmniej 1 znak.

Aby urozmaicić sytuację, jeśli wynik ma mniej niż trzy różne postacie, dodaje 5 punktów kary do długości każdego z nich (więc +10, jeśli tylko jeden typ, +5 dla dwóch).

(Nowe linie liczą się jako 1 lub 2 znaki, twój wybór, ale musi być spójny we wszystkich trzech kryteriach. Wiodące i końcowe białe spacje są ignorowane we wszystkich liniach we wszystkich trzech kryteriach)

W przypadku równego wyniku wygrywa ten, który wydrukuje najciekawszy wynik (zamiast śmieci).

vsz
źródło
1
Co to jest „typ postaci”?
Peter Taylor
5
Co również, jeśli kompilator generuje niepostrzeżone dane wyjściowe (np. „Kompilowanie główne”)? Co również, jeśli nazwa pliku źródłowego pojawia się w komunikatach ostrzegawczych (np. „Foo.c: 1: 1: ...”)?
Joey Adams
3
Moją wybraną bronią jest VBA, który tak naprawdę nie ma kompilatora i nie generuje pliku binarnego do uruchomienia (tak jak w przypadku niektórych innych języków). Czy istnieją ku temu względy, czy też jestem po prostu domyślnie zdyskwalifikowany?
Gaffi
2
Zastanawiam się, czy potrójny quine jest możliwy w jakimś języku?
Ry-
2
W przypadku języków interpretowanych otrzymujemy dane wyjściowe nawet w przypadku wystąpienia błędu, w takim przypadku, czy błędy te są akceptowane, czy tylko ostrzeżenia są akceptowane?
l0n3sh4rk

Odpowiedzi:

14

Bash, 23 znaki

Błąd:

bash: /: Is a directory

Źródło:

echo       $0-$01234;/;

Wynik:

/bin/bash-/bin/bash1234


Brainf * ck, 32 znaki

Ten kod jest wykonywany przez około 3 sekundy, zatrzymuje się i wyświetla następujący błąd i dane wyjściowe.

Błąd:

bff: out of memory (-2058691272)

Źródło:

+++++[......-]..+[>>>>>>>>>>>>-]

Wyjście: (Hexdump)

0505 0505 0505 0404 0404 0404 0303 0303
0303 0202 0202 0202 0101 0101 0101 0000


C, 35 znaków

Ostrzeżenie:

b.c:1:30: warning: division by zero

Źródło i wyjście:

main(){system("cat "__FILE__)/0;;;}


PHP, 50 znaków

Ostrzeżenie:

PHP Warning:  Division by zero in /tmp/3 on line 1

Źródło i wyjście:

<?php echo (0/0).''.file_get_contents(__FILE__);?>
l0n3sh4rk
źródło
1
Przykład bash jest błędem, a nie ostrzeżeniem.
Peter Taylor
Jakiego kompilatora używasz do rozwiązania C?
Chlebowiec
@breadbox gcc wersja 4.7.0 20120505 (wersja wstępna) (GCC)
l0n3sh4rk
8

C - 48 znaków

main(i){while(++i<49)putchar(i);putchar('\z');}

Uwaga: zawiera ostatnią linię (w stylu uniksowym).

Dane wyjściowe z gcc a.codczytów:

a.c:1:41: warning: unknown escape sequence '\z'

Dane wyjściowe a.outto w większości znaki niedrukowalne, więc oto, jak to wygląda po przepuszczeniu przez zrzut heksowy:

00000000: 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011  ................
00000010: 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021  .............. !
00000020: 2223 2425 2627 2829 2A2B 2C2D 2E2F 307A  "#$%&'()*+,-./0z
chlebak
źródło
Rozumiem, że niedrukowalne (białe znaki?) Są obcinane, więc to się nie liczy. Jeśli to zadziała, mogę poprawić własną odpowiedź.
Gaffi
1
Znaki kontrolne zwykle nie są uważane za białe znaki, z wyjątkiem oczywiście \ t, \ n, \ r, \ f, a czasem \ v. Żaden z nich nie znajduje się w pozycji wiodącej ani tylnej, więc pomyślałem, że jestem bezpieczny.
Chlebowiec
1
Myślę, że jest to całkowicie do przyjęcia. Nie są to spacje, w obu przypadkach ACM nie jest tak rygorystyczny w stosunku do wymagań. Głównym powodem tej „reguły białych znaków” było to, że niektóre środowiska IDE mogą mocno sformatować dane wyjściowe kompilatora.
vsz
1
@copy, Lub main(i){i='\z';while(i-->74)putchar(i);}- ale zmniejszenie rozmiaru programu w rzeczywistości przynosi efekt przeciwny do zamierzonego.
Chlebowiec
1
To moja ulubiona odpowiedź, wiem, że powinienem był zabronić dostępu do zawartości pliku (tak jak robią to prawdziwe quines)
vsz
5

JavaScript, 63 66

!function x(){console.log(x+'...');eval(Array(33).join('$'))}()

Dane wyjściowe to:

function x(){console.log(x+'...');eval(Array(33).join('$'))}...

W Chrome błąd jest następujący:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined
Ry-
źródło
3

Visual Basic .NET, 185

Ojej, vbcjest dość gadatliwy dzięki swoim ostrzeżeniom dotyczącym kompilacji. W każdym razie kod jest następujący:

Public Module Main
    Public Sub Main()
        Console.WriteLine(New String("a"c,185))
    End Sub

    Public Function A()
        'This is actually just padding.
        'Hi
    End Function
End Module

(Pamiętaj, że powinny to być tabulatory, a nie spacje).

Dane wyjściowe są następujące:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Ostrzeżenie kompilatora jest następujące:

warning BC42105: Function 'A' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

    End Function
    ~~~~~~~~~~~~

(Tym razem są to właściwie cztery spacje, a nie tabulatory).

Ry-
źródło
3

Zsh , 20 bajtów

<<<   $-$_$_$_$_$_
[

Problem, przed którym stoimy, jest wspomniany w komentarzu powyżej: Zsh drukuje nazwę programu oprócz numeru linii przed każdym błędem. Tutaj rozwiązanie wykorzystuje jednoznakową nazwę pliku do nadużywania tego. Założyłem go w skrypcie pomocniczym, aby pokazać dokładnie to, co drukuje, i użyłem go wc -cna stderr, stdout i pliku źródłowym.

Dane wyjściowe: 569Xcatcatcatcatcatnastępnie nowy wiersz
Błędy: s:[:2: ']' expectednastępnie nowy wiersz


EDYCJA: Alternatywne 20-bajtowe rozwiązanie bez ograniczeń plików:

<<<$-$-$-$-$_>&1 >&2

Wypróbuj online!

Zsh , zsh -x, 10 bajtów

<<<$_$_$_

-xFlaga włącza xtrace. To znowu wymaga jednoznakowej nazwy pliku. Wypróbuj online!

Zsh zsh -JNTwEDY , 12 bajtów

<<<$->&1 >&2

Najkrótsza -flagodpowiedź bez wymagania nazwy pliku. Ustawia więcej flag i $-drukuje je wszystkie. Wypróbuj online!

Funkcja Gamma
źródło
2

JavaScript (Firefox 54), 34 bajty

alert((f=function(x)1234)(56)+f+f)

Wyjścia:

1234function(x)1234function(x)1234

I wysyła to ostrzeżenie do konsoli przeglądarki:

expression closures are deprecated

To wygląda jak ten w moim kopii Firefox Developer Edition (54.0a2). Może działać również w innych wersjach Firefoksa.

ETHprodukcje
źródło
2

Ruby, 48 znaków

IO=1;puts ?a*48;# let's make it 48 bytes long :)

Wyjścia

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Ostrzega

r.rb:1: warning: already initialized constant IO

(plik to r.rb, usunąłem ścieżkę, jeśli uruchomisz go z irb, otrzymasz (irb): 1: ostrzeżenie ...)

W Ruby istnieje metoda warn, ale przekazuje ona swoje argumenty do $ stderr, dzięki czemu wygląda mniej jak ostrzeżenie.

Redouane Red
źródło
1

Python, 57 bajtów

Inni tłumacze mogą wyświetlać ostrzeżenie inaczej. Zostało to przetestowane tylko do pracy na TIO.

from warnings import*
print("prt"*19)
warn("Warning...!")

Wypróbuj online

Wynik

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

Ostrzeżenie

.code.tio:3: UserWarning: Warning...!
  warn("Warning...!")

Zauważ, że początkowe spacje nie są liczone do liczby bajtów. Jeśli wiodące spacje nie zostaną zignorowane, można to zrobić w 51 bajtach.

mbomb007
źródło
1

JavaScript (ES6), 32 30 bajtów

Screen(console.log(Function));

odciski

ƒ Function() { [native code] }

w Chrome, a następnie rzuca

TypeError: Illegal constructor

Moje oryginalne 32-bajtowe rozwiązanie:

(x=y=>console.log(x+!0+10)||z)()

po pierwsze, drukuje

y=>console.log(x+!0+10)||ztrue10

I rzuca błąd

ReferenceError: z is not defined
vrugtehagel
źródło
0

VBA, 39 bajtów

Nie jestem pewien, czy to się kwalifikuje, biorąc pod uwagę ograniczenie kompilatora, ale:

Dane wejściowe: (w bezpośrednim oknie)

For i=1 To 39:a=a & Chr(i):Next:Print a

* Dane wyjściowe obejmują znaki niedrukowalne, które nie odtwarzają się dobrze w tym oknie.

Gaffi
źródło
VBA nie daje żadnych ostrzeżeń kompilatora, więc nie sądzę, żeby to się liczyło
Taylor Scott
0

Perl 6 , 10 bajtów

dd say 1e9

Wypróbuj online!

Drukuje 1000000000do STDOUT i Bool::Truedo STDERR. Oba tworzą końcowy znak nowej linii, ale końcowe wyzwanie jest ignorowane w tym wyzwaniu. ddjest funkcją debugowania specyficzną dla Rakudo

Jo King
źródło