Berechnen Sie ohne Verwendung von Zeichenfolgen (außer bei Bedarf, z. B. bei Eingabe oder Ausgabe) die n-te Ziffer einer Ganzzahl von links (in Basis 10).
Die Eingabe erfolgt in folgendem Format:
726433 5
Die Ausgabe sollte sein:
3
da dies die fünfte Ziffer von "726433" ist.
Eingabe wird nicht enthält führenden Nullen, z. B. "00223".
Testfälle / weitere Beispiele:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
Das ist Code Golf; Die geringste Anzahl von Zeichen gewinnt, aber alle eingebauten Funktionen wie "nthDigit (x, n)" sind nicht akzeptabel .
Hier ist ein Pseudocode, mit dem Sie beginnen können:
x = number
n = index of the digit
digits = floor[log10[x]] + 1
dropRight = floor[x / 10^(digits - n)]
dropLeft = (dropRight / 10 - floor[dropRight / 10]) * 10
nthDigit = dropLeft
Wie Sie sehen, ist es etwas unfair, wenn ich eine Frage stelle, bevor ich überhaupt eine beantworte. Ich würde gerne sehen, welche Art von Antworten dadurch generiert werden. :)
Bearbeiten : Ich hatte auf mathematische Antworten gehofft, daher kann ich Antworten, die auf der Konvertierung von Zeichenfolgen in Arrays oder dem Zugriff auf Zahlen als Ziffernliste beruhen, nicht wirklich akzeptieren.
Wir haben einen Sieger
Geschrieben in "dc", 12 Bytes. Von DigitalTrauma .
Antworten:
Gleichstrom , 12 Bytes
Dies ist eine mathematische Antwort. So funktioniert das:
?
Eingangsnummer lesen und zum Stapeln drückend
Doppelte Oberseite des StapelsZ
Lässt den Wert vom Stapel fallen, berechnet und gibt die Anzahl der Stellen aus?
Ziffernindex lesen und zum Stapeln drücken-
subtrahieren Sie den Ziffernindex von der ZiffernanzahlA
Drücke 10 auf den Stapelr
Tauschen Sie die obersten 2 Werte auf dem Stapel aus^
Exponentiate 10 ^ (Ziffernanzahl - Ziffernindex)/
Teilen Sie die Zahl durch das Ergebnis der PotenzierungA
Drücke 10 auf den Stapel%
Berechnen Sie die Zahl mod 10, um die letzte Ziffer zu erhalten, und drücken Sie auf die oberste Position des Stapelsp
Pop und drucken Sie die Oberseite des StapelsIn Aktion:
quelle
base conversion -> arrays
.GolfScript (10 Bytes)
Dies setzt voraus, dass die Eingabe als Zeichenfolge erfolgt (z. B. über stdin). Wenn es sich um zwei Ganzzahlen auf dem Stapel handelt, sollte die Initiale
~
entfernt werden, um 1 Zeichen zu sparen.Wenn die Basisumwandlung als Verstoß gegen die Regel für integrierte Funktionen eingestuft wird, habe ich eine 16-Zeichen-Alternative:
quelle
CJam - 7
CJam ist eine neue Sprache, die ich entwickle, ähnlich wie GolfScript - http://sf.net/p/cjam . Hier ist die Erklärung:
l
Liest eine Zeile von der Eingabe,~
wertet sie die Zeichenfolge aus (wodurch die beiden Zahlen ermittelt werden),(
dekrementiert die zweite Zahl,\
tauscht die Zahlen aus,A
ist eine Variable, die vorinitialisiert ist, und führt eine Basisumwandlung durchb
, wobei ein Array mit den Basis-10-Ziffern der ersten Zahl erstellt wird=
die gewünschte erhält Element des ArraysDas Programm ist im Grunde eine Übersetzung von Peter Taylors Lösung.
quelle
Haskell 60 Bytes und lesbar
Keine Saiten!
quelle
J -
1524 charEine ausreichend "mathematische Antwort".
Gleiche Ergebnisse wie unten, jedoch mit der mystischen Eigenschaft, mathematisch zu sein.
Die Kurzversion mit Base-10-Erweiterung.
Wir stellen eine 0 voran, um die 1-basierte Indizierung anzupassen.
Verwendung:
quelle
Python 127
quelle
def f(i,n): ... return d
if n>k: return -1
Fall nicht zu überprüfen .C 50
Dies verwendet Arrays.
Ignorieren Sie einfach alle Warnungen.
Und ja, in C sind Strings wirklich nur Arrays, das ist also ziemlich billig.
Mathematischer:
C 83
quelle
bc (getrieben von bash),
4129Ich denke, dies ist die erste Antwort, die dies mathematisch und nicht mit Zeichenfolgen ausführt:
Die Verwendung von
length()
scheint vielleicht etwas fad zu sein, aber in der Manpage von bc geht es um die Anzahl der Ziffern und nicht um die Länge der Zeichenfolge:Ausgabe:
quelle
Mathematica -
2423Dieser ist irgendwie offensichtlich :)
Beispiel:
Ausgabe:
Sie können es kürzer machen, indem Sie zwei ganze Zahlen hartcodieren, z
aber dann musst du erst schreiben
n = 726433; m = 5;
. Der Funktionsaufruf fühlte sich einem Programm ähnlicher an.quelle
1
.C 145
Das Programm findet den Abstand vom Ende der ganzen Zahl und dividiert, bis der Index erreicht ist, und verwendet dann Modul 10, um die letzte Ziffer zu erhalten.
quelle
i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}
.Wolfram Alpha - zwischen 40 und 43
Natürlich kann ich diesen
IntegerDigits
Trick, der nicht untergeht, vollkommen verteidigenAber weil meine vorherige Antwort immer noch ein bisschen schummeln wollte, ist hier eine Alternative. Leider ist es etwas länger, aber ich habe nicht mehr gekürzt als ich.
Zählen auf ähnliche Weise wie zuvor (mit dem kaufmännischen Und, ohne Argumente zu übergeben),
hat 43 Zeichen. Durch Negieren des Exponenten und Mischen der Terme kann ich einen arithmetischen Operator verlieren (
10^(...)x
wird als Multiplikation interpretiert).Ich habe Mathematica nicht zum Testen zur Hand, ich bezweifle, dass es so sein wird.Wie ich vermutet habe (und wie freundlicherweise von kukac67 bestätigt wurde ), wird dies in Mathematica nicht akzeptiert, aber es läuft in WolframAlpha .Ich bin im Zweifel über die Verwendung von
RealDigits
, weil ich mich darauf beschränkt habe,IntegerDigits
diese Antwort zu verwenden, und sie sind ziemlich ähnlich. Wenn ich es mir jedoch erlaube, es einzuschließen (schließlich werden die ganzen Zahlen nicht direkt zurückgegeben, wie viele es auch gibt), kann ich zwei weitere Zeichen durchtrennen:quelle
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
Zeichen, auch wenn sie codiert sind. Ich werde es durch einen URL-Shortener ziehen. {edit2} Anscheinend hat W.Alpha einen - den Link geändert.Tcl (42 Bytes, Lambda):
(49 Bytes, Funktion):
(83 Bytes, wenn wir Eingaben von der Shell akzeptieren müssen):
quelle
R (60)
Behebung des Problems mit log10 zur Berechnung der Stellenzahl. Der Sonderfall x == 0 kostet 13 Zeichen, seufz.
Ungolfed:
Verwendung
quelle
Scala (
13399 Bytes):Funktioniert für alle positiven Eingänge. Dividiert durch 10 zur Potenz der von rechts gesuchten Ziffer und nimmt dann modulo 10.
Vielen Dank, dass Sie den Fehler in der vorherigen Formel bemerkt haben. Dieser ist kürzer.
quelle
Haskell, 142
Ich bin nicht sicher, ob ich die Frage richtig verstanden habe, aber ich denke, Sie wollten Folgendes: stdin (string) lesen, die beiden Zahlen int (nicht string) machen, einige algorithmische Dinge tun und dann das Ergebnis (string) ausgeben. Ich habe es in 142 Zeichen gepackt, was viel zu viel ist:
Beispielverwendung:
quelle
JavaScript - 84
Rein mathematisch, keine Saiten, keine von ihnen. Übernimmt die erste Nummer in der ersten Eingabeaufforderung und die zweite Nummer in der zweiten Eingabeaufforderung.
Testfall :
Ungolfed Code:
quelle
Perl,
38, 36keine 30 Zeichen(ohne Zeilenvorschub)
Das ist wohl ein Betrug aufgrund des Befehlsschalters, aber danke, dass ich spielen durfte :-)
bearbeiten :
Konnte 2 Zeichen entfernen:
... dann noch 6:
Wie
Wir teilen die Eingabe des ersten Arguments in das Skript
$ARGV[0]
nach Zeichen (split//
) auf, um ein Array mit Index Null zu erstellen. Wenn Sie$ARGV[1]
dem Skript ein Argument zum zweiten Argument hinzufügen, entspricht dies dem Element an dieser Position in der Zeichenfolge oder im ersten Argument. Wir halten dann den Ausdruck in()
einer Liste mit einem Element, diesay
durchlaufen wird. Für die kürzere Kurzversion verwenden wir nurshift
das erste Argument und den verbleibenden Teil von @ARGV für den Index - einmal bearbeitet,shift
bleibt uns nur das zweite Argument übrigpop()
subtrahieren es und 1.Soll das eine Matheübung sein? Ich habe gerade gemerkt, dass ich einen von der Eingabe gelesenen String indiziere, also ... ich vermute, ich verliere? Markieren Sie mich, wenn ich auf einem parallelen Golfplatz Sinn habe, und ich werde es - mathematisch gesehen - in einer separaten Antwort erneut versuchen.
Prost,
quelle
PHP, 58
Nur mit Mathe
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
quelle
echo$n%10
.~ - ~! -
9493Biegt die Regeln ein bisschen - es ist eine Funktion, die n als Eingabe verwendet und davon ausgeht, dass die zu findende Ziffer n in
'''''
- und ~ - ~ gespeichert ist ! unterstützt keine floats.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
führt in zu''''''
sein~~
(2) ( '' ''‘= 128).quelle
:)
Python 2.7 (89 Byte)
Ich transformiere die ganze Zahl in ein "Polynom", indem ich eine Liste von Ziffern verwende. Ich weiß, dass Sie sagen, dass Sie das nicht akzeptieren können, aber ich verstehe nicht, warum nicht, da das mathematische Konzept der Darstellung von Zahlen als Polynome ihrer Basen verwendet wird. Es wird nur fehlschlagen, wenn die übergebene Ganzzahl ist
0
, aber Sie sagten, keine aufgefüllten Nullen;)Ausführen als
test.py
:Ich nehme an, Sie wollten eine Shell-Eingabe und ich konnte nicht ausnutzen, dass es sich bei der Eingabe um Zeichenfolgen handelt. Beim Überspringen der Shell-Eingabe sind es nur 43 Byte.
Obwohl ich unnötige Iterationen verwende, spare ich einige Bytes, indem ich kein zusätzliches Dekrement hinzufüge
n
.quelle
Erweitertes BrainFuck : 49
Verwendung:
Außer dem Multiplikationsoperator (z. B.
10+ => ++++++++++
) verwende ich derzeit keine besonderen Funktionen von EBF . Ansonsten ist es meistens reines BrainFuckWie es funktioniert:
Schema (R6RS): 100 (ohne unnötiges Leerzeichen)
quelle
awk - 53
Ungolfed:
quelle
Scala (83)
Verwendet keine Scala-Sonderfunktionen. Eher die Standardlösung.
Ungolfed:
quelle
C 94
C, 91, ungültig, da Arrays verwendet werden.
quelle
Julia 37
Aufgrund des eingebauten Operators. Die Arithmetik mit beliebiger Genauigkeit ermöglicht eine beliebige Größe int.
Stichprobe
quelle
Perl (etwas matheiger / nicht sehr golfig) - 99 Zeichen
Führen Sie es aus als:
quelle
Perl6 - 85 Zeichen
quelle
Smalltalk, 44
Obwohl DC unschlagbar ist, ist hier eine Smalltalk-Lösung:
Argumente, n Zahl; d Ziffer-Nr. zum Extrahieren:
quelle