10
\$\begingroup\$

Challenge

You have one string of input bytes, output the last byte in it.

Rules

Your submission may be a program or function outputting the last byte in the input which

  • is either a string, stdin or command-line arguments, and
  • is non-empty.

I was trying to solve this with brainfuck, however all languages are allowed to participate. This is .

Examples

"?" -> "?"
"29845812674" -> "4"
\$\endgroup\$
  • 4
    \$\begingroup\$ Welcome, I changed your question to fit our format more properly (note this is what the sandbox is for, usually). However in its current state the challenge is very easy (also in bf), so not sure about that. \$\endgroup\$ – ბიმო Mar 17 at 19:11
  • 10
    \$\begingroup\$ I vote against closing; it may be trivial, but that doesn't make it offtopic \$\endgroup\$ – MilkyWay90 Mar 17 at 22:30
  • 1
    \$\begingroup\$ @MillyWay I think most of the close votes were before the extensive edit by ბიმო \$\endgroup\$ – Sanchises Mar 18 at 6:47
  • 9
    \$\begingroup\$ @ბიმო We have a consensus not to edit off-topic questions to make them on-topic which I think would have applied here. \$\endgroup\$ – Laikoni Mar 18 at 7:19
  • 2
    \$\begingroup\$ What kind of string? Is it guaranteed to be ASCII only? Or should we handle UTF-8 (and how?) for example? \$\endgroup\$ – FireCubez Mar 18 at 18:28

56 Answers 56

3
\$\begingroup\$

Java 8

Input from STDIN, 71 bytes

v->{int i=0;for(;System.in.available()>0;i=System.in.read());return i;}

Try it online!

Function Argument, 25 bytes

s->s.charAt(s.length()-1)
\$\endgroup\$
7
\$\begingroup\$

Brainf***, 7 bytes

