Utwórz program, który drukuje wszystkie liczby całkowite między interwałami (a, b)
i zastępuje wielokrotności 8 w sekwencji losowymi (równomiernie rozmieszczonymi, niezależnymi od innych znaków), nienumerycznymi, niebiałymi znakami drukowalnymi ASCII.
Załóżmy 0 <a <b we wszystkich przypadkach.
Jeśli liczba ma więcej niż 1 cyfrę, upewnij się, że liczba znaków w zastępstwie jest zgodna!
Przykłady:
(1, 16) -> 1 2 3 4 5 6 7 $ 9 10 11 12 13 14 15 n@
(115, 123) -> 115, 116, 117, 118, 119, :F<, 121, 122, 123
(1, 3) -> 1 2 3
Nie-przykłady:
(1, 16) -> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
(115, 123) -> 115 116 117 118 119 $ 121 122 123
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!
Aktualny zwycięzca:
Pyke (21 bajtów) przez błotniaka
Najbardziej popularny:
Odpowiedzi:
Pyke,
2221 bajtówWypróbuj tutaj!
Bierze wkład w postaci:
higher
,lower
źródło
Python 2, 126 bajtów
Wypróbuj online!
Ogromne podziękowania dla Flp.Tkc i EasterlyIrk za całą ich pomoc!
źródło
b/a
zamiasta<=b
i nie potrzebujesz;
na końcu. Równieżimport random,string
oszczędza kilka bajtów. tio.run/nexus/…Python 2 , 119 bajtów
Wypróbuj online!
źródło
zsh,
10098 bajtówDwa argumenty wejściowe są przekazywane jako argumenty wiersza poleceń, a liczby są wyprowadzane w osobnych wierszach.
źródło
Mathematica, 96 bajtów
Wyjaśnienie
Dla danych wejściowych
m
in
:Generować
{m, m + 1, m + 2, ... , n}
Dla wszystkich liczb, które można podzielić przez 8 (zadzwoń
a
), zastosuj tę zasadę zastępowania:Uzyskaj listę wszystkich drukowalnych znaków ASCII, z wyjątkiem cyfr.
Pseudolosowo wybieraj
Floor[Log10[a] + 1]
znaki z listy, umożliwiając duplikaty.Dołącz do postaci.
źródło
FromCharacterCode
(r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
R, 73 bajty
Odczytuje dane wejściowe ze standardowego wejścia i zastępuje liczby podzielne przez
8
równomiernie wybraną próbkę znaków ascii w zakresie32...47, 58...126
. Aby narysować losową próbkę, potrzebujemy wektora znaków, niestetyintToUtf8()
zwraca on jeden ciąg, a nie wektor, więc musimy również wektoryzować go w całym zakresie za pomocąsapply
.źródło
Python 2, 126 bajtów
(nie chodzi tylko o Dennisa)
Widząc, że dużo pracy nad odpowiedzią Heather, pomyślałem, że opublikuję również własne rozwiązania.
Jest to funkcja, która pobiera dwa argumenty i drukuje bezpośrednio do
STDOUT
.127 bajtów
Jest to anonimowa funkcja anonimowa - do użycia, przypisania do zmiennej (np.
f
), A następnie wywołania za pomocąf(a, b)
. Zwraca to wynik jako listę.źródło
Pip , 28 bajtów
Pobiera liczby jako argumenty wiersza poleceń i wyświetla listę wyników oddzieloną od nowej linii. Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (ES6), 114 bytes
Those darn built-ins with 23-byte names....
źródło
MATL, 26 bytes
Try it online!
Explanation
źródło
Pyth, 24 bytes
Try it online!
Explanation:
źródło
Bash + apg,
64, 76 bytesEDITS:
Golfed
Test
źródło
crazy8 8 8
would yieldPerl 6, 60 bytes
Explanation:
{ map { }, $^a .. $^b }
: A lambda that takes two arguments, generates the list of integers in that range, and returns it with the following transformation applied to each element:$_ % 8 ?? $_ !!
: If the element is not divisible by 8, pass it on unchanged. Otherwise...S:g/./{ }/
: ...replace each character of its string representation with the value generated by this expression:grep(/\D/, "!" .. "~").pick
: Generate the range of characters between!
and~
(in Unicode order), filter out digits, and randomly pick one of the remaining characters.źródło
PHP, 163 bytes
Explanation:
$n = range(48,57)
These are the ASCII codes for numbers, which are in the middle of special characters (32-47) and other characters (58-126).$c = array_diff(range(32,126), $n)
Using the$n
array, exclude numeric characters and build an array of acceptable ASCII characters.foreach(range($a,$b) as $v)
Loop over the range of values from$a
to$b
(inclusive), as $v inside the loop.if($v % 8 != 0) { echo $v; }
Test for $v being evenly divisible by 8 using the mod operator%
.else { for($i = 0; $i < strlen($v); $i++) { ... }}
If not evenly divisible by 8, loop enough times for the number of digits in the number and print the characters (in the next step).echo chr($c[array_rand($c)])
Print a single character from the acceptable array of ASCII values in$c
.array_rand
returns an index in the array, so we have to get the actual value at that index using$c[random_key]
.I could probably make this smaller by creating
$c
differently, and the loop to print the ASCII characters feels clunky so I'll continue to ponder how to shorten that.źródło
postgresql9.6 251 chars
very long code but postgresql also does it.
formatted sql is here:
źródło
Perl, 66 bytes
Run with
-E
flag:This is pretty straight forward:
-
<>..<>
creates a list of the numbers between the 2 inputs number. And thenmap
iterates over it:-
$_%8||...
: the...
are executed only if$_
is a multiple of 8.-
s%.%xxx%ge
: replace every character withxxx
.-
do{$_=chr rand 126}until/[!-\/:-~]/
pick a random character (from codes 0 to 126) until we get one that satisfies/[!-\/:-~]/
, ie. one that is printable and is not a digit.-
say
: print it.źródło
C (gcc),
129119 bytesTry it online!
129 → 119 Use the
%94+33
trick from O.O.BalanceUngolfed:
źródło
puts
instead ofprintf
).C,
157115 bytesTry it online here. Thanks to jxh for golfing 42 bytes.
Ungolfed version:
źródło
Java 10,
149147 bytes (lambda function)Try it online.
Java 10,
227225 bytes (full program)Try it online.
Explanation:
źródło
t<33|(t>47&t<59)|t>126;
is for above it. It basically generated a random number in the range[0,127)
, then checks if it's valid (so in the range[33..47,59..126]
, all printable non-digit ASCII characters). If it is: good, append it. If not: generate a random number in the range[0,127)
again and validate it again until we've found a valid character.APL (Dyalog Extended), 32 bytes
Try it online!
Huge thanks to Adám and dzaima for their help. First time using Dyalog Extended!
Explanation:
źródło
Scala, 198 bytes
An improved functional version with immutable state (03-04-2018)
Try it online!
A functional style solution in Scala (350 bytes) for the fun of it.
Suggestions for improvements are welcomed.
źródło
Python 2, 180 Bytes
EDIT:
Thanks @Flp.Tkc for realising I hadn't read the task properly.
Thanks @Caleb for pointing out I could use a few to reduce the byte count.
Thanks @Dennis for pointing out about the fact that numbers can't be included.
EDIT 2:
The current version could probably be simplified more than it is.
źródło
PowerShell,
8289 bytesTry it online!
źródło
QBIC, 79 bytes
Skipping the numbers is a costly affair, here's a version that might also randomly select
0-9
for 20 bytes less:Sample output for
1, 89
Explanation:
źródło
05AB1E, 17 bytes
Takes the input as
highest\nlowest
, and outputs a list.Try it online or verify all test cases.
Explanation:
źródło
Japt, 20 bytes
Try it
źródło
Forth (gforth), 128 bytes
Try it online!
Explanation
Loop from start to end, print number if not multiple of 8, otherwise get the number of digits in the number and print that many random characters followed by a space
Code Explanation
UnGolfed
I don't usually ungolf my solutions, but this one is long/complicated enough that I think it's needed
źródło
PHP, 130 bytes
Try it online!
Ungolfed:
źródło
$x-= $x > 58 ?: 11; // subtract 11, if x is less than 58
-- could you elaborate?Subtract one from x. If x was less than or equal to 58, subtract a further ten from it.
, no?Kotlin, 136 bytes
Try it online!
źródło