Zwykle mówi się, że „Doing X bez Y” może być pułapką dla początkujących pisarzy ( źródło ). Jestem jednak pewny siebie i myślę, że zdecydowanie mogę zrobić X bez żadnego Y. Losowo O tak, będzie dobrze.
Wyzwanie: Biorąc pod uwagę nieparzystą liczbę całkowitą n
większą lub równą 1, wypisz ex o długości boku n
wykonanej z losowo drukowanych znaków ascii bez „y” i „Y” oraz spacji. Wszystkie dozwolone postacie muszą mieć niezerową szansę wystąpienia, ale niekoniecznie jednolite. Jest to golfowy kod, więc wygrywa najkrótszy kod w bajtach. Powinieneś jednak randomizować każdy znak - to znaczy rozpórki ex nie powinny być równe, chyba że przypadkiem.
Pojawiają się znaki
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Konstruowanie ex
Długość boku 1:
x
Długość boku 3:
x x
x
x x
Długość boku 5:
x x
x x
x
x x
x x
itp.
Przykładowe dane wyjściowe
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Przykładowa implementacja
Nie musisz obsługiwać nieprawidłowych danych wejściowych.
!
do~
sansy
iY
y
i然
.Odpowiedzi:
Pyth,
28272625 bajtówZestaw testowy.
źródło
~
postaci, ponieważ zasięg jej nie obejmuje. Możesz to naprawić, zmieniając~
kod w dosłowny znak DEL.Rubin, 102 bajty
Array#sample
nie wykonuje powtórzeń próbkowania z zestawu znaków, ale to jest OK, ponieważ rozkład znaków nie musi być idealnie jednolity! Funkcja rekurencyjna zwraca tablicę wierszy.Wypróbuj online!
źródło
Właściwie 62 bajty
Jest to jeden z najdłuższych programów, jakie kiedykolwiek napisałem.
Wypróbuj online!
Wyjaśnienie:
Część 1 : konfigurowanie listy znaków
Wypróbuj online!
Część 2 : konstruowanie tablicy boolowskiej dla X
Wypróbuj online!
Część 3 : wybór losowych postaci
Wypróbuj online!
źródło
Mathematica, 146 bajtów
Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca ciąg jako dane wyjściowe.
źródło
Python 2, 171 bajtów
Gwarantowany wybór losowych postaci z jednakowym prawdopodobieństwem.
Wypróbuj tutaj: link ideone
EDYCJA: Dzięki Morgan Thrapp za poprawki.
źródło
from random import*
oszczędza 2 bajty. Możesz również połączyć pierwsze dwa wierszej
pętli średnikiem, aby zapisać niektóre bajty. (Też wierzęZ
i{
mam większą szansę na wystąpienie niż niektóre inne listy, ale to nie ma znaczenia dla pytania)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 bajtówJest to prosta implementacja, która tworzy kwadrat po znaku. Jeśli znak jest na przekątnej : użyj losowy char, inny : używać spacji. To również używa podstawienia wyrażenia regularnego i losowego int do generowania Yznaków innych niż :
Wyjaśnienie [stary]
Aktualizacja
import*
- Dzięki @KevinLauźródło
randint
jest prawdopodobnie krótszy dla twoich celów, plusfrom random import*
. Usuń także część tej niepotrzebnej białej przestrzeni.[i,33][i in(89,121)]
działa zamiast tego potrzebując długo rozwiniętej trójki w twojejf
funkcji! Sprawdź także, czy możesz usunąć miejsce tuż po twoichprint
wypowiedziachre.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
zapisuje 6 bajtów nad... if ... else ...
konstrukcją.Dyalog APL , 35 bajtów
⎕
monit o numer⍳
1 przez tę samą∘.=⍨
tabelę równości liczb (tj. przekątna ma cyfry 1s)(⊢∨⌽)
LUB jej odbicie lustrzane (daje obie przekątne)95×
pomnożone przez 95?
rand int między 1 a 95 dla przekątnych, rand unosi się między 0 a 1 dla reszty⌊
podłogi pozbyć się(⊢+∊∘57 89)
liczb zmiennoprzecinkowych dodaj jeden do elementów należących do {57,89} (Yy - 32)32+
dodaj 32, aby zerować w spacje, a inne liczby w odpowiednim zakresie⎕UCS
zamień na tekstTryAPL !
źródło
Python 2.7, 205 bajtów:
Wypróbuj online! (Ideone)
źródło
MATL , 28 bajtów
Wypróbuj online!
Wszystkie dozwolone postacie mają takie samo prawdopodobieństwo pojawienia się. Działa również na równomierny wkład.
źródło
C, 154 bajtów (lub 119 bez płyty kotła)
Lub 119 bajtów jako funkcja,
X(h)
o którąsrand(time(0))
zadbano gdzie indziej:Awaria:
źródło
kod maszynowy x86, 70 bajtów
Mój kod wykonywalny, zdemontowany:
Jest to funkcja, która odbiera rozmiar X w ekxie i wskaźnik do bufora wyjściowego w edx.
Wypełnia bufor wyjściowy sekwencyjnie bajtami. Istnieją
2 * n - 1
iteracje (równe liczbie znaków spacji do wydrukowania). Przy każdej iteracji wykonuje następujące czynności:Konwersja liczby losowej na postać losową nie jest niezwykła:
Interesującą częścią jest obliczenie liczby spacji. Musi wygenerować następujące liczby (przykład dla N = 9):
Liczby są pobierane naprzemiennie z dwóch postępów arytmetycznych. Pierwszy idzie w dół z krokiem -2, a drugi idzie w górę z krokiem 1. Gdy pierwszy postęp osiąga -1 (w środku X), pojawia się usterka (-1 jest usuwany), a następnie postępy zmieniają kierunek.
Postępy są przechowywane w rejestrach
ebx
iedx
- wysokie częścibh
idh
przechowują bieżący numer, a niskie częścibl
idl
przechowują krok. Aby przełączać się między progresjami, kod zamienia rejestry naxchg
.Gdy progresja osiąga wartość -1 (wokół
mylab
etykiety), zwiększa oba rejestry, przełączając kroki z-2, 1
na-1, 2
. Zmienia to także role rejestrów, a zatem zamienia wysokie części rejestrów.Na końcu funkcji przechowuje bajt zerowy wskazujący koniec łańcucha.
źródło
Lua, 277 bajtów
Cóż ... Lua jest bardzo dobry w manipulowaniu ciągami: D. Pierwszy raz musiałem użyć
local
w oświadczeniu! Mógłbym zaoszczędzić trochę bajtów używając Lua 5.1 zamiast 5.3, ponieważ przenieśli funkcję globalnąunpack
do obiektutable
w Lua 5.2. Ale wolę trzymać się najnowszej wersji, którą mam :).Definiuje funkcję, która powinna zostać wywołana z jednym parametrem (drugi służy do rekurencji) i zwraca ciąg.
Bez golfa
źródło
JavaScript (ES6),
137131125 bajtówGdzie
\n
reprezentuje dosłowny znak nowej linii. Edycja: Zapisano 1 bajt, przesuwając' '
wnętrzeString.fromCharCode
wyrażenia. Zaoszczędziłem 5 bajtów, powodując, że generowanie losowych postaci nie było jednolite; wyrażenier+72&95
jest zerowe dla wartości, które są odwzorowane naY
i,y
a!
zamiast nich jest generowane. Zaoszczędziłem 4 bajty, kiedy zdałem sobie sprawę, że rozprzestrzenianie sięString.fromCharCode
unika koniecznościjoin
. Zaoszczędzono 2 bajty, kradnąc lewę z @ edc65.źródło
PowerShell v2 +, 112 bajtów
Odczytuje dane wejściowe z linii poleceń.
Dla każdego wiersza tworzona jest tablica spacji, poprawne indeksy wypełniane znakami pobranymi z funkcji
f
, a następnie tablica char jest łączona, aby uzyskać wynik jako jeden wiersz.źródło
[char]
obsadę na zewnątrzRandom
, i zmieniając-join
ją w jednoargumentowy operator ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
odpowiednikiem lambda programu PowerShell i użyć wywołania operatora&
. Poniżej 103 bajty -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, przesuwając[char]
obsady być[char[]]
odlewane na$a
(zamiana' '
na32
w procesie), a przeniesienie$z
definicji „s do parens pierwszy raz to się nazywa. Do 99 (woo! Sub-100!) -Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
$a
definicję do parens przy pierwszym użyciu. Teraz do 98 -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
myślę, że się tu zatrzymam ;-) heheMATLAB, 86 bajtów
Kilka przykładów:
źródło
changem
! Świetne imię!Pip , 33 bajty
32 bajty kodu, +1 dla
-l
flagi. O dziwo, kod zaczyna sięY
i kończy nay
...Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!
Wyjaśnienie
Konstruuje siatkę o odpowiednim rozmiarze; zastępuje elementy na przekątnych losową postacią inną niż y, a wszystkie inne elementy spacją.
źródło
php, 135 bajtów
Dość proste podejście wykorzystuje str_pad do utworzenia ciągu spacji o wymaganej długości, zastępuje niezbędne znaki losowymi, a następnie zastępuje dowolne Y (bez rozróżniania wielkości liter) Xs i echa linii.
Generuje powiadomienia 2n + 3, ale jak zwykle w porządku.
źródło
Emacs Lisp, 269 bajtów
Nieogrodzony i nieznacznie zmodyfikowany:
źródło
JavaScript (ES6), 128
131Edytuj 3 bajty zapisane thx @Neil
Tak nieporęczne, prawdopodobnie nie najlepsze podejście. Bonus - działa z nieparzystym lub parzystym wejściem.
źródło
r+7&31
daje taki sam wynik jak(r&31)-25
.C, 268 bajtów
Zadzwoń
f()
z rozmiaremx
do losowania.źródło
srand
swoje funkcje, nie mogą one polegać na stanie globalnym. Możesz jednak uzyskać znacznie krótszy program dzięki dwóm zagnieżdżonym pętlom i użyciu znaku backspace. Ogólne rozwiązanie może wyglądać jak ten , ale myślę, że windows specyficzną odmianę korzystającclock
byłoby ważne.gcc version 4.8.1
systemach Windows igcc version 5.3.0
Cygwin nie działa ... (w IdeOne Works)Matricks , 79 bajtów (niekonkurujące)
Matricks wyróżnia się jako początek tworzenia wartości x i wszystkich wartości losowych, ale klapy, jeśli chodzi o warunki warunkowe ...
Oznacziłem to jako niekonkurujące, ponieważ musiałem naprawić kilka błędów i uruchomić wszystkie nowe funkcje po opublikowaniu tego wyzwania.
Biegnij z
python matricks.py x.txt [[]] <input> --asciiprint
Wyjaśnienie:
Obsługuje to również liczby parzyste.
źródło
Python 2,
204191183 bajtówDobra, konkurencja w Pythonie staje się coraz bardziej zacięta. Oto moja próba zgolenia jak największej liczby bajtów.
Teraz utknąłem(Ok, utknąłem ponownie).Kredyty dla @NonlinearFruit za sposób wybierania losowych postaci.
Wersja 183 bajtów:
Wypróbuj online! (Ideone)
Główną zmianą jest przepisanie warunkowe
tak jak
co oszczędza 7 bajtów.
Wersja 191 bajtów:
Wypróbuj online! (Ideone)
Głównymi zmianami są sposób wybierania losowych znaków i zmiany układu kodu, takie jak
s=input();i=s;
stawanie sięs=i=input();
, usuwanier=range
przypisania, ponieważ nie jest już potrzebne iabs
bezpośrednie wywoływanie, ponieważ powoduje to mniej bajtów kodu.Pokonanie poprzedniej najkrótszej odpowiedzi w Pythonie o 1 bajt!@R. Podejście Kapa służy do generowania losowych postaci. Każda iteracja pętli while drukuje rząd ex.Wersja 204 bajtów :
Wypróbuj online! (Ideone)
Wersja bez golfa, aby dowiedzieć się, jak to działa:
Ciężko było poradzić sobie z przypadkiem 1-znakowym!
źródło
SmileBASIC, 97 bajtów
Zamiast obliczać liczbę spacji między każdą postacią lub czymś, postanowiłem po prostu wydrukować we wszystkich miejscach, gdzie
X==Y
lubX+Y==Size+1
.Generator losowych postaci dodaje tylko 1, jeśli generuje
y
lubY
,z
iZ
są nieco bardziej powszechne niż zwykle.źródło
PHP, 100 bajtów
pobiera dane wejściowe z argumentu wiersza poleceń; biegać z
-nr
.Pętla łączona drukuje znaki w zależności od pozycji
awaria
źródło