Najkrótszy program, którego połączony program + wyjście to permutacja 95 drukowanych znaków ASCII

12

Napisz program, który jest tak krótki, jak to możliwe (mierzone liczbą bajtów), nie przyjmuje danych wejściowych, nie zawiera komentarzy i wyświetla ciąg znaków / sekwencję, tak że łączony program + wynik ma dokładnie 95 znaków długości i zawiera każdy znak ASCII do wydrukowania dokładnie raz , tzn. wyjście + program to permutacja 95 znaków z kodami ASCII 32-126:

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

W przypadku remisu zwycięzcą jest pozycja, której (95-znakowy) program połączony + wynik jest najbliższy powyższemu ciągowi, mierząc odległość edycyjną Levenshteina (tj. Liczbę usunięć, wstawień lub podstawienia wymagane do uporządkowania go w kolejności ASCII).

res
źródło
2
Czy to oznacza, że ​​jeśli np. Program zawiera powtarzające się znaki, jest automatycznie dyskwalifikowany? To szorstkie.
breadbox
1
Możesz także zdecydować, czy stary echo $0jest zdyskwalifikowany.
Peter Taylor,
3
Czy znaki są poza zakresem drukowanych znaków ascii (i ewentualnie ich duplikatami)? A może program + wynik musi zawierać dokładnie jeden znak do wydrukowania i nic więcej ?
primo
1
@primo Zakładam, że są dozwolone. Myślę, że nadszedł czas, aby napisać rozwiązanie „shift-and-eval”, które wykorzystuje duplikaty (choć dosłowność łańcuchów będzie trudna do zdobycia)
John Dvorak

Odpowiedzi:

12

GolfScript, 14 znaków

{`),32>46-^}.~

Wyjście :

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|
Howard
źródło
Wyzwanie (przynajmniej tak dalece, jak rozumiem) polegało na napisaniu programu, którego program i dane wyjściowe są permutacją 95 drukowalnych znaków ASCII, a nie napisania możliwie najkrótszego programu, który wyświetla 95 drukowalnych znaków ASCII.
Frank Schmitt,
Przepraszam, mój błąd. W tytule czyta „program + wyjście”, podczas gdy w pytaniu czyta połączony program + wyjście.
Frank Schmitt,
),- łał. Uwielbiam to.
John Dvorak,
1
@JDDorbak codegolf.SE: jedyne miejsce, w którym ludzie ekscytują się zbliżeniem i przecinkiem. : P
Klamka
@Doorknob w golfscript oznacza „prawych nieświadomości (rparen) i zrób tablicę tego rozmiaru (przecinek)”. W efekcie masz ciąg skracany o jeden znak (prawy kędzierzawy) i tablicę kończącą się tuż poniżej pozycji ASCII tego znaku (w |). Przycinaj znaki niedrukowalne, kropkę i xor (tutaj różnica zestawów symetrycznych) za pomocą kodu źródłowego (brane jest odejmowanie) bez prawidłowego kręcenia i gotowe. I tak, tablica xor ciąg jest ciągiem.
John Dvorak,
6

Perl, 89 znaków

To najlepsze, co udało mi się do tej pory zrobić:

q< !"#%&'()+/8:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghjklmosuvwxz|>;
print~-$=.73*2,y[]{}

Dla tych, którzy nie znają Perla minutae, dwa argumenty printinstrukcji mogą być renderowane jako ~(-($=)) . (73 * 2)i tr///.

Program wyświetla 6 znaków:

591460

Niestety każda pojedyncza iteracja konstrukt, że mogę myśleć w Perlu ( for, while, until, map, grep) akcji co najmniej jeden znak z print. Jeśli pozwolono na pojawienie się znaków nowej linii, mógłbym użyć Perla 5.010, aby uzyskać 87-znakowe rozwiązanie:

q{ !"#%&'*,-./0:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`bcdfgjkmnoprtuvxz|~}while($_+=say)<9
chlebak
źródło
Zobaczmy, czy mogę wydrukować większą liczbę :-)
John Dvorak,
uh ... możesz przetłumaczyć dla mnie drugą linię?
John Dvorak,
1
@JanDvorak $=to liczba poziomych linii w bieżącym urządzeniu wyjściowym. Domyślnie 60. ~-$=jest bitową inwersją ujemnego dopełniacza dwóch równą 60, co się zdarza 59. 73*2to 146. .i ,rób to, czego się od nich oczekuje. y[]{}to inny sposób na powiedzenie tr///, którym jest operator transliteracji. Potrzeba $_i nic nie robi, ponieważ nie dałeś jej żadnych znaków do zastąpienia. Zwraca liczbę zastąpionych znaków, czyli 0. Mamy więc ~-$= . 73*2 , y[]{}= 59 . 146 , 0= „591460”.
Dan.
6

