Wyzwanie
Niedawno dostałem się do komputerów 8-bitowych i jestem zafascynowany ich działaniem i innymi; dlatego celem tego kodu golfowego jest odtworzenie części Monitora Woz, zaprojektowanego przez Steve'a Woźniaka dla Apple I.
Masz przechowywać tablicę 22 wartości szesnastkowych o szerokości dwóch bajtów (minimalna wartość 10 USD , maksymalna wartość $ FF ), a następnie weź n- ilość danych wejściowych. (Zwykle dwa; języki takie jak Brainfuck mogą mieć trudności).
Dane wejściowe będą odnosić się do miejsca w tablicy, od którego ma się rozpocząć drukowanie, i gdzie się zatrzymać; wejście o zdefiniowanym zachowaniu będzie miało wartość początkową mniejszą lub równą wartości końcowej. Twój program musi wtedy być w stanie wydrukować każdą wartość szesnastkową między wprowadzonymi wartościami szesnastkowymi włącznie .
Przykład tego:
Array
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15
Values
FF F4 B6 D7 40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6 A5
input first num:
04
input second num:
14
40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6
Interesującą częścią tego ćwiczenia jest to, że możesz użyć wszystkiego, co chcesz, sprawdzić granice danych wejściowych użytkowników. Dane wejściowe od osoby hello
i twój program ma niezdefiniowane zachowanie? Odchodzi bez uprzedzenia? Oba są ważne.
Jedyne zasady to:
1. Musisz włączyć wartości 22 wartości szesnastkowych jako część programu przed jego uruchomieniem (nie możesz poprosić użytkownika o dane wejściowe).
2. Dane wyjściowe wartości szesnastkowych muszą mieć dokładny format:
00 FF 00 FF 00
spacje końcowe, tabulatory lub linie są w porządku. Znaki nie są.
3. Program nie musi pytać o dane wejściowe z komunikatem. Pozostaw „wiadomość” pustą, jeśli chcesz. Użytkownik musi jednak wprowadzić ograniczenia szesnastkowe.
4. Ponieważ w przypadku wartości 22 wartości szesnastkowych decyzję należy podjąć, należy stworzyć program, który faktycznie pobiera wartości z pamięci, a nie naśladuje program, po prostu drukując wartości. (np. lista 00 $ ).
5 n-ilość danych wejściowych, odnosi się do ilości danych wejściowych wymaganych dla wybranego języka do rozpoznania szesnastkowej o szerokości dwóch bajtów. na przykład. (Brainfuck wymaga dwóch danych wejściowych na heks, co daje cztery dla obu).
Jeśli potrzebujesz wyjaśnienia, możesz je komentować.
To jest kod golfowy, więc zwycięzcą jest najkrótsza odpowiedź w liczbie bajtów.
Tabela liderów
Oto tabela liderów generująca fragment dzięki uprzejmości Martina Endera .
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/95080/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
n
ponieważ ponieważ Brainfuck nie może pobrać ciągu 2 znaków, należy wprowadzić pierwszy bajt, a następnie drugi dla pierwszej wartości, a następnie zrobić to ponownie dla drugiej wartości, łącznie 4 dane wejściowe. Może być ich tyle, ile chcesz.Odpowiedzi:
Galaretka ,
2421 bajtówWybrane wartości:
[00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]
TryItOnline
Jeśli drugie wejście jest mniejsze niż pierwsze, wyświetla odwróconą sekwencję.
Zachowanie poza zakresem jest niezdefiniowane (np. „Foo”, „14” zwraca 38 wartości, z których większość nie jest nawet w tablicy, a wiele z nich nie ma długości 2)
W jaki sposób?
źródło
1F
), co oznacza, że nie musiałem „poprawnie” interpretować danych szesnastkowych lub dodawać 16, aby otrzymać dwie cyfry szesnastkowe do konwersji.JavaScript (ES6),
1181151121028281 bajtówZaoszczędzono 1 bajt dzięki produktom ETH
Wybrane wartości:
0x04
/0x0f
).0x00
(wartość minimalna).0x15
(wartość maksymalna).Poprzednia wersja (97 bajtów)
Generowanie pseudolosowej listy „prawdziwych” wartości szesnastkowych:
Sekwencja:
źródło
[a,b]=prompt().split(' ')
w wierszu poleceń. W każdym razie moja zaktualizowana odpowiedź powinna to naprawić.JavaScript (ES6),
107 152137 bajtówPokaż fragment kodu
Wybrane wartości:
Wejścia:
0x14
InternalError: too much recursion
NaN
poza limitem.Poprzednie rozwiązania:
152 bajty:
107 bajtów, nieprawidłowe rozwiązanie (brak danych wejściowych):
źródło
console.log(...)
. ;)var
i ostatnie;
nie są częścią odpowiedzi. To tylko fragment kodu, dlatego dodałem podział linii. Zmienię odpowiedź.Python,
888786 bajtówZapis
1 bajt dzięki @JonathanAllan Zapis 1 bajt ponownie w @JonathanAllan
Zmieniłem także podstawę kodu, teraz znacznie ładniej.
Wybrane wartości:
00
do wszystkiego.Ten sam pomysł jak moja odpowiedź C. Tym razem jednak kod pobiera od użytkownika pojedyncze dane wejściowe, wymagając odstępu między obiema wartościami, dzieląc je, rzutując je na wartości szesnastkowe i drukując każdy hex w
l
tablicy, w tym i pomiędzy dwiema wprowadzonymi wartościami. Ponieważ Python ma wspaniały system wychwytywania błędów, nie występuje przepełnienie bufora, a zatem kod jest znacznie bezpieczniejszy. Program jest zabezpieczony przed niezdefiniowanym zachowaniem w takim sensie, że nie zostanie uruchomiony, gdy wyższa wartość zostanie przesłana przed niższą wartością.Powinno to działać zarówno w Pythonie 2.x, jak i 3.x; Popraw mnie, jeśli się mylę, ponieważ nie mam dostępu do obu tłumaczy, ponieważ mój system nie obsługuje ich obu.
źródło
C ++,
989593 bajtówMoje wybrane wartości to 0
źródło
04
i06
odzyskałem tylko dwie wartości. Podejrzewam, że są to wartości05
i06
. Musisz podać wszystkie wartości pomiędzy wprowadzonymi wartościami włącznie .Perl,
794541 bajtów„minimalna wartość 10 $” - przykład ma minimum 00 $ - czy to literówka?
Oto dość nudna odpowiedź perla w 41 bajtach (miał 46 lat, a potem wciąż widziałem spacje, pareny, które mogłem wymknąć). Pobiera dane wejściowe w dwóch wierszach.
Dane są listą 04..1A
Wcześniej byłem zbyt sprytny przy pakowaniu i rozpakowywaniu. Jego bajty wejściowe są wprowadzane jednocześnie zetknięte razem, np. „020E” wydrukuje wpisy 2-14
Mogę spróbować zagrać w golfa bardziej, używając wszystkich zer
substr
, iprintf'%*vX'
... nie, to sprawia, że moja odpowiedź jest dłuższa. 48 znaków (używając ciągu znaków ascii '7', hex 37 jako danych)źródło
CJam, 22 bajty
Wybrane wartości:
Wypróbuj online
źródło
Scala, 45 bajtów
Nie golfowany:
Zastosowania
00
doFF
jak wartości, ale działa do 2147483647.źródło
error: ')' expected but string literal found.
oa.to(b).map(
C,
176175161 bajtówOszczędzaj 1 bajt dzięki @JonathanAllan
Ogromna pomoc dzięki @Downvoter za uratowanie mnie 14 bajtów!
Wypróbuj online!
Wybrane wartości:
00
do wszystkiego.Odpowiedź bez gry w golfa:
Sztuczka polega na tym, że pobiera dwa dane wejściowe i próbuje przekonwertować je na ciągi szesnastkowe, a następnie rzutować na liczby całkowite. Ponieważ nie ma sprawdzania błędów ani nic podobnego, niezdefiniowanym zachowaniem jest po prostu rzucanie błędów i łamanie programu. Użytkownik musi wprowadzić dwa dane wejściowe, ale wydaje mi się, że mój kompilator Eclipse CDT pozwala mi je wprowadzać w tym samym wierszu ze spacją między nimi.
Muszą być w odpowiedniej kolejności, ponieważ żądanie większej wartości, zanim mniejsza wartość w ogóle nie uruchomi
while
pętli.Chodzi o to, że nie ma również ochrony przed przepełnieniem bufora, więc mogę po prostu zażądać czegoś absurdalnego, takiego jak zakres od 0 $ do $ FFFF, a wszystko w pamięci komputera dostanę od początku przydzielania pamięci dla
a[44]
tablicy , aż do 65536 wartości później.źródło
%x
bezpośrednio?char s[2]
zamiast tegomalloc
? Odlewymalloc
wartość powinna zwrotnego nie jest konieczne, C i tak.printf("%d%d ", ...)
części, zastępując formatowanie, po prostu%x
zwraca tylko0
zamiast zamiast00
i nie rozdziela ich.scanf
.GNU sed, 209 + 1 (flaga r) = 210 bajtów
Wypróbuj online! Jedna wyjściowa przestrzeń jest obecna na wyjściu, mam nadzieję, że jest dozwolona.
Uruchom przykłady:
Objaśnienie: 22 zapisane wartości szesnastkowe są takie same jak te z przykładu PO
Indeksy początkowe i końcowe są odczytywane w osobnych wierszach. Dane wyjściowe to pojedynczy wiersz z wartościami tabeli w tym zakresie indeksu (włącznie). Niezdefiniowane wejście spowoduje zapisanie wielu wierszy nieprawidłowego wyjścia.
źródło
PHP,
106 105 10496 + 2 bajtylub
Uruchom z
php -nr '<code>' <lowindex> <highindex>
; unikaj pojedynczych cudzysłowów w kodzie.... lub przetestuj online .
dechex
interpretuje dane wejściowe jako ciągi szesnastkowe, o ile znaki są cyframi szesnastkowymi,0
jeśli dane wejściowe zaczynają się od czegoś innego.nie drukuje nic, jeśli pierwsza wartość jest większa niż druga.
wybrane wartości:
(pierwsze 22 kody ascii wykonanego kodu)
lub
z tymi wartościami:
źródło
<?php
fragment?-r
. A jeśli muszę zapisać go w pliku, używam krótkiego otwartego tagu<?
.a
,z
iProgramingPuzles_CGolf
są niezdefiniowane. Skąd toProgramingPuzles_CGolf
się wzięło? : /stderr
na adres,/dev/null
jeśli ich nie lubisz. PHP ocenia niezdefiniowane stałe ciągów.Zestaw Apple II 6502, 75 bajtów
Kod bajtowy:
Demontaż:
Tworzy tablicę w pamięci, która wygląda jak wynik. Wybrane wartości to:
Użytkownik naciska cztery klawisze, aby ustawić wejścia.
źródło