,[>,]<.
\$\endgroup\$
  • \$\begingroup\$ ideone.com/XoJLD0 It still doesn't work ;( \$\endgroup\$ – jean Mar 17 at 20:35
  • \$\begingroup\$ @jean Try it here. (Honestly, I didn't even know ideone did BF). \$\endgroup\$ – SuperJedi224 Mar 17 at 20:38
  • \$\begingroup\$ Yes, in your link everything works fine. But online judge for this problem uses ideone where it doesn't work ;( \$\endgroup\$ – jean Mar 17 at 20:45
  • \$\begingroup\$ @jean ideone seems to use -1 as the EOF. +[>,+]<-. should work \$\endgroup\$ – Jo King Mar 17 at 21:21
  • \$\begingroup\$ @Jo King Sorry, but the input looks like: 29845812674[enter][EOF] how can I print the last digit? \$\endgroup\$ – jean Mar 17 at 21:59
3
\$\begingroup\$

Python 3, 14 bytes

lambda x:x[-1]

Try it online!

\$\endgroup\$
  • \$\begingroup\$ I feel dumb, how are you calling this without declaring it to a variable? \$\endgroup\$ – Nathan Dimmer Mar 22 at 14:12
  • \$\begingroup\$ I looked at your TIO, but it doesn’t make much sense... What are you doing in your header? \$\endgroup\$ – Nathan Dimmer Mar 22 at 14:14
  • \$\begingroup\$ @Bobawob For your first question, anonymous lambdas are allowed for answers (I call it using by assigning the lambda to the variable e in the header). For your second question, the header is e=\ , which basically means e=lambda x:x[-1] \$\endgroup\$ – MilkyWay90 Mar 22 at 20:14
  • \$\begingroup\$ Note that in my above comment, there is not supposed to be a trailing space in e=\ but Markdown escapes the code character so I have to add a trailing space \$\endgroup\$ – MilkyWay90 Mar 22 at 20:16
  • \$\begingroup\$ That’s really cool! Thank you! \$\endgroup\$ – Nathan Dimmer Mar 27 at 14:03
4
\$\begingroup\$

Javascript, 14 bytes

a=>a.slice(-1)
\$\endgroup\$
4
\$\begingroup\$

Haskell, 9 4 bytes

last

Try it online!

\$\endgroup\$
  • \$\begingroup\$ Why bother with pure? Isn't last enough? \$\endgroup\$ – dfeuer Mar 19 at 7:22
  • \$\begingroup\$ I assumed that the output must be a string too, but you're right, OP is only talking about "bytes". \$\endgroup\$ – flawr Mar 19 at 8:41
3
\$\begingroup\$

Befunge-93, 12 15 bytes

:1+_p1-,@>~#

Try it online!

Thanks to @Jo King for golfing off 3 bytes.

Alternate 15 byte version that is less messy:

~:1+#v!_
  @,$<

Taking strings as input in Befunge isn't the easiest. If there were a single command to take in multiple characters, it would be as simple as reading the string, popping/printing the top character, and exiting.

\$\endgroup\$
  • \$\begingroup\$ Actually, $$ instead of p1 should work without the warning for the same amount of bytes \$\endgroup\$ – Jo King Mar 18 at 0:46
2
\$\begingroup\$

PowerShell, 11 bytes

"$args"[-1]

Try it online!

\$\endgroup\$
3
\$\begingroup\$

Jelly, 1 byte

Try it online!

Not the most difficult challenge in Jelly...

Note this accepts the input as a string; if the input could be interpreted otherwise (e.g. a number, a list), then it the argument will need to be quoted (e.g. "123456" or "[123,197]"). Alternatively this can be seen as a link that takes a byte array and returns the last member of that array, in accordance with PPCG standard rules.

Thanks to @MilkyWay90 and @ბიმო for pointing this out.

\$\endgroup\$
  • \$\begingroup\$ -1 Fails for any number (tio.run/##y0rNyan8///hzlX///83MTY1NjE1MQYA) \$\endgroup\$ – MilkyWay90 Mar 17 at 22:01
  • \$\begingroup\$ @MilkyWay90: Doesn't need to be a full program, probably this will work as a Jelly function taking a string. But then again I don't know Jelly, so I might be wrong. \$\endgroup\$ – ბიმო Mar 17 at 22:16
  • \$\begingroup\$ Okay, I'll try seeing whether or not it will work as a link \$\endgroup\$ – MilkyWay90 Mar 17 at 22:16
  • \$\begingroup\$ @ბიმო Seems to work (OP can you edit the answer so I can undo my downvote?) \$\endgroup\$ – MilkyWay90 Mar 17 at 22:17
  • \$\begingroup\$ You can just define the T as a link and make it input a string, removing the need for "" in your input. \$\endgroup\$ – MilkyWay90 Mar 18 at 23:00
4
\$\begingroup\$

TI-BASIC (TI-84), 10 bytes

sub(Ans,length(Ans),1

Gets the last character in the input string.
Input is in Ans.
Output is in Ans and is automatically printed out.

\$\endgroup\$
1
\$\begingroup\$

Wolfram Language (Mathematica), 16 bytes

#~StringTake~-1&

Try it online!

\$\endgroup\$
7
\$\begingroup\$

MATL, 2 bytes

0)

MATL uses 1-based modular indexing so this solution grabs the element in the 0-th position of the input which is the same as the last since the 0 wraps around to the end.

Try it out at MATL Online

Explanation

    % Implicitly grab the input
0   % Push the literal 0 to the stack
)   % Use this zero to grab the character at the end of the string
    % Implicitly display the result
\$\endgroup\$
  • \$\begingroup\$ I'd have gone for J)... \$\endgroup\$ – Sanchises Mar 18 at 6:48
3
\$\begingroup\$

><>, 2 bytes

Using command line args

o;

Try it online!

><>, 11 bytes

Using stdin

\~o;
/?(0:i

Try it online!

\$\endgroup\$
1
\$\begingroup\$

SmileBASIC, 16 bytes

INPUT S$?POP(S$)
\$\endgroup\$
2
\$\begingroup\$

05AB1E, 1 byte

¤

Try it online!

θ or ` would also work.

\$\endgroup\$
3
\$\begingroup\$

Cubix, 6 bytes

pA/@po

Try it online!

  p
A / @ p
  o

Watch it run

  • A Takes all the input
  • / Redirect around the cube
  • pp bring bottom of the stack to the top twice
  • o/@ output as character, redirect and halt
\$\endgroup\$
7
\$\begingroup\$

x86 Machine Code, 2 bytes

As @CodyGray correctly points out, taking input as a string and output to a register removes the bulk of the standalone program version.

Input string is in SI, length in CX and output character is in AL:

F3 AC  REPZ LODSB      ; start at memory location pointer in SI, put next value in AL,
                       ; loop CX number of times. The last char will be in AL when done.

Or 4 bytes as a "Pascal string" (length is prepended to beginning of string):

AC     LODSB           ; first byte is string length
91     XCHG AX, CX     ; move length to CX for loop 
F3 AC  REPZ LODSB      ; start at memory location pointer in SI, put next value in AL,
                       ; loop CX number of times. The last char will be in AL when done.

Or 5 bytes as a "C string" (zero/null terminated), input in DI:

F2 AE     REPNZ SCASB     ; scan for value in AL (0), end when found and advance DI
8A 45 FE  MOV AL, [DI-2]  ; DI is now two bytes ahead of last, put value of DI-2 into AL

IBM PC DOS, 8088 Assembly, 12 11 bytes

Or as complete program as IBM PC DOS executable. Input is from command line, output is to console.

D1 EE   SHR  SI, 1      ; SI to DOS PSP at 80H (SI is 0100H at runtime) 
AC      LODSB           ; load command line length in AL 
91      XCHG AX, CX     ; move length to CX for loop 
F3/ AC  REPZ LODSB      ; load next char into AL, repeat until CX = 0 
B4 0E   MOV  AH, 0EH    ; PC BIOS write to screen function 
CD 10   INT  10H        ; display 
C3      RET             ; exit to DOS

Output:

enter image description here

Download LAST.COM DOS executable (11 bytes)

\$\endgroup\$
  • \$\begingroup\$ Although this certainly gets style points, from a strict golfing point of view, it's worth noting that you are allowed to write functions that return the result in a register. So, this can get a lot shorter. You can trivially eliminate 4 bytes, and a rewrite could shrink it down even further. By the way, is that screenshot from an emulator? Which one? \$\endgroup\$ – Cody Gray Mar 19 at 4:31
  • \$\begingroup\$ @CodyGray, oh absolutely, the code to take input from command line and output to console is nearly all of it. Yeah, I could say "input string in SI, length in CX output char is in AL" and then I think the only code that would be necessary is REPZ LODSB (2 bytes) and we'd be done. Of course this approach wouldn't be how you do it if you were coding for efficiency, not size. Your point is very well taken though, I'll post it also as a function that does the meat of the work. \$\endgroup\$ – gwaugh Mar 19 at 15:04
1
\$\begingroup\$

Bash, 13 bytes

echo ${1: -1}

string is passed as argument.

Try it online !

\$\endgroup\$
4
\$\begingroup\$

Bash + coreutils, 8 bytes

tail -c1

Input is from stdin, output is to stdout.

\$\endgroup\$
2
\$\begingroup\$

Turing Machine But Way Worse, 391 bytes

1 0 1 1 0 0 0
0 0 0 1 1 0 0
1 1 1 1 0 0 0
0 1 0 1 2 0 0
1 2 1 1 0 0 0
0 2 0 1 3 0 0
1 3 1 1 0 0 0
0 3 0 1 4 0 0
1 4 1 1 0 0 0
0 4 0 1 5 0 0
1 5 1 1 0 0 0
0 5 0 1 6 0 0
1 6 1 1 0 0 0
0 6 0 1 7 0 0
1 7 1 1 0 0 0
0 7 0 1 8 0 0
1 8 1 1 0 0 0
0 8 0 0 9 0 0
0 9 0 0 a 0 0
0 a 0 0 b 0 0
0 b 0 0 c 0 0
0 c 0 0 d 0 0
0 d 0 0 e 0 0
0 e 0 0 f 0 0
0 f 0 0 h 0 0
0 h 0 0 g 0 0
0 g 0 0 0 1 1
1 g 1 0 0 1 1

Try it online!

EXPLANATION

Detect eight zero bits (which will occur at the end of the input, since TMBWW uses an infinite tape of bits.)
1 1 1 1 0 0 0
0 1 0 1 2 0 0
1 2 1 1 0 0 0
0 2 0 1 3 0 0
1 3 1 1 0 0 0
0 3 0 1 4 0 0
1 4 1 1 0 0 0
0 4 0 1 5 0 0
1 5 1 1 0 0 0
0 5 0 1 6 0 0
1 6 1 1 0 0 0
0 6 0 1 7 0 0
1 7 1 1 0 0 0
0 7 0 1 8 0 0
1 8 1 1 0 0 0
0 8 0 0 9 0 0

-------------

When eight 0 bits are detected, move back to the final byte of the input and print it out while halting the program.
0 9 0 0 a 0 0
0 a 0 0 b 0 0
0 b 0 0 c 0 0
0 c 0 0 d 0 0
0 d 0 0 e 0 0
0 e 0 0 f 0 0
0 f 0 0 h 0 0
0 h 0 0 g 0 0
0 g 0 0 0 1 1
1 g 1 0 0 1 1
\$\endgroup\$
2
\$\begingroup\$

Python 3, 11 18 34 Bytes

import sys;print(sys.argv[-1][-1])

Usage via running the program as a python script on the command line. Input is provided as the last argument to the program.

Try it online!

\$\endgroup\$
  • \$\begingroup\$ This does not print anything or return anything from a function - snippets are not allowed, only functions or full programs. \$\endgroup\$ – Stephen Mar 18 at 0:08
  • \$\begingroup\$ Ah I see, didn’t think about that when I though of the answer. Only thought about running it in the interpreter. \$\endgroup\$ – Mrwerdo Mar 18 at 0:24
  • \$\begingroup\$ This won't handle a newline in the input \$\endgroup\$ – Jo King Mar 18 at 0:40
  • 1
    \$\begingroup\$ 14 \$\endgroup\$ – ASCII-only Mar 18 at 0:44
  • 1
    \$\begingroup\$ How about this? \$\endgroup\$ – Mrwerdo Mar 18 at 0:51
3
\$\begingroup\$

PHP, 13 bytes

<?=$argn[-1];

Try it online!

Run with php -nF input is STDIN. Example:

$ echo 29845812674|php -nF lost.php
\$\endgroup\$
1
\$\begingroup\$

C# (.NET Core), 81 bytes, command-line input

class M{static void Main(string[] a){System.Console.Write(a[0][a[0].Length-1]);}}

Try it online!

If you run this from an actual command line, you will need to wrap your string in quotes if it contains spaces.

\$\endgroup\$
1
\$\begingroup\$

C# (.NET Core), 115 bytes, console input

using C=System.Console;class M{static void Main(string[] a){int c=0,d;while((d=C.Read())>-1)c=d;C.Write((char)c);}}

Try it online!

This feels kinda janky, but it does work. Interestingly, I can't save any bytes with a for loop as the code stands.

\$\endgroup\$
1
\$\begingroup\$

Perl 6, 11 bytes

*.comb[*-1]

Try it online!

Anonymous Whatever lambda that takes a string, splits it into characters, and returns the last one.

\$\endgroup\$
1
\$\begingroup\$

Batch, 24 bytes

@set s=%1
@echo %s:~-1%

Takes input as a command-line argument. Note that arguments can't include special characters or spaces, but you can fake arguments with spaces in this case by preceding it with a ", which results in a single argument that begins with ", however there is no easy solution for arguments that include special characters. Batch can't easily read "all of stdin". To read up to but not including the first newline itself would however be a byte shorter:

@set/ps=
@echo %s:~-1%

Edit: A version that handles arbitrary characters in a (quoted) argument for 92 bytes:

@set s="%~1"
@set "s=%s:~-2,1%
@if "%s%"=="" (echo ^")else for %%s in ("%s%")do @echo %%~s

Explanation: The first line makes a copy of the argument in a variable and ensures that it is quoted. The second argument then takes the second last character (because the quote is now the last character). However, if that was also a quote then this results in an empty variable, so we need to special-case that and output a (quoted) quote. Otherwise, we still need to quote the character in case it is a special character as echoing "%s%" will echo the quotes and echoing %s% will actually interpret special characters, so the variable needs to be quoted to allow it to be parsed but then immediately unquoted so it can be printed. This is achieved using the for command. 86 bytes to read up to but not including the first newline from stdin while supporting special characters:

@set/ps=
@set "s=%s:~-1%
@if "%s%"=="" (echo ^")else for %%s in ("%s%")do @echo %%~s
\$\endgroup\$
1
\$\begingroup\$

C# (Visual C# Interactive Compiler), 11 bytes

x=>x.Last()

Try it online!

\$\endgroup\$
  • \$\begingroup\$ you can use a function :P \$\endgroup\$ – ASCII-only Mar 18 at 0:47
  • \$\begingroup\$ OK - Ill update my answer :) \$\endgroup\$ – dana Mar 18 at 1:21
  • 1
    \$\begingroup\$ uhm why is testcase in STDIN not footer \$\endgroup\$ – ASCII-only Mar 18 at 1:38
  • \$\begingroup\$ Wow - It's been a while. Thanks for pointing that out ;) \$\endgroup\$ – dana Mar 18 at 1:39
  • 1
    \$\begingroup\$ That's not how I understand it. I understand that it should print the last non-empty character. We need to ask OP. \$\endgroup\$ – Ven Mar 18 at 17:33
1
\$\begingroup\$

Turing Machine Code, 72 42 bytes

Assumes an input with no empty cells (spaces). Thanks to ASCII-only for saving 30 bytes.

0 * * r 1
1 * * l 2
1 _ _ l halt
2 * _ r 0

Old version in 72 bytes:

0 * * r 0
0 _ * l 1
1 * * l 2
2 * _ l 2
2 _ _ r 3
3 _ _ r 3
3 * * * halt

Try it online.

\$\endgroup\$
  • 1
    \$\begingroup\$ 0 * * r 1/1 * * l 2/1 _ _ l halt/2 * _ r 0? \$\endgroup\$ – ASCII-only Mar 18 at 0:22
  • \$\begingroup\$ oi pls reply :|| \$\endgroup\$ – ASCII-only Mar 18 at 0:35
  • \$\begingroup\$ wouldn't work in what way? I've tested it online \$\endgroup\$ – ASCII-only Mar 18 at 1:46
  • \$\begingroup\$ @ASCII-only It turns out you're correct, and I was simply misinterpreting the way your program actually worked. I think it's different enough that you can post it as a different answer if you want to. \$\endgroup\$ – SuperJedi224 Mar 18 at 2:42
  • \$\begingroup\$ Well, this is a simple challenge, don't think it needs more than one answer in any language :P \$\endgroup\$ – ASCII-only Mar 18 at 3:22
8
\$\begingroup\$

Attache, 4 bytes

Last

Try it online! (If the input could be a list of characters, &/S could work.)

Alternatives

5 bytes: `@&-1

8 bytes: &/S@List

10 bytes: `@«_,-1»

10 bytes: Fold!Right

10 bytes: `@<~_,-1~>

10 bytes: `^^&:Right

10 bytes: {Right^^_}

11 bytes: Get«_,-1»

11 bytes: Get<~_,-1~>

12 bytes: `@«_,#_-1»

12 bytes: `@<~_,#_-1~>

13 bytes: Get«_,#_-1»

13 bytes: Get<~_,#_-1~>

\$\endgroup\$
  • 4
    \$\begingroup\$ :| wtf so many alternatives \$\endgroup\$ – ASCII-only Mar 18 at 0:19
  • 1
    \$\begingroup\$ @ASCII-only Least I could do on a simple challenge like this :p \$\endgroup\$ – Conor O'Brien Mar 18 at 0:41
  • \$\begingroup\$ Print Last inputted byte. The programs contents fit with the challenge \$\endgroup\$ – MilkyWay90 Mar 19 at 23:53
1
\$\begingroup\$

Scratch 3.0, scratchblocks3 syntax

As a function, 61 bytes

define l
ask[]and wait
say(letter(length of(answer))of(answer

As a full program, 68 bytes

when gf clicked
ask[]and wait
say(letter(length of(answer))of(answer

Try both online

\$\endgroup\$
1
\$\begingroup\$

Befunge-98, 5 bytes

~2j@,

Try it online!

Explanation:

~           Take input
 2j         Skip next two instructions
~           Repeat until EOF, where it reflects
   @,       Print the last character and exit
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.