Prosty dzisiaj. Napisz najkrótszy program, który rysuje „alfabet piłokształtny”, podając dodatnią liczbę całkowitą dla wysokości. Musisz wpisać nazwę swojego języka programowania, gdy dojdziesz do litery, od której się zaczyna.
Na przykład, jeśli Twoim językiem jest Python, a dane wejściowe to 1
dane wyjściowe powinny być:
ABCDEFGHIJKLMNOPythonQRSTUVWXYZ
Jeśli wejście jest 2
wyjściem powinno być:
B D F H J L N Python R T V X Z
A C E G I K M O Q S U W Y
Jeśli wejście jest 4
wyjściem powinno być:
D J Python V
C E I K O Q U W
B F H L N R T X Z
A G M S Y
Notatki
A
zawsze zaczyna się w lewym dolnym rogu.- Dane wejściowe mogą być przesyłane przez standardowe wejście lub wywołanie funkcji lub podobnie. Wyjście na standardowe wyjście.
- Powyższe dane wejściowe
26
nie muszą działać. - Brak spacji końcowych.
Odpowiedzi:
jeśli n ma wysokość:
Kody ucieczki C +: 81
C: 110
źródło
cc
daje błąd „<bebe.c: 1: 17: error: 'n' undeclared (pierwsze użycie w tej funkcji)”.n
jest to zmienna globalna ustawiona na wybraną przez ciebie liczbę (jak wcześniej pytał Martin).C 134
Kompiluje na gcc z kilkoma ostrzeżeniami. Nowe linie nie są uwzględniane w liczbie znaków.
122 znaki, jeśli dane wejściowe są już zapisane
n
.Dzięki user2992539 , tolos i edc65 za ulepszenia.
źródło
puts("")
zamiastprintf("\n")
.p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);
zamiastif((c-...
n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
TI-BASIC - 148 bajtów (nieprzetworzony tekst), 186 bajtów (grafika)
W odpowiedzi na OP, wspaniały TI-83 (i nowsze) ma rozmiar 16 x 8 (tylko używając standardowego dużego tekstu) lub rozmiar 94 x 62 pikseli (który z małym tekstem jest wart około 10 linii ).
To jest mały problem (do którego chciałbym wyjaśnienia). Interpretator nie może zignorować impozycji wielkości; innymi słowy, gdybyśmy próbowali ustawić wysokość piły na 20, dałoby to błąd uniemożliwiający pełne wykonanie kodu. I może napisać kod, który w nieskończonym środowiska, tworzenia prawidłowego wyjścia, oprócz tego, że nie będzie działać na maszynie.
Mówiąc to, przedstawiam wam (uruchomione) wersje programów. Wszystkie zależą od ustawienia zmiennej
N
w żądanej wysokości w liniach przed uruchomieniem:Podejście surowego tekstu
W celu dokonania tej pracy niezależnie od terminalu, zmiany
For(C,1,16
doFor(C,1,33
i zdjąć górną sprawdzanie zakresu (R<2 or
). Oto wynik z5→N
:Podejście graficzne (może to również wymagać
AxisOff
przejrzystości)Ten działa OK, z dwoma drobnymi dziwactwami. Wysokość nadal stanowi problem, chociaż szerokość nie. Nie rozstawiałem jednak liter, więc w niektórych przypadkach (gdy list zaczyna się podnosić lub opadać z piły), litery mogą zostać odcięte przez ich następców. Aby działał niezależnie od terminala, usuń górną granicę check (
R<7 or
). Następnie następuje wykres:źródło
0→F
możesz zrobić,Delvar F
który oszczędza 1 bajt po tokenizacji. Ponadto jestem pewien, że możesz uwzględnić czynnik wyjściowy / tekst pod koniec dzięki wbudowanemu warunkowi testu logicznego dla współrzędnej, a dlaC+7→C
napisać go w krótkim, jeśli (nie wtedy / jeszcze / koniec)Pure Bash (bez coreutils), 181 bajtów
Wynik:
Rurociągi w
cat -E
celu udowodnienia, że nie ma końcowych linii.źródło
JavaScript (ES6) 231
244Edytuj poprawkę, trochę zmiany kolejności i inny sposób zarządzania wysokością == 1
Ponadto zmieniono na funkcję, ponieważ jest to dozwolone przez OP, więc nie pytaj () o dane wejściowe
Brak zmian w ogólnym algorytmie, który prawdopodobnie NIE jest najlepszy do tego wyzwania
Wyjaśniono
Przykłady
1
3 idzie w górę
4 na górze
7 spada
źródło
JAVA (393)
Jak zawsze świetny język do gry w golfa:
źródło
java.util.Arrays;
. :-(String x="ABC...Z";
i zamieńfor(char c...
nagłówek pętli nafor (char c=65;++c<91;){
, Uwielbiam znaki w Javie =)c=='J'
zc==74
oszczędza kolejne dwa bajty w sumie.public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}
@Quincunx: koniec potrzeby import.util.Arrays; =)Ruby, 112 bajtów
Oczekuje, że dane wejściowe zostaną zapisane
h
.Daj mi znać, jeśli wymaga to wyjaśnienia.
źródło
%
.puts o...
z$><<o...
.J: 75 bajtów
Korzystając ze wspaniałej koniunkcji Amend . Jak zwykle IO jest brzydkie i niezgrabne, nie wchodząc w szczegóły. Podstawowe rozwiązanie wymaga 3 gerunds (rodzaj czasownika rzeczownikowego (aka. Funkcja)):
c) generowanie macierzy w celu poprawek
x (a
b
c}) ya) to dość trywialne wyszukiwanie w tabeli ascii
c) jest jeszcze bardziej trywialny
b) jest interesujący. Morale jest takie, że wskaźniki poziome powinny zaczynać się od zera do y-1 i wracać w dół, powtarzając to 26 razy. Na przykład. dla y == 4:
Wdrożenie tego daje b):
I o tak, przydatny fakt: J ma na imię ... „J”.
źródło
3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'
brzydkiego. W tym rozwiązaniu brzydkie jest 8 znaków o specjalnej wysokości 1, ale prawdopodobnie można to nieco skrócić.R (204)
Wynik
źródło
for
oświadczeń (for(i in 1:x)cat(...
na przykład) lub otaczających%in%
.JavaScript -
248224235Oto link do jsfiddle, gdzie możesz go przetestować.
edycja: Utworzono dziennik konsoli dla czcionki o stałej szerokości i usunięto przecinki, jeśli input == 1.
źródło
|0
lub~~
. 2: krótsze jest budowanie tablicy w bezpośrednio, bezsplit
.for(w=[],v=0;v<z;v++)w[v]="\n";
(i==9?" ":" ")
ciebie możesz użyć(i^9?" ":" ")
, który ratuje postać.Perl 119
Ten program pobiera dane wejściowe
STDIN
i drukuje wynikSTDOUT
.I bonus - wersja niezgodna z regułami, ponieważ drukuje końcowe spacje, ale dodaje pewne interakcje:
... i niektóre testy poniżej:
źródło
J,
67 5761 znakówUżyj jako funkcji:
Objaśnienie: w tym rozwiązaniu zastosowano inne podejście niż w innym rozwiązaniu J. Zamiast generować falę piłokształtną 0 1 2 3 2 1 0 1 ... spojrzałem na odstępy między kolejnymi literami. Na przykład, dla n = 4, jeśli się od A do góry, owinąć w drugiej kolumnie i zasięgu B, to znajdują się cztery odstępy pomiędzy A i B. Ten wzór odstępy między literami jest bardzo regularne: dla n = 4 wzór to 4 4 4 2 2 2 4 4 4 ... .
Chodzi więc o to, aby najpierw zbudować spłaszczoną (i transponowaną) tablicę, a następnie przekształcić ją i odwrócić, aby wyglądała poprawnie. Procedura wyjściowa jest prosta (przynajmniej jako J): dtb to „usuń końcowe spacje” i
"1
mówi „operuj na każdej linii”. dtb i echo są dostarczane przez standardową bibliotekę.Podziękowania dla Zsbána Ambrusa za pomoc w grze w golfa.
źródło
MetaPost (207)
Możesz spróbować tutaj.
źródło
Bash (213)
(223)Drobne poprawki, a my spadamy do 213.
Pierwotny miał drobny błąd. Testowany i potwierdzony do pracy w wersji bash 4.2.37.
Dzięki @manatwork za wskazanie błędu i kilka wskazówek.
źródło
;
aby uczynić go nieco bardziej czytelnym? Nie wpłynie to na twój wynik golfowyHaskell - 432 bajtów (niestety ...)
Okazało się to o wiele trudniejsze, niż się spodziewałem, aby osiągnąć czysto, stąd też liczba dużych bajtów. Jestem pewien, że mógłbym (lub ktoś) poradzić sobie lepiej, ale spędziłem na tym zbyt wiele czasu. Wersja do gry w golfa jest następująca:
Aby uruchomić, załaduj kod
ghci
i wykonaj,putStr $ s Int
gdzieInt
jest pożądana wysokość. Możesz także dodaćpod
import
s w pliku tekstowym, skompiluj goghc
i podaj wysokość jako argument wiersza poleceń. Wersja bez golfa:źródło
const
zpure
(za pomocą aplikacyjnych instancji do funkcji), aby zaoszczędzić kilka bajtów.C # / LINQ:
Krótkie wyjaśnienie:
Enumerable.Range(0, N).Select(...)
powoduje generowanie ciągu dla każdej linii, która ostatecznie jest łączona w pojedynczy ciąg zString.Join(Environment.NewLine, ...)
. Dla każdego wiersza, w którym przewijamy wszystkie 26 znakówEnumerable.Range(0, 26).Select(...)
, test na początku wyrażenia lambda określa, czy wygenerować znak, czy spację, podczas gdyi==2
sprawdza „C” i konwertuje go na „C #” lub na dwie spacje w zależności od linii . WString.Concat(...)
przekształca otrzymanyIEnumerable<char>
dla każdej linii w ciągu przed przekazaniem goTrimEnd(...)
do czysto znieść każdej spacji spływu.źródło
PHP
(216)(205)Nowa wersja:
Stara wersja:
oczekuje, że zmienna $ i będzie wysokością.
źródło
C,
214169 bajtów, bez spacji końcowychDziękuję @ edc65 i @tolos za ich pomocne sugestie.
źródło
scanf
iprintf
) otrzymywały prototypy, w przeciwnym razie otrzymasz niezdefiniowane zachowanie.#include <stdio.h>
jest oczywiście najkrótszym sposobem na przekazanie prototypu zarówno do, jakscanf
i doprintf
.int
deklarację dla głównego, jeśli nic nie zwracasz. Może spaść dodatkowych nawiasów, wymienić' '
z32
orazif(!C)m=c
z oświadczeniem ternarny, a jak tylko dowiedział (powyżej) zastąpićprintf("\n")
zputs("")
do 18 znaków:n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}
JavaScript (
204 185150)EDYTOWAĆ
Zapisano 13 bajtów, nie budując tablicy i .join („\ n”). Wymagane przerzucanie pętli for. Następnie, z pomocą syna kodującego C, kod był zbyt sprytny, aby zapisać kolejne 12 bajtów.
Oto czytelna wersja pokazująca zmianę logiki.
Gra w golfa (161):
Gra w golfa i zaciemniony (149):
źródło
.substr(a,1)
=>[a]
h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
K, 60 bajtów
Całkiem proste i wygląda na to, że właśnie usunąłem rozwiązanie J. :)
Najpierw wygeneruj alfabet:
I fala piłokształtna o odpowiedniej długości:
Wypełnij każdą literę alfabetu wiodącymi spacjami:
Zapnij alfabet i kwadratową falę razem i obróć każdy wiersz:
A transpozycja tego jest naszą odpowiedzią:
Wypróbuj tutaj w OK .
źródło
C:142139 znakówOkropnie długo, spodziewam się, że będę mógł go trochę skrócić:Nieco bardziej czytelny:
Edycja: Brakowało mi reguły „brak spacji końcowych”, ale wrócę.
źródło
Scala, 246 bajtów
sformatowany i skomentował:
Wyniki:
źródło
Python - 137
Dane do zapisania w Iieg
i=8
źródło
Rakieta
Oto czysta funkcjonalna wersja: sugestie, aby ją skrócić witamy.
Wynik
źródło