PHP 67 bajtów

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

Wynik:

-|"/@>& *+}:[!],'~(){.\`7#%$

Wygląda na to, że powinno istnieć rozwiązanie 65-bajtowe, generujące 30 znaków zamiast tylko 28, ale nie udało mi się wyrównać. OSXouzZamiast tego 6 nieużywanych znaków zostało przyczepionych do jednego z literałów łańcucha.

Edycja: Po dalszej refleksji nie jest możliwe wygenerowanie więcej niż 28 znaków w ten sposób. UPPER ^ lowerbędzie zawsze skutkować znakiem między 32 a 63, więc wszystkie 10 cyfr jest wymagane @[\]_`{|}~. Cztery pozostałe 22 są używane w samym skrypcie, pozostawiając tylko 18, które można uzyskać za pomocą samych liter. Jednak remis można znacznie poprawić.

primo
źródło
Ach, jasne, bez słów. Jak mogłem zapomnieć?
John Dvorak,
3

Ruby, 91 znaków

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcefghijklmnqvwxyz|~};puts(?@‌​.ord*98+1)

Wyjścia 6273.

%{...} sztuczka skradziona Janowi Dvorakowi

Klamka
źródło
Bez komentarza. Jak jasno stwierdzono.
Johannes Kuhn
@JohannesKuhn Ah, nie zauważyłem tego. edytowane.
Klamka
%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts([email protected]*98+1)to, co myślę, że chcesz (dla 91 znaków) z przesuniętym średnikiem, który ma być używany jako separator do wydruku (zamiast nowego wiersza), a litery „ord” są usuwane z nawiasów klamrowych.
res
@res Tak, trudno jest zarządzać wszystkimi tymi literami: P
Klamka
Teraz \ jest dołączony trzy razy.
Howard
3

Perl, 61 znaków

print$:x8^CJIBQTOWAEULHVGFNMKRPZY,q<#"/;*g~?|={.>&+u15m97ws26

Wynik:

c@db[yo]le_ah\jfD`kX}zS-! %)('v304

$:domyślnie to " \n-". x8powtarza to osiem razy; wynik 24 znaków jest następnie bitowo xoredowany 23-znakowym gołym łańcuchem (ostatni -pozostaje niezmieniony ). Druga część to 12-znakowy ciąg q bitowo i 10-znakowy łańcuch (ostatnie 2 znaki są odrzucane).

Ponury
źródło
1
Długość twojego programu wynosi 61 znaków.
res
Dzięki. Mój edytor tekstu zgłosił 62 znaki z powodu EOF.
Grimmy,
1

Ruby, 95 znaków, 6 edycji

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

Tak. Otóż ​​to. Po prostu swobodny ciąg literału, który nigdy nie jest drukowany. Ruby obsługuje literały łańcuchowe (jak sądzę, zapożyczone z Perla) w postaci separatora typu procentowego - separator jest dowolnym znakiem niealfanumerycznym, a jeśli separator otwierający jest nawiasiem otwierającym (dowolnym z [({<), separator zamykający odpowiada klamra zamykająca (dozwolone są klamry zagnieżdżone).

Zdaję sobie sprawę, że jest to bardziej podstawowe przesłanie, ale chyba że komuś uda się coś wydrukować lub jeśli nie będzie języka z dwuznakowym dosłownym ciągiem literalnym z innym otwierającym i zamykającym ogranicznikiem, jest to najlepszy z dostępnych.

John Dvorak
źródło
0

Tcl 96, edycja odległości 12

if 0    {!"#$%&'()*+,-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeghjklmnopqrstuvwxyz|~}
Johannes Kuhn
źródło
Obawiam się, że jedna ze spacji powinna być zakładką
John Dvorak,
czy można drukować tabulatory lub spacje?
Johannes Kuhn,
tab jest drukowalny (ASCII 9), ale spacja jest drukowalna (ASCII 32).
John Dvorak,
1
[Właśnie zobaczyłem, że OP wyjaśnił to dopiero po odpowiedzi :)]
trzęsienie ziemi
1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} wydaje się działać przy użyciu 95 znaków? (Dziękuję za wpis. Przepraszam za kameleona - niestety redagowałem w pośpiechu i powinienem był zrobić inaczej).
res